"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 variant = variants.find((item) => item.id === variantId) ?? variants[0];
const price = variant ? (variant.discountedPrice ?? variant.price) : (product.store?.minPrice ?? 0);
const oldPrice = variant?.discountedPrice ? variant.price : 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) => (
))}
)}
{product.categoryNameFa &&
{product.categoryNameFa}
}
{product.nameFa || product.title}
{product.title && product.nameFa && (
{product.title}
)}
{variants.length > 1 && (
انتخاب تنوع
{variants.map((item) => (
))}
)}
{unavailable ? (
ناموجود
) : (
{oldPrice ? {formatPrice(oldPrice)} : null}
{formatPrice(price)}
تومان
)}
{!unavailable && (
{qty.toLocaleString("fa-IR")}
)}
);
}