fix: resolve progress update errors and use dynamic page calculation

- reader-navigation.ts: add fallback for mediaItemId from page URL
- reader-navigation.ts: use getCurrentPageFromScroll for accurate page tracking
- reader-navigation.ts: use pageCalculationResult.totalPages for total
- reader-services.ts: validate mediaItemId before API call
- reader-services.ts: avoid double body consumption by checking response.ok
This commit is contained in:
2026-04-05 21:35:57 -04:00
parent 4cb9bdbac1
commit ba8c53cf4b
2 changed files with 34 additions and 3 deletions
+25 -2
View File
@@ -458,12 +458,35 @@ function sendProgressUpdate() {
const state = getState();
if (!state.currentReader || !state.readerMetadata) return;
const mediaItemId =
state.readerMetadata.media_item_id ||
document.body.dataset.mediaItemId ||
window.location.pathname.split("/").pop();
if (!mediaItemId) {
console.warn("No mediaItemId available for progress update");
return;
}
let currentPage = 0;
let totalPages = 0;
if (state.currentReader.type === "ebook") {
currentPage = state.currentReader.currentSpineIndex + 1;
totalPages = state.currentReader.cif.spine.length;
// Use dynamic page calculation if available
if (pageCalculationResult) {
const container = document.getElementById("reader-content");
const viewportHeight = window.innerHeight;
currentPage = getCurrentPageFromScroll(
pageCalculationResult,
state.currentReader.currentSpineIndex,
container?.scrollTop || 0,
viewportHeight,
);
totalPages = pageCalculationResult.totalPages;
} else {
currentPage = state.currentReader.currentSpineIndex + 1;
totalPages = state.currentReader.cif.spine.length;
}
} else if (state.currentReader.type === "pdf") {
totalPages = state.readerMetadata.total_pages || 0;
currentPage = state.currentReader.currentPage;
+9 -1
View File
@@ -9,11 +9,19 @@ export async function updateReadingProgress(
mediaItemId: string,
progress: ReadingProgress,
): Promise<void> {
if (!mediaItemId || mediaItemId === "undefined") {
console.warn("Skipping progress update - no valid mediaItemId");
return;
}
const response = await apiPut(
`/media-items/${mediaItemId}/progress`,
progress,
);
await response.json();
if (!response.ok) {
const errorText = await response.text();
console.warn("Progress update failed:", response.status, errorText);
return;
}
}
export function getChapterNavigation(chapters: any[]) {