import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { useCart } from '@/contexts/cart-context'; import { formatRupiah } from '@/lib/rupiah'; import { formatWhatsAppPhone } from '@/lib/format'; import type { Product, ProductVariant } from '@/types/homepage'; import { Minus, Plus, ShoppingBag, ShoppingCart, X } from 'lucide-react'; import { useState } from 'react'; import { toast } from 'sonner'; type ProductModalProps = { product: Product | null; onClose: () => void; contactPhone?: string | null; }; const FALLBACK_IMAGE = 'https://images.unsplash.com/photo-1490481651871-ab68de25d43d?w=1000&auto=format&fit=crop&q=80'; function getVariantImage(variant: ProductVariant): string { if (variant.photo_urls && variant.photo_urls.length > 0) { return variant.photo_urls[0]; } return FALLBACK_IMAGE; } function getRetailPrice(variant: ProductVariant): number { const retail = variant.product_prices.find((p) => p.type === 'retail'); return retail?.price ?? 0; } function getWholesalePrice(variant: ProductVariant): number { const wholesale = variant.product_prices.find((p) => p.type === 'wholesale'); return wholesale?.price ?? 0; } export default function ProductModal({ product, onClose, contactPhone }: ProductModalProps) { const [selectedVariant, setSelectedVariant] = useState(null); const [selectedPriceType, setSelectedPriceType] = useState<'retail' | 'wholesale'>('retail'); const [selectedImage, setSelectedImage] = useState(null); const [quantity, setQuantity] = useState(1); const { addItem } = useCart(); if (!product) return null; const variants = product.product_variants; const activeVariant = selectedVariant ?? variants[0]; const variantImages: string[] = activeVariant?.photo_urls?.length ? activeVariant.photo_urls : [FALLBACK_IMAGE]; const currentImage = selectedImage ?? variantImages[0]; const retailPrice = activeVariant ? getRetailPrice(activeVariant) : 0; const wholesalePrice = activeVariant ? getWholesalePrice(activeVariant) : 0; const currentPrice = selectedPriceType === 'retail' ? retailPrice : wholesalePrice; const maxStock = activeVariant?.stock ?? 0; const handleVariantChange = (variant: ProductVariant) => { setSelectedVariant(variant); setSelectedImage(null); setQuantity(1); }; const handleAddToCart = () => { if (!activeVariant) return; addItem({ productId: product.id, productName: product.name, variantId: activeVariant.id, variantName: activeVariant.name, priceType: selectedPriceType, price: currentPrice, imageUrl: getVariantImage(activeVariant), quantity, }); toast.success(`${product.name} ditambahkan ke keranjang`); }; return (
e.stopPropagation()} > {/* Header */}

Detail Produk

{/* Image */}
{product.name}
{variantImages.length > 1 && (
{variantImages.map((url, i) => ( ))}
)}
{/* Details */}
{product.categories.slice(0, 2).map((cat) => ( {cat.name} ))}

{product.name}

{product.description || 'Produk fashion berkualitas dengan desain elegan dan bahan nyaman.'}

{/* Price */}

Harga

Rp {formatRupiah(currentPrice)}

{/* Variant Selection */} {variants.length > 0 && (

Varian

{variants.map((variant) => ( ))}
)} {/* Price Type */}

Jenis Harga

{/* Quantity */}

Jumlah

{quantity}

Stok tersedia: {maxStock}

{/* Total */}
Subtotal Rp {formatRupiah(currentPrice * quantity)}
{/* Actions */}
); }