"use client"; import { useMemo, useState } from "react"; import type { ApiProduct, ApiVariant } from "@/lib/api"; import { addToCart } from "@/lib/cart"; import { PLACEHOLDER } from "@/lib/data"; import { discountPercent, formatPrice } from "@/lib/format"; import { IconCart } from "./Icons"; import { Media } from "./Media"; type Props = { product: ApiProduct; variants: ApiVariant[]; }; export function ProductView({ product, variants }: Props) { const images = useMemo(() => { const urls = [ product.thumbnailUrl, product.image, product.thumbnail, ...(product.images ?? []).map((item) => item.url), ].filter((url): url is string => Boolean(url)); return [...new Set(urls)]; }, [product]); const [image, setImage] = useState(images[0] || PLACEHOLDER.product); const [variantId, setVariantId] = useState(variants[0]?.id); const [qty, setQty] = useState(1); const [added, setAdded] = useState(false); const name = product.nameFa || product.title; const variant = variants.find((item) => item.id === variantId) ?? variants[0]; const price = variant ? (variant.discountedPrice ?? variant.price ?? 0) : (product.store?.minPrice ?? 0); const oldPrice = variant?.discountedPrice ? (variant.price ?? undefined) : undefined; const stock = variant ? (variant.stockQuantity ?? 0) : product.store?.inStock ? 1 : 0; const unavailable = !price || stock === 0; const off = discountPercent(price, oldPrice); return (
{off > 0 && ( {off}% )}
{images.length > 1 && (
{images.map((src, index) => ( ))}
)}
{product.categoryNameFa &&

{product.categoryNameFa}

}

{name}

{product.title && product.nameFa && (

{product.title}

)} {variants.length > 1 && (

انتخاب تنوع

{variants.map((item) => ( ))}
)}
{unavailable ? ( ناموجود ) : (
{oldPrice ? {formatPrice(oldPrice)} : null} {formatPrice(price)} تومان
)}
{!unavailable && (
{qty.toLocaleString("fa-IR")}
)}
); }