'use client'; import React, { useState, useEffect } from 'react'; import Link from 'next/link'; import { useProduct, type Product } from '@/hooks/use-shopify-products'; import { useShopifyCart } from '@/hooks/use-shopify-cart'; import ProductDetailGallery from './product-detail-gallery'; import ProductDetailInfo from './product-detail-info'; import ProductRecommendations from './product-recommendations'; import { Button } from '@/components/ui/button'; import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'; import { Skeleton } from '@/components/ui/skeleton'; import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, } from '@/components/ui/breadcrumb'; interface ProductVariant { id: string; title: string; price: { amount: string; currencyCode: string; }; availableForSale: boolean; selectedOptions: Array<{ name: string; value: string; }>; image?: { url: string; altText?: string; }; } export type { Product }; interface ProductDetailProps { handle?: string; } const ProductDetail: React.FC = ({ handle: handleProp }) => { const handle = handleProp || ''; const { addItem, openCart } = useShopifyCart(); const { product, loading, error } = useProduct(handle); const [selectedVariant, setSelectedVariant] = useState(null); const [selectedOptions, setSelectedOptions] = useState>({}); const [quantity, setQuantity] = useState(1); const [selectedImageIndex, setSelectedImageIndex] = useState(0); const [addingToCart, setAddingToCart] = useState(false); // Initialize variant when product loads useEffect(() => { if (product) { const firstVariant = product.variants.edges[0]?.node; if (firstVariant) { setSelectedVariant(firstVariant); const initialOptions: Record = {}; firstVariant.selectedOptions.forEach((option: { name: string; value: string }) => { initialOptions[option.name] = option.value; }); setSelectedOptions(initialOptions); } } }, [product]); const handleOptionChange = (optionName: string, value: string) => { const newOptions = { ...selectedOptions, [optionName]: value }; setSelectedOptions(newOptions); // Find matching variant const matchingVariant = product?.variants.edges.find(({ node }) => { return node.selectedOptions.every(option => newOptions[option.name] === option.value ); }); if (matchingVariant) { setSelectedVariant(matchingVariant.node); // Update image if variant has an associated image if (matchingVariant.node.image && product) { const variantImageUrl = matchingVariant.node.image.url; const imageIndex = product.images.edges.findIndex( edge => edge.node.url === variantImageUrl ); if (imageIndex !== -1) { setSelectedImageIndex(imageIndex); } } } }; const handleAddToCart = async () => { if (!selectedVariant || !product) return; try { setAddingToCart(true); await addItem(selectedVariant.id, quantity); openCart(); } catch (err) { console.error('Failed to add item to cart:', err); } finally { setAddingToCart(false); } }; if (loading || !handle || !product) { if (error && handle && !loading) { return (

Product not found

{error}

); } return (
{Array.from({ length: 4 }).map((_, i) => ( ))}
); } return (
Home Shop {product.title}
edge.node)} selectedImageIndex={selectedImageIndex} onImageSelect={setSelectedImageIndex} />
); }; export default ProductDetail;