'use client'; import React, { useState, useEffect } from 'react'; import { useParams } from 'next/navigation'; 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 { 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, ProductVariant }; interface ProductDetailProps { handle?: string; } const ProductDetail: React.FC = ({ handle: handleProp }) => { const params = useParams(); const handle = handleProp || (params?.handle as string); 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 [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); } }; 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) { return (
{/* Image Gallery Skeleton */}
{Array.from({ length: 4 }).map((_, i) => (
))}
{/* Product Info Skeleton */}
); } if (error || !product) { return (

Product Not Found

The product you are looking for does not exist or is no longer available.

); } return (
Home {product.title}
edge.node)} />
); }; export default ProductDetail;