diff --git a/src/app/series/[seriesId]/ClientSeriesPage.tsx b/src/app/series/[seriesId]/ClientSeriesPage.tsx index 1678db1..dc2f6aa 100644 --- a/src/app/series/[seriesId]/ClientSeriesPage.tsx +++ b/src/app/series/[seriesId]/ClientSeriesPage.tsx @@ -19,6 +19,8 @@ interface ClientSeriesPageProps { preferences: UserPreferences; unreadOnly: boolean; pageSize?: number; + initialSeries: KomgaSeries; + initialBooks: LibraryResponse; } const DEFAULT_PAGE_SIZE = 20; @@ -29,48 +31,21 @@ export function ClientSeriesPage({ preferences, unreadOnly, pageSize, + initialSeries, + initialBooks, }: ClientSeriesPageProps) { - const [series, setSeries] = useState(null); - const [books, setBooks] = useState | null>(null); - const [loading, setLoading] = useState(true); + const [series, setSeries] = useState(initialSeries); + const [books, setBooks] = useState | null>(initialBooks); + const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const effectivePageSize = pageSize || preferences.displayMode?.itemsPerPage || DEFAULT_PAGE_SIZE; + // Sync avec les props initiales quand elles changent (navigation via URL) useEffect(() => { - const fetchData = async () => { - setLoading(true); - setError(null); - - try { - const params = new URLSearchParams({ - page: String(currentPage - 1), - size: String(effectivePageSize), - unread: String(unreadOnly), - }); - - const response = await fetch(`/api/komga/series/${seriesId}/books?${params}`, { - cache: "default", // Utilise le cache HTTP du navigateur - }); - - if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.error?.code || ERROR_CODES.BOOK.PAGES_FETCH_ERROR); - } - - const data = await response.json(); - setSeries(data.series); - setBooks(data.books); - } catch (err) { - logger.error({ err }, "Error fetching series books"); - setError(err instanceof Error ? err.message : ERROR_CODES.BOOK.PAGES_FETCH_ERROR); - } finally { - setLoading(false); - } - }; - - fetchData(); - }, [seriesId, currentPage, unreadOnly, effectivePageSize]); + setSeries(initialSeries); + setBooks(initialBooks); + }, [initialSeries, initialBooks]); const handleRefresh = async (seriesId: string) => { try { diff --git a/src/app/series/[seriesId]/page.tsx b/src/app/series/[seriesId]/page.tsx index 28a819c..cb12901 100644 --- a/src/app/series/[seriesId]/page.tsx +++ b/src/app/series/[seriesId]/page.tsx @@ -1,4 +1,5 @@ import { PreferencesService } from "@/lib/services/preferences.service"; +import { SeriesService } from "@/lib/services/series.service"; import { ClientSeriesPage } from "./ClientSeriesPage"; import type { UserPreferences } from "@/types/preferences"; @@ -7,6 +8,8 @@ interface PageProps { searchParams: Promise<{ page?: string; unread?: string; size?: string }>; } +const DEFAULT_PAGE_SIZE = 20; + export default async function SeriesPage({ params, searchParams }: PageProps) { const seriesId = (await params).seriesId; const page = (await searchParams).page; @@ -18,6 +21,15 @@ export default async function SeriesPage({ params, searchParams }: PageProps) { // Utiliser le paramètre d'URL s'il existe, sinon utiliser la préférence utilisateur const unreadOnly = unread !== undefined ? unread === "true" : preferences.showOnlyUnread; + const effectivePageSize = size + ? parseInt(size) + : preferences.displayMode?.itemsPerPage || DEFAULT_PAGE_SIZE; + + // Fetch côté serveur + const [books, series] = await Promise.all([ + SeriesService.getSeriesBooks(seriesId, currentPage - 1, effectivePageSize, unreadOnly), + SeriesService.getSeries(seriesId), + ]); return ( ); } diff --git a/src/lib/services/series.service.ts b/src/lib/services/series.service.ts index e8d0f72..a2143d0 100644 --- a/src/lib/services/series.service.ts +++ b/src/lib/services/series.service.ts @@ -66,7 +66,7 @@ export class SeriesService extends BaseApiService { { path: "books/list", params: { - size: "1000", // On récupère un maximum de livres + size: "5000", // On récupère un maximum de livres }, }, headers,