import type { Metadata } from "next"; import { ArrowUpRight, CalendarDays, FolderKanban } from "lucide-react"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { Container } from "@/components/layout/container"; import { MotionFade } from "@/components/motion-fade"; import { buildLocalizedMetadata } from "@/lib/metadata"; import { AppCard } from "@/components/ui/app-card"; import { CardContent } from "@/components/ui/card"; import { getLocalizedPath, resolveLocale } from "@/lib/locale"; import { getActivePortfolioCategories, getLocalizedValue, getPublishedPortfolioProjects, } from "@/lib/portfolio"; type PortfolioPageProps = { params: { locale: string; }; searchParams?: { category?: string; }; }; export const dynamic = "force-dynamic"; export async function generateMetadata({ params: { locale }, }: PortfolioPageProps): Promise { const localeKey = resolveLocale(locale); const t = await getTranslations({ locale: localeKey, namespace: "portfolioPage" }); return buildLocalizedMetadata({ locale: localeKey, pathname: "/portfolio", title: t("title"), description: t("intro"), }); } export default async function PortfolioPage({ params: { locale }, searchParams, }: PortfolioPageProps) { const localeKey = resolveLocale(locale); const t = await getTranslations({ locale: localeKey, namespace: "portfolioPage" }); const selectedCategory = searchParams?.category ?? ""; const [categories, projects] = await Promise.all([ getActivePortfolioCategories(), getPublishedPortfolioProjects({ categorySlug: selectedCategory || undefined, }), ]); return (

{t("title")}

{t("intro")}

{t("all")} {categories.map((category) => ( {getLocalizedValue(category.name, localeKey)} ))}
{projects.map((item, index) => (

{getLocalizedValue(item.category.name, localeKey)}

{item.projectYear}

{getLocalizedValue(item.title, localeKey)}

{getLocalizedValue(item.summary, localeKey)}

{t("open")}

))} {projects.length === 0 ? ( {t("empty")} ) : null}
); }