From caacf120033733d82e123ca232dac12e41bdee6e Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 5 Apr 2026 21:14:44 -0400 Subject: [PATCH] feat: update progress indicator to use dynamic page calculation - Import getCurrentPageFromScroll for viewport-based page calculation - Replace spine index with actual calculated page numbers when available - Fix bug where currentPage was assigned to itself (no-op) - Add fallback to estimated pages while calculation is in progress --- web/src/reader/features/progress-indicator.ts | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/web/src/reader/features/progress-indicator.ts b/web/src/reader/features/progress-indicator.ts index 429ac1e..7681ed5 100644 --- a/web/src/reader/features/progress-indicator.ts +++ b/web/src/reader/features/progress-indicator.ts @@ -1,4 +1,5 @@ import type { ReaderContext } from "../core/reader-context"; +import { getCurrentPageFromScroll } from "../ebook/page-calculator"; interface ProgressDisplay { mode: "pages" | "chapter" | "percentage" | "time-left"; text: string; @@ -111,14 +112,27 @@ function updateProgressDisplay(context: ReaderContext): void { let currentPage = 0; let totalPages = 0; if (state.currentReader.type === "ebook") { - currentPage = state.currentReader.currentSpineIndex + 1; - totalPages = state.currentReader.cif.spine.length; - } else if (state.currentReader.type === "pdf") { - currentPage = state.currentReader.currentPage; - totalPages = state.readerMetadata?.total_pages || 0; - } else { - currentPage = state.currentReader.currentPage; - totalPages = state.currentReader.images.length; + const reader = state.currentReader as any; + const pageInfo = reader.pageCalculationResult; + + if (pageInfo && pageInfo.totalPages > 0) { + const container = document.getElementById("reader-content"); + const viewportHeight = window.innerHeight; + currentPage = getCurrentPageFromScroll( + pageInfo, + reader.currentSpineIndex, + container?.scrollTop || 0, + viewportHeight, + ); + totalPages = pageInfo.totalPages; + } else { + // Fallback to estimated pages while calculating + currentPage = reader.currentSpineIndex + 1; + totalPages = + state.readerMetadata?.total_pages || + state.currentReader.cif.locations?.estimatedPages || + state.currentReader.cif.spine.length; + } } getReadingSpeed().then((speed) => { const result = calculateProgress(