import { fetchLibraries, fetchBooks, getBookCoverUrl, BookDto } from "../../../../../lib/api"; import { BooksGrid, EmptyState } from "../../../../components/BookCard"; import { MarkSeriesReadButton } from "../../../../components/MarkSeriesReadButton"; import { MarkBookReadButton } from "../../../../components/MarkBookReadButton"; import { OffsetPagination } from "../../../../components/ui"; import Image from "next/image"; import Link from "next/link"; import { notFound } from "next/navigation"; export const dynamic = "force-dynamic"; export default async function SeriesDetailPage({ params, searchParams, }: { params: Promise<{ id: string; name: string }>; searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const { id, name } = await params; const searchParamsAwaited = await searchParams; const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 50; const seriesName = decodeURIComponent(name); const [library, booksPage] = await Promise.all([ fetchLibraries().then((libs) => libs.find((l) => l.id === id)), fetchBooks(id, seriesName, page, limit).catch(() => ({ items: [] as BookDto[], total: 0, page: 1, limit, })), ]); if (!library) { notFound(); } const books = booksPage.items.map((book) => ({ ...book, coverUrl: getBookCoverUrl(book.id), })); const totalPages = Math.ceil(booksPage.total / limit); const booksReadCount = booksPage.items.filter((b) => b.reading_status === "read").length; const displayName = seriesName === "unclassified" ? "Non classifié" : seriesName; // Use first book cover as series cover const coverBookId = booksPage.items[0]?.id; return (