import SiteHeader from "@/components/home/SiteHeader"; import SiteFooter from "@/components/home/SiteFooter"; import LeatherBanner from "@/components/home/LeatherBanner"; import PartnerCta from "@/components/home/PartnerCta"; import ProductListHero from "@/components/products/ProductListHero"; import ProductFilters from "@/components/products/ProductFilters"; import ProductGrid from "@/components/products/ProductGrid"; import ProductPagination from "@/components/products/ProductPagination"; import ProductEmptyState from "@/components/products/ProductEmptyState"; import ProductListExtras from "@/components/products/ProductListExtras"; import { LIST_PAGE_META } from "@/data/products"; import { mapHomeSlots } from "@/lib/map-home-slots"; import { fetchPublicWebsiteSlots, itemsForSlot, } from "@/lib/website-slots"; import { getStorefrontProducts } from "@/lib/products-api"; import { fetchPublicCategories, mapCategoriesToMegaTabs, resolveHomeCategoryStrip, type ApiCategoryNode, } from "@/lib/categories-api"; import { paginateItems, parseProductListQuery, type ProductListQuery, } from "@/lib/products-query"; type PageProps = { searchParams: Promise; }; function findCategory( nodes: ApiCategoryNode[], id: string, ): ApiCategoryNode | null { for (const node of nodes) { if (String(node.id) === id) return node; const child = findCategory(node.children ?? [], id); if (child) return child; } return null; } function findCategoryName( nodes: ApiCategoryNode[], id: string, ): string | null { return findCategory(nodes, id)?.nameFa ?? null; } export default async function ProductsPage({ searchParams }: PageProps) { const raw = await searchParams; const query = parseProductListQuery(raw); const [slotItems, products, apiCategories] = await Promise.all([ fetchPublicWebsiteSlots(), getStorefrontProducts({ name: query.q || undefined, categoryId: query.cat || undefined, minPrice: query.minPrice, maxPrice: query.maxPrice, featuredSlot: query.sale ? "promo-1" : undefined, }), fetchPublicCategories(), ]); const home = mapHomeSlots(slotItems); const megaTabs = mapCategoriesToMegaTabs( apiCategories, home.megaTabs.map((t) => ({ image: t.image })), ); const stripCategories = resolveHomeCategoryStrip( apiCategories, home.categories, itemsForSlot(slotItems, "category-strip").length > 0, ); const catNode = query.cat ? findCategory(apiCategories, query.cat) : null; const categorySeo = catNode?.seoDescription?.trim() ? { nameFa: catNode.nameFa, nameEn: catNode.nameEn, description: catNode.seoDescription.trim(), } : null; const { pageItems, totalPages, page, total } = paginateItems( products, query.page, ); const categoryLabel = query.cat ? findCategoryName(apiCategories, query.cat) : null; const hasFilters = Boolean( query.q || query.cat || query.min || query.max || query.sale, ); const heroTitle = query.sale ? "فروش ویژه" : query.q ? `جستجو: ${query.q}` : categoryLabel ? categoryLabel : LIST_PAGE_META.titleFa; const heroEn = query.sale ? "Special Sale" : query.q ? "Search results" : categoryLabel ? "" : LIST_PAGE_META.titleEn; const breadcrumbs = query.sale ? [ { label: "خانه", href: "/" }, { label: "محصولات", href: "/products" }, { label: "فروش ویژه" }, ] : query.q ? [ { label: "خانه", href: "/" }, { label: "محصولات", href: "/products" }, { label: "جستجو" }, ] : LIST_PAGE_META.breadcrumbs; return (
{total === 0 ? ( ) : ( <> )}
); }