From b258ec024815150c545457b090c1c21e092a987f Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Wed, 12 Feb 2025 14:06:41 +0100 Subject: [PATCH] feat: synchronisation de la progression de lecture avec Komga --- src/components/reader/BookReader.tsx | 61 +++++++++++++++++++--------- src/lib/services/book.service.ts | 25 ++++++++++++ 2 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/components/reader/BookReader.tsx b/src/components/reader/BookReader.tsx index c02f3a2..a24542d 100644 --- a/src/components/reader/BookReader.tsx +++ b/src/components/reader/BookReader.tsx @@ -33,6 +33,25 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { const [isDoublePage, setIsDoublePage] = useState(false); const pageCache = useRef({}); + // Fonction pour synchroniser la progression + const syncReadProgress = useCallback( + async (page: number) => { + try { + const completed = page === pages.length; + await fetch(`/api/komga/books/${book.id}/read-progress`, { + method: "PATCH", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ page, completed }), + }); + } catch (error) { + console.error("Erreur lors de la synchronisation de la progression:", error); + } + }, + [book.id, pages.length] + ); + // Fonction pour déterminer si on doit afficher une ou deux pages const shouldShowDoublePage = useCallback( (pageNumber: number) => { @@ -45,6 +64,28 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { [isDoublePage, pages.length] ); + const handlePreviousPage = useCallback(() => { + if (currentPage > 1) { + // En mode double page, reculer de 2 pages sauf si on est sur la page 2 + const newPage = isDoublePage && currentPage > 2 ? currentPage - 2 : currentPage - 1; + setCurrentPage(newPage); + setIsLoading(true); + setImageError(false); + syncReadProgress(newPage); + } + }, [currentPage, isDoublePage, syncReadProgress]); + + const handleNextPage = useCallback(() => { + if (currentPage < pages.length) { + // En mode double page, avancer de 2 pages sauf si c'est la dernière paire + const newPage = isDoublePage ? Math.min(currentPage + 2, pages.length) : currentPage + 1; + setCurrentPage(newPage); + setIsLoading(true); + setImageError(false); + syncReadProgress(newPage); + } + }, [currentPage, pages.length, isDoublePage, syncReadProgress]); + // Fonction pour précharger une page const preloadPage = useCallback( async (pageNumber: number) => { @@ -113,26 +154,6 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) { cleanCache(currentPage); }, [currentPage, preloadNextPages, cleanCache]); - const handlePreviousPage = useCallback(() => { - if (currentPage > 1) { - // En mode double page, reculer de 2 pages sauf si on est sur la page 2 - const newPage = isDoublePage && currentPage > 2 ? currentPage - 2 : currentPage - 1; - setCurrentPage(newPage); - setIsLoading(true); - setImageError(false); - } - }, [currentPage, isDoublePage]); - - const handleNextPage = useCallback(() => { - if (currentPage < pages.length) { - // En mode double page, avancer de 2 pages sauf si c'est la dernière paire - const newPage = isDoublePage ? Math.min(currentPage + 2, pages.length) : currentPage + 1; - setCurrentPage(newPage); - setIsLoading(true); - setImageError(false); - } - }, [currentPage, pages.length, isDoublePage]); - useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "ArrowLeft") { diff --git a/src/lib/services/book.service.ts b/src/lib/services/book.service.ts index 387939b..8b480ff 100644 --- a/src/lib/services/book.service.ts +++ b/src/lib/services/book.service.ts @@ -38,6 +38,31 @@ export class BookService extends BaseApiService { } } + static async updateReadProgress( + bookId: string, + page: number, + completed: boolean = false + ): Promise { + try { + const config = await this.getKomgaConfig(); + const url = this.buildUrl(config, `books/${bookId}/read-progress`); + const headers = this.getAuthHeaders(config); + headers.set("Content-Type", "application/json"); + + const response = await fetch(url, { + method: "PATCH", + headers, + body: JSON.stringify({ page, completed }), + }); + + if (!response.ok) { + throw new Error("Erreur lors de la mise à jour de la progression"); + } + } catch (error) { + return this.handleError(error, "Impossible de mettre à jour la progression"); + } + } + static getPageUrl(bookId: string, pageNumber: number): string { return `/api/komga/books/${bookId}/pages/${pageNumber}`; }