/** * @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 (
{/* Product Badges (HOT, NEW, SALE) */}
{product.badge && ( {product.badge} )} {comparePrice && comparePrice > price && ( -{Math.round(((comparePrice - price) / comparePrice) * 100)}% )}
{/* Floating Action Overlay Icons (Wishlist, Quick View, Compare) */}
{/* Image Gallery Flip Container */} {/* Product Details Section */}
{/* Star Rating */}
{Array.from({ length: 5 }).map((_, i) => ( ))} ({product.review_count || 12})
{/* Title */} {product.name}
{/* Pricing */}
{formatCurrency(price)} {comparePrice && ( {formatCurrency(comparePrice)} )}
{/* Add to Cart CTA Button */}
); }