/** * Series Overview Page * * Shows all posts in a specific series */ import { notFound } from 'next/navigation' import Link from 'next/link' import { getSeries, getPostsBySeries, getAllSeries } from '@/lib/mdx/blog' interface SeriesPageProps { params: Promise<{ serieId: string }> } export async function generateStaticParams() { const series = await getAllSeries() return series.map((serie) => ({ serieId: serie.id })) } export async function generateMetadata({ params }: SeriesPageProps) { const { serieId } = await params const series = await getSeries(serieId) if (!series) { return { title: 'Serie niet gevonden' } } const siteUrl = process.env.NEXT_PUBLIC_APP_URL || 'https://aispeedrun.vercel.app' const seriesUrl = `${siteUrl}/blog/serie/${serieId}` return { title: `${series.title} - Blog | AI Speedrun`, description: series.description, openGraph: { title: series.title, description: series.description, type: 'website', siteName: 'AI Speedrun', locale: 'nl_NL', }, twitter: { card: 'summary', title: series.title, description: series.description, }, alternates: { canonical: seriesUrl, }, } } export default async function SeriesPage({ params }: SeriesPageProps) { const { serieId } = await params const series = await getSeries(serieId) if (!series) { notFound() } const posts = await getPostsBySeries(serieId) const colorStyles = { teal: { bg: 'bg-teal-50', badge: 'bg-teal-100 text-teal-700 border-teal-200', dot: 'bg-teal-500', number: 'bg-teal-600 text-white', }, amber: { bg: 'bg-amber-50', badge: 'bg-amber-100 text-amber-700 border-amber-200', dot: 'bg-amber-500', number: 'bg-amber-600 text-white', }, slate: { bg: 'bg-slate-50', badge: 'bg-slate-100 text-slate-700 border-slate-200', dot: 'bg-slate-500', number: 'bg-slate-600 text-white', }, } const styles = colorStyles[series.color] || colorStyles.slate const statusLabels = { completed: 'Voltooid', active: 'Actief', planned: 'Gepland', } return (
{series.description}
Nog geen posts in deze serie.
) : ({post.frontmatter.description}