From b1babc9dd17fdc771f5fecd540df9ad68816142d Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 27 Sep 2025 14:01:35 +0200 Subject: [PATCH] Preserve correct page index during reader resize Ensure the restored page index is based on the page index at the start of a resize event to maintain consistency. At least in the continuous horizontal mode, it was possible to sometimes cause the page to change while resizing. --- .../hooks/useReaderPreserveScrollPosition.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts b/src/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts index 3c62635b..4b8e3fa4 100644 --- a/src/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts +++ b/src/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts @@ -63,17 +63,31 @@ const usePreserveOnWindowResize = ( pageIndex: number, ) => { const previousDimensionsRef = useRef({ width: window.innerWidth, height: window.innerHeight }); + const isResizeInProgressRef = useRef(false); + const activeResizeTimeoutRef = useRef(undefined); + const pageIndexOnResizeStartRef = useRef(null); const handleResize = useCallback(() => { const { width, height } = previousDimensionsRef.current; previousDimensionsRef.current = { width: window.innerWidth, height: window.innerHeight }; + if (!isResizeInProgressRef.current) { + isResizeInProgressRef.current = true; + pageIndexOnResizeStartRef.current = pageIndex; + } + if (!shouldPreserveOnResizeChange(readingMode, pageScaleMode, width, height)) { return; } - setPageToScrollToIndex(pageIndex); - }, [readingMode, pageScaleMode, pageIndex]); + setPageToScrollToIndex(pageIndexOnResizeStartRef.current); + + clearTimeout(activeResizeTimeoutRef.current); + activeResizeTimeoutRef.current = setTimeout(() => { + isResizeInProgressRef.current = false; + pageIndexOnResizeStartRef.current = null; + }, 50); + }, [readingMode, pageScaleMode]); useWindowEvent('resize', handleResize); };