import React from 'react'; import Link from 'next/link'; import { useShopifyCart, addCartLines } from '@/hooks/use-shopify-cart'; import { truncate } from '@/lib/utils'; import { Badge } from '@/components/ui/badge'; interface ProductImage { url: string; altText?: string; } interface ProductPrice { amount: string; currencyCode: string; } interface ProductVariant { id: string; title: string; price: ProductPrice; availableForSale: boolean; } interface Product { id: string; title: string; description?: string; productType?: string; handle: string; images: { edges: Array<{ node: ProductImage; }>; }; priceRange: { minVariantPrice: ProductPrice; }; compareAtPriceRange?: { minVariantPrice: ProductPrice; }; variants: { edges: Array<{ node: ProductVariant; }>; }; } interface ProductCardProps { product: Product; onAddToCart?: (product: Product) => void; } const ProductCard: React.FC = ({ product, onAddToCart }) => { const { cartId, openCart } = useShopifyCart(); const firstImage = product.images.edges[0]?.node; const price = product.priceRange.minVariantPrice; const compareAtPrice = product.compareAtPriceRange?.minVariantPrice; const hasDiscount = compareAtPrice && parseFloat(compareAtPrice.amount) > parseFloat(price.amount); const firstVariant = product.variants.edges[0]?.node; const isAvailable = firstVariant?.availableForSale || false; const formatPrice = (price: ProductPrice) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: price.currencyCode, }).format(parseFloat(price.amount)); }; const handleAddToCart = async (e: React.MouseEvent) => { e.preventDefault(); // Prevent navigation when clicking add to cart e.stopPropagation(); if (!firstVariant || !isAvailable || !cartId) return; try { await addCartLines(cartId, [{ merchandiseId: firstVariant.id, quantity: 1 }]); openCart(); if (onAddToCart) { onAddToCart(product); } } catch (err) { console.error('Failed to add item to cart:', err); } }; return (
{/* Product Image */}
{firstImage ? ( {firstImage.altText ) : (
)} {/* Discount Badge */} {hasDiscount && compareAtPrice && ( {Math.round(((parseFloat(compareAtPrice.amount) - parseFloat(price.amount)) / parseFloat(compareAtPrice.amount)) * 100)}% OFF )}
{/* Product Info */}

{truncate(product.title, 50)}

${parseFloat(price.amount).toFixed(2)}

); }; export default ProductCard;