import { fetchLibraries, fetchSeries, fetchSeriesStatuses, getBookCoverUrl, LibraryDto, SeriesDto, SeriesPageDto } from "../../../../lib/api"; import { OffsetPagination } from "../../../components/ui"; import { MarkSeriesReadButton } from "../../../components/MarkSeriesReadButton"; import { SeriesFilters } from "../../../components/SeriesFilters"; import Image from "next/image"; import Link from "next/link"; import { notFound } from "next/navigation"; import { LibrarySubPageHeader } from "../../../components/LibrarySubPageHeader"; import { getServerTranslations } from "../../../../lib/i18n/server"; export const dynamic = "force-dynamic"; export default async function LibrarySeriesPage({ params, searchParams }: { params: Promise<{ id: string }>; searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { id } = await params; const { t } = await getServerTranslations(); const searchParamsAwaited = await searchParams; const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 20; const seriesStatus = typeof searchParamsAwaited.series_status === "string" ? searchParamsAwaited.series_status : undefined; const hasMissing = searchParamsAwaited.has_missing === "true"; const [library, seriesPage, dbStatuses] = await Promise.all([ fetchLibraries().then(libs => libs.find(l => l.id === id)), fetchSeries(id, page, limit, seriesStatus, hasMissing).catch(() => ({ items: [] as SeriesDto[], total: 0, page: 1, limit }) as SeriesPageDto), fetchSeriesStatuses().catch(() => [] as string[]), ]); if (!library) { notFound(); } const series = seriesPage.items; const totalPages = Math.ceil(seriesPage.total / limit); const KNOWN_STATUSES: Record = { ongoing: t("seriesStatus.ongoing"), ended: t("seriesStatus.ended"), hiatus: t("seriesStatus.hiatus"), cancelled: t("seriesStatus.cancelled"), upcoming: t("seriesStatus.upcoming"), }; const seriesStatusOptions = [ { value: "", label: t("seriesStatus.allStatuses") }, ...dbStatuses.map((s) => ({ value: s, label: KNOWN_STATUSES[s] || s })), ]; return (
} iconColor="text-primary" /> {series.length > 0 ? ( <>
{series.map((s) => (
= s.book_count ? "opacity-50" : ""}`}>
{t("books.coverOf",

{s.name === "unclassified" ? t("books.unclassified") : s.name}

{t("series.readCount", { read: String(s.books_read_count), total: String(s.book_count) })}

{s.series_status && ( {KNOWN_STATUSES[s.series_status] || s.series_status} )} {s.missing_count != null && s.missing_count > 0 && ( {t("series.missingCount", { count: String(s.missing_count) })} )}
))}
) : (

{t("librarySeries.noSeries")}

)}
); }