"use client"; import React from 'react'; import { useShopifyCart } from '@/hooks/use-shopify-cart'; import { truncate } from '../lib/utils'; import { Card, CardContent } from './ui/card'; import { Button } from './ui/button'; 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; 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; onClick?: (product: Product) => void; } const ProductCard: React.FC = ({ product, onAddToCart, onClick }) => { const { addItem, 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 handleAddToCart = async (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); if (!firstVariant || !isAvailable) return; try { await addItem(firstVariant.id, 1); openCart(); if (onAddToCart) { onAddToCart(product); } } catch (error) { console.error('Failed to add item to cart:', error); } }; return ( {/* Product Image */}
{ if (onClick) { onClick(product); } }} > {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, 60)}

{/* Price Section */}
${parseFloat(price.amount).toFixed(2)}
{/* View Details Button */}
); }; export default ProductCard;