"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
)}
) }