/** * @component ProductCard * @purpose Renders native iFixKart product with multi-price variants, stock ledger status, quick view modal trigger, wishlist/compare toggles, and Add to Cart. * @param {ProductResponse} product - Product data object * @a11y ARIA labeled buttons, focus visible outline * @dependencies cartStore, catalogService, lucide-react */ 'use client'; import { useState } from 'react'; import Link from 'next/link'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { Star, Eye, Heart, ArrowLeftRight, ShoppingBag, Check } from 'lucide-react'; import { ProductResponse } from '@/services/api/catalogService'; import { useCartStore } from '@/store/cartStore'; import { formatCurrency, getImageUrl } from '@/lib/utils'; import BlurHashImage from '@/components/ui/BlurHashImage'; import { addToCompareAndNavigate } from '@/lib/compare'; interface ProductCardProps { product: ProductResponse; } export function ProductCard({ product }: ProductCardProps) { const [added, setAdded] = useState(false); const addToCart = useCartStore((state) => state.addToCart); const toggleWishlist = useCartStore((state) => state.toggleWishlist); const isInWishlist = useCartStore((state) => state.isInWishlist(product.product_id)); const isInCompare = useCartStore((state) => state.isInCompare(product.product_id)); const setQuickViewProduct = useCartStore((state) => state.setQuickViewProduct); const router = useRouter(); const primaryVariant = product.variants[0]; const primaryImage = getImageUrl(product.images[0]?.image_url); const secondaryImage = getImageUrl(product.images[1]?.image_url) || primaryImage; const price = Number(primaryVariant?.price || 0); const comparePrice = primaryVariant?.compare_price != null ? Number(primaryVariant.compare_price) : null; const available = primaryVariant?.available_stock; const outOfStock = typeof available === 'number' && available <= 0; const handleAddToCart = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!primaryVariant || outOfStock) return; void addToCart(product, primaryVariant, 1); setAdded(true); setTimeout(() => setAdded(false), 2000); }; return (