From 6c876c3e19c814e4293f0d776054ab36e6d5f2bf Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sat, 4 Apr 2026 13:37:56 -0400 Subject: [PATCH] feat(reader): add reader API integration - Add getReaderMetadata() to fetch media item metadata - Add updateReadingProgress() to sync reading progress to backend - Export ReaderMetadata and ReadingProgress types - Enable reader to communicate with Go backend --- web/src/api.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/web/src/api.ts b/web/src/api.ts index c17b6a9..11e20c5 100644 --- a/web/src/api.ts +++ b/web/src/api.ts @@ -88,6 +88,48 @@ function handleError(error: unknown, context: string): void { showToast(message, "error"); } +// ============================================================ +// Reader API Functions +// ============================================================ +interface ReaderMetadata { + media_item_id: string; + title: string; + author: string; + cover_image_path: string; + library_type: "ebook" | "comic" | "manga" | "pdf"; + mime_type: string; + file_path: string; + chapter_metadata?: ChapterMetadata; + total_pages?: number; +} +interface ChapterMetadata { + chapters: Chapter[]; +} +interface Chapter { + id: string; + title: string; + start_page: number; + page_count: number; +} +interface ReadingProgress { + current_page: number; + total_pages: number; +} +async function getReaderMetadata(mediaItemId: string): Promise { + const response = await apiGet(`/media-items/${mediaItemId}`); + return handleResponse(response); +} +async function updateReadingProgress( + mediaItemId: string, + progress: ReadingProgress, +): Promise { + const response = await apiPut( + `/media-items/${mediaItemId}/progress`, + progress, + ); + await handleVoidResponse(response); +} + export { apiGet, apiPost, @@ -97,6 +139,12 @@ export { handleResponse, handleVoidResponse, handleError, + getReaderMetadata, + updateReadingProgress, + ReaderMetadata, + ReadingProgress, + ChapterMetadata, + Chapter, }; Alpine.data("api", () => ({