import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import { Container } from "@/components/Container"; import { ProductGallery } from "@/components/product/ProductGallery"; import { ProductTabs } from "@/components/product/ProductTabs"; import { fetchComments } from "@/lib/comments"; import { formatPrice } from "@/lib/format"; import { brandName, fetchCatalogProductBySlug, fetchCatalogProductByTitle, fetchStoreItemByProduct, fetchStoreVariant, galleryUrls, variantTitle, type CatalogProduct, type StoreVariant, } from "@/lib/store"; export const revalidate = 60; async function resolveProduct(id: string): Promise<{ variant: StoreVariant | null; catalog: CatalogProduct | null; productId?: string; }> { const variant = await fetchStoreVariant(id); if (variant) { const catalog = await fetchCatalogProductByTitle( variant.productNameFa || variant.productTitle, variant.productId, ); return { variant, catalog, productId: variant.productId }; } const bySlug = await fetchCatalogProductBySlug(id); if (bySlug) { return { variant: null, catalog: bySlug, productId: bySlug.id }; } const byProduct = await fetchStoreItemByProduct(id); const firstVariant = byProduct.storeItem?.variants?.[0]; if (firstVariant) { const catalog = await fetchCatalogProductByTitle( firstVariant.productNameFa || firstVariant.productTitle, id, ); return { variant: { ...firstVariant, productId: id, }, catalog, productId: id, }; } return { variant: null, catalog: null }; } export async function generateMetadata({ params, }: { params: Promise<{ id: string }>; }): Promise { const { id } = await params; const resolved = await resolveProduct(id); const title = resolved.catalog?.nameFa || resolved.catalog?.title || (resolved.variant ? variantTitle(resolved.variant) : null); const description = resolved.catalog?.summary?.trim() || stripHtml(resolved.catalog?.descriptionHtml) || undefined; return { title: title || "محصول", description, }; } function stripHtml(html?: string | null) { if (!html?.trim()) return undefined; const text = html .replace(/<[^>]+>/g, " ") .replace(/\s+/g, " ") .trim(); return text.slice(0, 180) || undefined; } export default async function ProductDetailsPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const { variant, catalog, productId } = await resolveProduct(id); if (!variant && !catalog) notFound(); const comments = productId ? await fetchComments("product", productId) : []; const sibling = productId && variant ? await fetchStoreItemByProduct(productId) : { storeItem: undefined }; const images = galleryUrls(catalog, variant?.productImage || catalog?.image || catalog?.thumbnailUrl); const price = variant?.discountedPrice ?? variant?.price ?? catalog?.store?.minPrice ?? null; const oldPrice = variant?.discountedPrice != null ? variant.price : null; const title = catalog?.nameFa || catalog?.title || (variant ? variantTitle(variant) : "محصول"); const brand = brandName(catalog); const variants = sibling.storeItem?.variants ?? []; const inStock = variant != null ? variant.stockQuantity == null || variant.stockQuantity > 0 : catalog?.store?.inStock !== false; return (

خانه / محصولات / {title}

{brand ?

{brand}

: null} {catalog?.categoryNameFa ? (

{catalog.categoryNameFa}

) : null}

{title}

{variant?.label && variant.label !== title ? (

{variant.label}

) : null}
{oldPrice ?

{formatPrice(oldPrice)} تومان

: null}

{price != null ? ( <> {formatPrice(price)} تومان ) : ( برای قیمت تماس بگیرید )}

{inStock ? "موجود در فروشگاه" : "ناموجود"}

{variants.length > 1 ? (
{variants.map((item) => ( {item.label || variantTitle(item)} ))}
) : null} استعلام و سفارش
); }