From dc88b42191454f679b897ed97251d8423236effc Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sun, 23 Mar 2025 16:02:32 +0100 Subject: [PATCH] Fix preloading of reader pages There were different issues with the direction the pages got preloaded. - when resuming a chapter with an initial page > 1, it incorrectly preloaded leading pages instead of trailing ones. - when going to the previous/next rendered chapter no pages got preloaded at all --- .../components/viewer/ReaderChapterViewer.tsx | 4 +++- .../components/viewer/pager/BasePager.tsx | 19 +++++++++++++++++-- src/modules/reader/types/Reader.types.ts | 2 ++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/modules/reader/components/viewer/ReaderChapterViewer.tsx b/src/modules/reader/components/viewer/ReaderChapterViewer.tsx index 232c6f79..01a21070 100644 --- a/src/modules/reader/components/viewer/ReaderChapterViewer.tsx +++ b/src/modules/reader/components/viewer/ReaderChapterViewer.tsx @@ -103,7 +103,7 @@ const BaseReaderChapterViewer = ({ | 'retryFailedPagesKeyPrefix' | 'setTransitionPageMode' > & - Omit & + Omit & Pick< IReaderSettings, 'readingMode' | 'shouldOffsetDoubleSpreads' | 'readingDirection' | 'readerWidth' | 'pageScaleMode' @@ -450,6 +450,8 @@ const BaseReaderChapterViewer = ({ scrollbarYSize={scrollbarYSize} readerNavBarWidth={readerNavBarWidth} isPreloadMode={isPreloadMode} + resumeMode={resumeMode} + handleAsInitialRender={scrollIntoView} /> {showNextTransitionPage && ( diff --git a/src/modules/reader/components/viewer/pager/BasePager.tsx b/src/modules/reader/components/viewer/pager/BasePager.tsx index 2b2454db..00c488e7 100644 --- a/src/modules/reader/components/viewer/pager/BasePager.tsx +++ b/src/modules/reader/components/viewer/pager/BasePager.tsx @@ -10,10 +10,18 @@ import { forwardRef, memo, ReactNode, useCallback, useEffect, useMemo, useRef } import Box, { BoxProps } from '@mui/material/Box'; import { getPageIndexesToLoad, isATransitionPageVisible } from '@/modules/reader/utils/ReaderPager.utils.tsx'; import { ReaderStatePages } from '@/modules/reader/types/ReaderProgressBar.types.ts'; -import { IReaderSettings, ReaderPagerProps, ReaderTransitionPageMode } from '@/modules/reader/types/Reader.types.ts'; +import { + IReaderSettings, + ReaderPagerProps, + ReaderResumeMode, + ReaderTransitionPageMode, +} from '@/modules/reader/types/Reader.types.ts'; import { applyStyles } from '@/modules/core/utils/ApplyStyles.ts'; import { isContinuousReadingMode } from '@/modules/reader/utils/ReaderSettings.utils.tsx'; +const getPreviousCurrentPageIndex = (resumeMode: ReaderResumeMode): number => + resumeMode === ReaderResumeMode.END ? Number.MAX_SAFE_INTEGER : -1; + const BaseBasePager = forwardRef< HTMLDivElement, Omit & @@ -56,10 +64,17 @@ const BaseBasePager = forwardRef< scrollbarXSize, scrollbarYSize, readerNavBarWidth, + resumeMode, + handleAsInitialRender, }, ref, ) => { - const previousCurrentPageIndex = useRef(currentPageIndex > 0 ? Number.MAX_SAFE_INTEGER : -1); + const previousCurrentPageIndex = useRef(getPreviousCurrentPageIndex(resumeMode)); + + if (handleAsInitialRender) { + previousCurrentPageIndex.current = getPreviousCurrentPageIndex(resumeMode); + } + const pagesIndexesToRender = useMemo( () => getPageIndexesToLoad( diff --git a/src/modules/reader/types/Reader.types.ts b/src/modules/reader/types/Reader.types.ts index cf8f56b9..37a50d37 100644 --- a/src/modules/reader/types/Reader.types.ts +++ b/src/modules/reader/types/Reader.types.ts @@ -292,6 +292,8 @@ export interface ReaderPagerProps isPreviousChapter: boolean; isNextChapter: boolean; isPreloadMode: boolean; + resumeMode: ReaderResumeMode; + handleAsInitialRender: boolean; } export enum PageInViewportType {