import { apiPut, ReadingProgress } from "../../api"; interface ExtendedProgress { character?: number; chapter?: number; percentage?: number; } export async function updateReadingProgress( mediaItemId: string, progress: ReadingProgress, extended?: ExtendedProgress, ): Promise { if (!mediaItemId || mediaItemId === "undefined") { console.warn("Skipping progress update - no valid mediaItemId"); return; } const payload: ReadingProgress = { current_page: progress.current_page, total_pages: progress.total_pages, cfi: progress.cfi || "", percentage: extended?.percentage || 0, last_read_at: new Date().toISOString(), }; const response = await apiPut( `/media-items/${mediaItemId}/progress`, payload, ); if (!response.ok) { const clonedResponse = response.clone(); const errorText = await clonedResponse.text(); console.warn("Progress update failed:", clonedResponse.status, errorText); return; } } export function getChapterNavigation(chapters: Chapter[]) { return { getNextChapter: (currentPage: number) => { for (let i = 0; i < chapters.length - 1; i++) { const chapter = chapters[i]; const nextChapter = chapters[i + 1]; if ( currentPage >= chapter.start_page && currentPage < nextChapter.start_page ) { return nextChapter.start_page; } } return null; }, getPreviousChapter: (currentPage: number) => { for (let i = 1; i < chapters.length; i++) { const chapter = chapters[i]; if ( currentPage >= chapter.start_page && currentPage < chapter.start_page + chapter.page_count ) { return chapters[i - 1].start_page; } } if (currentPage < chapters[0].start_page) { return null; } return chapters[0].start_page; }, }; }