"use client"; import { useEffect, useState, useTransition } from "react"; import Link from "next/link"; import { useRouter, usePathname } from "next/navigation"; import { Minus, Plus } from "lucide-react"; import { addToCart, updateCartItemQuantity, removeCartItem, } from "@/lib/api/cart"; import type { CartItem, ProductListItem } from "@/types/api"; export function ProductGridCard({ product, cartItem, }: { product: ProductListItem; cartItem: CartItem | null; }) { const router = useRouter(); const pathname = usePathname(); const [isPending, startTransition] = useTransition(); const [localItem, setLocalItem] = useState(cartItem); const [error, setError] = useState(null); const quantity = localItem?.quantity ?? 0; const disabled = !product.is_active || product.is_out_of_stock; useEffect(() => { if (!error) return; const timeout = setTimeout(() => setError(null), 3000); return () => clearTimeout(timeout); }, [error]); function handleAdd() { startTransition(async () => { const result = await addToCart(product.uuid, 1); if (result.ok) { setLocalItem(result.data); router.refresh(); } else if (result.status === 401) { router.push(`/login?next=${encodeURIComponent(pathname)}`); } else { setError(result.message); } }); } function handleChange(nextQuantity: number) { if (!localItem) return; startTransition(async () => { if (nextQuantity <= 0) { const result = await removeCartItem(localItem.uuid); if (result.ok) setLocalItem(null); else setError(result.message); } else { const result = await updateCartItemQuantity( localItem.uuid, nextQuantity, ); if (result.ok) setLocalItem(result.data); else setError(result.message); } router.refresh(); }); } return (
{error && (
{error}
)}
{product.image_url && ( // eslint-disable-next-line @next/next/no-img-element {product.name} )}

{product.name}

{product.price.toLocaleString("fa-IR")} تومان

{disabled && ( ناموجود )}
{!disabled && (
{quantity > 0 && ( <> {quantity.toLocaleString("fa-IR")} )}
)}
); }