import { readerEvents, ReaderEventType } from "./reader-events"; import { UniversalReader } from "../reader-shell"; import { PDFDocumentProxy } from "pdfjs-dist"; interface PDFReader { type: "pdf"; doc: PDFDocumentProxy; currentPage: number; } interface ComicReader { type: "comic"; images: Blob[]; currentPage: number; } interface MangaReader { type: "manga"; images: Blob[]; currentPage: number; readingDirection: "rtl" | "vertical"; } export type CurrentReader = | UniversalReader | PDFReader | ComicReader | MangaReader; export interface ReaderContext { getState: () => { currentReader: CurrentReader | null; readerMetadata: ReaderMetadata | null; }; setState: (updates: Partial) => void; navigation: { nextPage: () => void; previousPage: () => void; goToPage: (page: number) => void; goToChapter: (chapterIndex: number) => void; }; render: () => void; elements: { readerContent: HTMLElement; chrome: HTMLElement | null; progressDisplay: HTMLElement | null; }; events: { on: (event: string, handler: Function) => void; emit: (event: string, data?: any) => void; }; } export interface ReaderState { currentReader: CurrentReader | null; readerMetadata: ReaderMetadata | null; } export function createReaderContext( getState: () => ReaderState, setState: (updates: Partial) => void, navigation: ReaderContext["navigation"], render: () => void, ): ReaderContext { return { getState, setState, navigation, render, elements: { readerContent: document.getElementById("reader-content")!, chrome: document.getElementById("reader-chrome"), progressDisplay: document.getElementById("progress-display"), }, events: { on: (event: ReaderEventType, handler: Function) => readerEvents.on(event, handler), emit: (event: ReaderEventType, data?: any) => readerEvents.emit(event, data), }, }; }