import type { Metadata } from "next"; import Link from "next/link"; import { ContentPageShell } from "@/components/ContentPageShell"; import { Pagination } from "@/components/Pagination"; import { categoryLabelFa, findPortfolioCategory, getDescendantCategoryIds, getRootCategories, portfolioCategoryHref, topPortfolioCategories, type PortfolioCategory, } from "@/data/portfolioCategories"; import { getPortfolioCategories, getPortfolioCoverImage, getPortfolios, getPortfoliosByCategory, } from "@/lib/api"; export const metadata: Metadata = { title: "نمونه‌کارها", description: "نمونه پروژه‌ها و کارهای انجام‌شده توسط تیم مشکی.", alternates: { canonical: "/portfolio" }, }; const PAGE_SIZE = 12; type PortfolioPageProps = { searchParams: Promise<{ page?: string; category?: string }>; }; function mapApiCategories( items: Awaited>, ): PortfolioCategory[] { return items.map((item) => ({ id: String(item.id), slug: item.slug, nameEn: item.name, nameFa: item.nameFa || item.name, parentId: item.parentId, sortOrder: item.sortOrder ?? 0, })); } export default async function PortfolioListPage({ searchParams, }: PortfolioPageProps) { const { page: pageParam, category: categoryParam } = await searchParams; const page = Math.max(1, Number(pageParam) || 1); let allCategories: PortfolioCategory[] = topPortfolioCategories; try { allCategories = mapApiCategories(await getPortfolioCategories()); } catch { allCategories = topPortfolioCategories; } const rootCategories = getRootCategories(allCategories); const activeCategory = findPortfolioCategory(categoryParam, allCategories) ?? findPortfolioCategory(categoryParam, rootCategories); let items: Awaited>["items"] = []; let total = 0; try { if (activeCategory) { const data = await getPortfoliosByCategory({ categoryId: activeCategory.id, categoryIds: getDescendantCategoryIds(allCategories, activeCategory.id), page, pageSize: PAGE_SIZE, }); items = data.items; total = data.total; } else { const data = await getPortfolios({ page, pageSize: PAGE_SIZE }); items = data.items; total = data.total; } } catch { items = []; total = 0; } const paginationQuery = activeCategory ? { category: activeCategory.slug } : undefined; const filterCategories = rootCategories.length > 0 ? rootCategories : topPortfolioCategories; return (

نمونه‌کارها

Portfolio

نگاهی به پروژه‌ها و کارهای انجام‌شده توسط تیم مشکی.

همه {filterCategories.map((category) => { const active = activeCategory?.id === category.id; return ( {category.nameFa} ); })}
{items.length === 0 ? (

نمونه‌کاری برای نمایش وجود ندارد.

) : (
{items.map((item, index) => { const image = getPortfolioCoverImage(item); const categoryFa = categoryLabelFa( item.categoryName, allCategories, ); const titleFa = item.titleFa || item.title; const titleEn = item.titleEn ?? (item.titleFa && item.title !== item.titleFa ? item.title : null); return (
{image ? ( ) : null}
{titleEn ? (

{titleEn}

) : null}

{titleFa}

{categoryFa ? (

{categoryFa}

) : null} {item.abstract ? (

{item.abstract}

) : null}
); })}
)}
); }