import { fetchAllSeries, fetchLibraries, LibraryDto, SeriesDto, SeriesPageDto, getBookCoverUrl } from "../../lib/api"; import { MarkSeriesReadButton } from "../components/MarkSeriesReadButton"; import { LiveSearchForm } from "../components/LiveSearchForm"; import { Card, CardContent, OffsetPagination } from "../components/ui"; import Image from "next/image"; import Link from "next/link"; export const dynamic = "force-dynamic"; export default async function SeriesPage({ searchParams, }: { searchParams: Promise<{ [key: string]: string | string[] | undefined }>; }) { const searchParamsAwaited = await searchParams; const libraryId = typeof searchParamsAwaited.library === "string" ? searchParamsAwaited.library : undefined; const searchQuery = typeof searchParamsAwaited.q === "string" ? searchParamsAwaited.q : ""; const readingStatus = typeof searchParamsAwaited.status === "string" ? searchParamsAwaited.status : undefined; const sort = typeof searchParamsAwaited.sort === "string" ? searchParamsAwaited.sort : undefined; const page = typeof searchParamsAwaited.page === "string" ? parseInt(searchParamsAwaited.page) : 1; const limit = typeof searchParamsAwaited.limit === "string" ? parseInt(searchParamsAwaited.limit) : 20; const [libraries, seriesPage] = await Promise.all([ fetchLibraries().catch(() => [] as LibraryDto[]), fetchAllSeries(libraryId, searchQuery || undefined, readingStatus, page, limit, sort).catch( () => ({ items: [] as SeriesDto[], total: 0, page: 1, limit }) as SeriesPageDto ), ]); const series = seriesPage.items; const totalPages = Math.ceil(seriesPage.total / limit); const sortOptions = [ { value: "", label: "Title" }, { value: "latest", label: "Latest added" }, ]; const hasFilters = searchQuery || libraryId || readingStatus || sort; const libraryOptions = [ { value: "", label: "All libraries" }, ...libraries.map((lib) => ({ value: lib.id, label: lib.name })), ]; const statusOptions = [ { value: "", label: "All" }, { value: "unread", label: "Unread" }, { value: "reading", label: "In progress" }, { value: "read", label: "Read" }, ]; return ( <>
{seriesPage.total} series {searchQuery && <> matching "{searchQuery}">}
{/* Series Grid */} {series.length > 0 ? ( <>{s.books_read_count}/{s.book_count} lu{s.book_count !== 1 ? "s" : ""}
{hasFilters ? "No series found matching your filters" : "No series available"}