'use client' import { useState } from 'react' import { Minus, Plus, ShoppingCart, Trash2, AlertCircle, CheckCircle, Loader2 } from 'lucide-react' import { Button } from '@/components/ui/button' import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetFooter, } from '@/components/ui/sheet' import { Separator } from '@/components/ui/separator' import { useCart } from '@/lib/cart/context' import { Alert, AlertDescription } from '@/components/ui/alert' import Image from 'next/image' interface CartProps { isOpen: boolean onClose: () => void } export function Cart({ isOpen, onClose }: CartProps) { const { items, removeItem, updateQuantity, getTotal, clearCart } = useCart() const [isCheckingOut, setIsCheckingOut] = useState(false) const [checkoutError, setCheckoutError] = useState(null) const [isRemoving, setIsRemoving] = useState(null) const handleCheckout = async () => { if (items.length === 0) return setIsCheckingOut(true) setCheckoutError(null) try { const response = await fetch('/api/stripe/checkout', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ items: items.map((item) => ({ priceId: item.priceId, quantity: item.quantity, })), }), }) const data = await response.json() if (!response.ok) { throw new Error(data.error || 'Failed to create checkout session') } if (data.url) { // Redirect to Stripe Checkout window.location.href = data.url } else { throw new Error('No checkout URL returned from server') } } catch (error) { console.error('Error creating checkout session:', error) const errorMessage = error instanceof Error ? error.message : 'Failed to start checkout. Please try again.' setCheckoutError(errorMessage) // Auto-hide error after 5 seconds setTimeout(() => setCheckoutError(null), 5000) } finally { setIsCheckingOut(false) } } const handleRemoveItem = async (itemId: string) => { setIsRemoving(itemId) try { // Simulate API call delay for better UX await new Promise(resolve => setTimeout(resolve, 300)) removeItem(itemId) } catch (error) { console.error('Error removing item:', error) } finally { setIsRemoving(null) } } return ( Shopping Cart
{items.length} {items.length === 1 ? 'item' : 'items'} in cart
{/* Error Alert */} {checkoutError && (
{checkoutError}
)} {/* Cart Items */}
{items.length === 0 ? (

Your cart is empty

Add some products from our catalog to get started

) : (
{items.map((item) => (
{item.name}

{item.name}

${item.price.toFixed(2)} × {item.quantity}

{item.quantity}
${(item.price * item.quantity).toFixed(2)}
${(item.price).toFixed(2)} each
))}
)}
{/* Footer */} {items.length > 0 && (
Subtotal
${getTotal().toFixed(2)} USD
{items.reduce((total, item) => total + item.quantity, 0)} items
)}
) }