import { getProjectBySlug, projects, projectSlug } from "@/lib/data"; import Chip from "@/components/chip"; import MarkdownContent from "@/components/markdown-content"; import { Metadata } from "next"; import Image from "next/image"; import { Github, Eye, CloudDownload } from "lucide-react"; import { notFound } from "next/navigation"; export async function generateStaticParams() { return projects.map((project) => ({ projectName: projectSlug(project), })); } export async function generateMetadata({ params, }: { params: Promise<{ projectName: string }>; }): Promise { const { projectName } = await params; const project = getProjectBySlug(projectName); if (!project) { return { title: "Project Not Found" }; } const slug = projectSlug(project); return { title: `${project.name} | Gabriel Kaszewski`, description: project.short_description, alternates: { canonical: `https://gabrielkaszewski.dev/projects/${slug}`, }, openGraph: { title: project.name, description: project.short_description, url: `https://gabrielkaszewski.dev/projects/${slug}`, images: project.thumbnails && project.thumbnails.length > 0 ? [ { url: project.thumbnails[0], width: 800, height: 600, alt: project.name, }, ] : undefined, }, twitter: { card: "summary", title: project.name, description: project.short_description, }, }; } export default async function ProjectDetailPage({ params, }: { params: Promise<{ projectName: string }>; }) { const { projectName } = await params; const project = getProjectBySlug(projectName); if (!project) { notFound(); } const hasLinks = project.github_url || project.visit_url || project.download_url; return (

{project.name}

Technologies

{project.technologies.map((tech) => ( ))}
{project.thumbnails && project.thumbnails.length > 0 && (

Gallery

{project.thumbnails.map((thumb, index) => ( {`${project.name} ))}
)} {hasLinks && (

Links

{project.github_url && ( CODE )} {project.visit_url && ( LIVE )} {project.download_url && ( DOWNLOAD )}
)}
); }