import Link from "next/link"; import Image from "next/image"; import type { Metadata } from "next"; import { getTranslations } from "next-intl/server"; import { getBookReviews, type BookReview } from "@/lib/directus"; import { getLanguageAlternates, toAbsoluteUrl } from "@/lib/seo"; import SubpageShell from "@/app/_ui/SubpageShell"; import { BackArrow, SubpageIntro, card, ghost, monoLabel } from "@/app/_ui/subpage"; export const revalidate = 300; export async function generateMetadata({ params, }: { params: Promise<{ locale: string }>; }): Promise { const { locale } = await params; const isDe = locale === "de"; return { title: isDe ? "Bibliothek – Dennis Konkol" : "Library – Dennis Konkol", alternates: { canonical: toAbsoluteUrl(`/${locale}/books`), languages: getLanguageAlternates({ pathWithoutLocale: "books" }), }, }; } export default async function BooksPage({ params, }: { params: Promise<{ locale: string }>; }) { const { locale } = await params; const t = await getTranslations({ locale, namespace: "books" }); const common = await getTranslations({ locale, namespace: "common" }); // Serverseitig laden, damit die Liste auch ohne JavaScript dasteht let reviews: BookReview[] = []; try { reviews = (await getBookReviews(locale)) ?? []; } catch (err) { if (process.env.NODE_ENV === "development") console.error("Book reviews fetch failed:", err); } return ( {common("back")} } kicker={reviews.length > 0 ? `${String(reviews.length).padStart(2, "0")} ${locale === "de" ? "Bücher" : "books"}` : undefined} title={t("title")} >

{t("subtitle")}

{reviews.length === 0 ? (

{t("empty")}

) : ( )}
); } function BookCard({ review, locale }: { review: BookReview; locale: string }) { const text = review.review?.replace(/<[^>]*>/g, "").trim(); const finished = review.finished_at ? new Date(review.finished_at) : null; const finishedLabel = finished && !Number.isNaN(finished.getTime()) ? finished.toLocaleDateString(locale === "de" ? "de-DE" : "en-GB", { month: "short", year: "numeric" }) : null; return (
{review.book_image && }

{review.book_title}

{review.book_author}

{review.rating > 0 && ( {locale === "de" ? "Bewertung: " : "Rating: "} {review.rating}/5 )} {finishedLabel && {finishedLabel}}
{text && (
{text}
)}
); }