// Import types import type { ReadingPosition } from "./types"; import { findPageByCFI, createPositionFromPage } from "./page-calculator"; import { UniversalReader } from "../../reader-shell"; // Update current position export function updateCurrentPosition( book: UniversalReader, position: ReadingPosition, ): UniversalReader { return { ...book, position, }; } // Extract CFI from position export function getCurrentCFI(book: UniversalReader): string { return book.position.cfi; } // Calculate progress for display export function calculateProgress(book: UniversalReader): { currentPage: number; totalPages: number; percentage: number; } { const totalPages = book.pagination?.totalPages || 1; const currentPage = book.position.currentPage; const percentage = totalPages > 0 ? Math.round((currentPage / totalPages) * 100) : 0; return { currentPage, totalPages, percentage }; } // Get position for saving to database export function getPositionForSave(book: UniversalReader): { cfi: string; progress: number; page: number; } { return { cfi: book.position.cfi, progress: book.position.progress, page: book.position.currentPage, }; } // Restore position from database export function restorePosition( book: UniversalReader, savedCFI: string, savedPage?: number, ): ReadingPosition { if (!book.pagination) { return book.position; } // If we have saved CFI, try to find exact position if (savedCFI) { const pageNum = findPageByCFI(book.pagination, savedCFI); return createPositionFromPage(book, pageNum); } // Otherwise use saved page number if (savedPage && savedPage > 0) { return createPositionFromPage(book, savedPage); } return book.position; } // Check if position changed significantly export function didPositionChange( oldPos: ReadingPosition, newPos: ReadingPosition, ): boolean { return ( oldPos.currentPage !== newPos.currentPage || oldPos.cfi !== newPos.cfi || Math.abs(oldPos.progress - newPos.progress) > 0.01 ); }