From ceab60e3d1240dcc5069306e45059357cd8a50a5 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Sun, 5 Apr 2026 21:14:58 -0400 Subject: [PATCH] feat: initialize page calculation on reader load - Add pageCalculationResult and currentScrollPosition to UniversalReader type - Add settings:changed event type for settings change notifications - Call initializePageCalculation after reader ready in reader-shell.ts - Add tabindex to reader-content for keyboard navigation focus --- web/src/reader/core/reader-context.ts | 4 ++++ web/src/reader/core/reader-events.ts | 3 ++- web/src/reader/reader-shell.ts | 16 +++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/web/src/reader/core/reader-context.ts b/web/src/reader/core/reader-context.ts index 22d2343..7bb3264 100644 --- a/web/src/reader/core/reader-context.ts +++ b/web/src/reader/core/reader-context.ts @@ -1,4 +1,5 @@ import type { ReaderMetadata } from "../../types/reader"; +import { PageCalculationResult } from "../ebook/page-calculator"; type ReaderType = "ebook" | "pdf" | "comic" | "manga"; @@ -6,6 +7,9 @@ interface UniversalReader { type: "ebook"; cif: any; currentSpineIndex: number; + currentPage?: number; + pageCalculationResult?: PageCalculationResult; + currentScrollPosition?: number; } interface PDFReader { diff --git a/web/src/reader/core/reader-events.ts b/web/src/reader/core/reader-events.ts index a04818a..a008b0e 100644 --- a/web/src/reader/core/reader-events.ts +++ b/web/src/reader/core/reader-events.ts @@ -6,7 +6,8 @@ type ReaderEventType = | "themeChanged" | "progressUpdated" | "beforePageChange" - | "afterPageChange"; + | "afterPageChange" + | "settings:changed"; class EventBus { private listeners = new Map(); diff --git a/web/src/reader/reader-shell.ts b/web/src/reader/reader-shell.ts index 4c35235..690ebae 100644 --- a/web/src/reader/reader-shell.ts +++ b/web/src/reader/reader-shell.ts @@ -5,6 +5,7 @@ import { createReaderContext, type ReaderContext } from "./core/reader-context"; import { getState, setState } from "./core/reader-state"; import { createNavigationAPI } from "./core/reader-navigation"; import { readerEvents } from "./core/reader-events"; +import { renderSpineItem } from "./core/reader-navigation"; interface UniversalReader { type: "ebook"; @@ -142,6 +143,13 @@ async function initializeReader(): Promise { await initializeFeatures(context); readerEvents.emit("readerReady", currentReader); + // Render the initial chapter content + await renderSpineItem(); + // Initialize page calculation for dynamic page numbers + setTimeout(() => { + const { initializePageCalculation } = require("./core/reader-navigation"); + initializePageCalculation(); + }, 100); } catch (error) { console.error("Render initialization failed:", error); } @@ -183,7 +191,13 @@ async function initializeEbookReader(metadata: any): Promise { metadata.mime_type, getFileExtension(metadata.file_path), ); - + console.log("EPUB Parse Result:", { + spineLength: cif.spine?.length, + spineItems: cif.spine?.map((s: any) => s.href), + tocLength: cif.toc?.length, + keys: Object.keys(cif), + }); + console.log("Spine items detail:", JSON.stringify(cif.spine)); return { type: "ebook", cif,