"use client" import { useState, useMemo } from 'react' import Link from './LocalizedLink' import { getCategoryImage, formatPrice, type Product } from '@homaroma/types' import { useCartStore } from '../store/cartStore' import { resolveCategoryName, resolveLocalized } from '../lib/localization' import { useLang } from '../hooks/useLang' interface Props { product: Product } export default function AddToCartSection({ product }: Props) { const [selectedOptions, setSelectedOptions] = useState(() => { if (product.variants && product.variants.length > 0) { const first = product.variants[0]; return [first.option1 || '', first.option2 || '', first.option3 || '']; } return ['', '', '']; }); const { addToCart, toggleCart } = useCartStore() const lang = useLang() const currentVariant = useMemo(() => { if (!product.variants) return undefined; return product.variants.find(v => { const v1 = v.option1 || ''; const v2 = v.option2 || ''; const v3 = v.option3 || ''; const s1 = selectedOptions[0] || ''; const s2 = selectedOptions[1] || ''; const s3 = selectedOptions[2] || ''; return v1 === s1 && v2 === s2 && v3 === s3; }); }, [product.variants, selectedOptions]); const categoryName = resolveCategoryName(product.category, lang) const productName = resolveLocalized(product.name, lang) || product.brand.name const description = resolveLocalized(product.description, lang) const isOptionAvailable = (optionIndex: number, value: string) => { if (!product.variants) return false; return product.variants.some(v => { const vOpts = [v.option1 || '', v.option2 || '', v.option3 || '']; if (vOpts[optionIndex] !== value) return false; // Check if it matches currently selected options for OTHER indices for (let i = 0; i < (product.options?.length || 0); i++) { if (i === optionIndex) continue; if (vOpts[i] !== (selectedOptions[i] || '')) return false; } return true; }); }; const handleOptionChange = (optIndex: number, val: string) => { setSelectedOptions(prev => { const next = [...prev]; next[optIndex] = val; return next; }); }; const handleAddToCart = () => { if (!currentVariant) return const variantName = [currentVariant.option1, currentVariant.option2, currentVariant.option3].filter(Boolean).join(' / '); addToCart({ productId: product.id, variantId: currentVariant.id, quantity: 1, price: currentVariant.price || product.price || 0, productName, variantSize: variantName || undefined, productImage: product.images?.[0]?.url || product.category.imageUrl || getCategoryImage(categoryName), }) toggleCart(true) } const currentVariantName = currentVariant ? [currentVariant.option1, currentVariant.option2, currentVariant.option3].filter(Boolean).join(' / ') : null; return ( <>
{categoryName && (

{categoryName}

)}

{productName}

Premium Collection

{description &&

{description}

}
{formatPrice(currentVariant?.price ?? product.price)} {currentVariantName && / {currentVariantName}}
{product.options && product.options.length > 0 && (
{product.options.map((option, optIndex) => (

Select {option.name}

{option.values.map(val => { const isSelected = selectedOptions[optIndex] === val; const isAvailable = isOptionAvailable(optIndex, val); return ( ); })}
))}
)}
{categoryName && ( {categoryName} )}
Brand {product.brand.name}
Category {categoryName}
{currentVariantName || 'Total Price'} {formatPrice(currentVariant?.price ?? product.price)}
) }