/** * @component QuickViewModal * @purpose Product Quick View modal dialog previewing images, dynamic variant selection, pricing, specs, and Add to Cart action. * @a11y ARIA modal role, escape listener * @dependencies cartStore, catalogService, lucide-react */ 'use client'; import { useState } from 'react'; import Image from 'next/image'; import { X, Star, ShoppingBag, Check, ShieldCheck, Truck } from 'lucide-react'; import { useCartStore } from '@/store/cartStore'; import { formatCurrency, getImageUrl } from '@/lib/utils'; export function QuickViewModal() { const product = useCartStore((state) => state.quickViewProduct); const setQuickViewProduct = useCartStore((state) => state.setQuickViewProduct); const addToCart = useCartStore((state) => state.addToCart); const [selectedVariantIndex, setSelectedVariantIndex] = useState(0); const [added, setAdded] = useState(false); if (!product) return null; const variant = product.variants[selectedVariantIndex] || product.variants[0]; const mainImage = getImageUrl(product.images[0]?.image_url); const price = variant?.price || 0; const comparePrice = variant?.compare_price; const handleAddToCart = () => { addToCart(product, variant, 1); setAdded(true); setTimeout(() => setAdded(false), 2000); }; return (
{/* Backdrop */}
setQuickViewProduct(null)} className="fixed inset-0 bg-black/60 backdrop-blur-xs animate-in fade-in duration-200" /> {/* Modal Dialog Box */}
{/* Left Gallery Image */}
{mainImage ? ( {product.name} ) : (
No Image
)}
{/* Right Product Specifications */}
Quick Preview

{product.name}

{Array.from({ length: 5 }).map((_, i) => ( ))} (42 Reviews)
{formatCurrency(price)} {comparePrice && ( {formatCurrency(comparePrice)} )}

{product.description}

{/* Variant Selector */} {product.variants.length > 1 && (
{product.variants.map((v, idx) => ( ))}
)}
Free Express Shipping 1 Year Warranty
); }