← back to Wine Finder Next
components/mobile/AffiliateButton.tsx
86 lines
'use client'
import { useState } from 'react';
import { Wine } from '@/lib/types/wine';
import { buildAffiliateUrl } from '@/lib/affiliates/urlBuilder';
import { trackAffiliateClick } from '@/lib/affiliates/tracker';
interface AffiliateButtonProps {
wine: Wine;
partnerId: string;
partnerName: string;
variant?: 'primary' | 'secondary' | 'outline';
fullWidth?: boolean;
showPrice?: boolean;
className?: string;
}
export default function AffiliateButton({
wine,
partnerId,
partnerName,
variant = 'primary',
fullWidth = false,
showPrice = false,
className = ''
}: AffiliateButtonProps) {
const [clicking, setClicking] = useState(false);
const handleClick = async (e: React.MouseEvent) => {
e.preventDefault();
setClicking(true);
const affiliateUrl = buildAffiliateUrl(wine, partnerId);
// Track the click
await trackAffiliateClick(wine, partnerId, affiliateUrl);
// Open in new tab
window.open(affiliateUrl, '_blank', 'noopener,noreferrer');
// Reset state
setTimeout(() => setClicking(false), 1000);
};
const variantClasses = {
primary: 'bg-gradient-to-r from-purple-600 to-pink-600 text-white hover:from-purple-700 hover:to-pink-700 shadow-lg hover:shadow-xl',
secondary: 'bg-gradient-to-r from-blue-500 to-indigo-500 text-white hover:from-blue-600 hover:to-indigo-600',
outline: 'border-2 border-purple-600 text-purple-600 hover:bg-purple-50'
};
return (
<button
onClick={handleClick}
disabled={clicking}
className={`
${fullWidth ? 'w-full' : ''}
${variantClasses[variant]}
py-3 px-6 rounded-lg font-bold text-sm
transition-all duration-300 transform
active:scale-95 disabled:opacity-50
flex items-center justify-center gap-2
min-h-[44px] touch-manipulation
${className}
`}
style={{ WebkitTapHighlightColor: 'transparent' }}
>
{clicking ? (
<>
<div className="animate-spin rounded-full h-4 w-4 border-2 border-white border-t-transparent"></div>
<span>Opening...</span>
</>
) : (
<>
<span>View on {partnerName}</span>
{showPrice && wine.price && (
<span className="bg-white/20 px-2 py-1 rounded">
${wine.price}
</span>
)}
<span>→</span>
</>
)}
</button>
);
}