Fix restoring initial page in vertical and horizontal pager (#622)
The initial page was scrolled into view before it had a height which resulted in the scroll position to stay at the top of the screen
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { MouseEvent as ReactMouseEvent, useEffect, useRef } from 'react';
|
||||
import { MouseEvent as ReactMouseEvent, useEffect, useLayoutEffect, useRef } from 'react';
|
||||
import { Box } from '@mui/material';
|
||||
import { IReaderProps } from '@/typings';
|
||||
import { Page } from '@/components/reader/Page';
|
||||
@@ -107,12 +107,18 @@ export function HorizontalPager(props: IReaderProps) {
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
// Delay scrolling to next cycle
|
||||
setTimeout(() => {
|
||||
// scroll last read page into view when initialPage changes
|
||||
pagesRef.current[initialPage]?.scrollIntoView({ inline: 'center' });
|
||||
}, 0);
|
||||
useLayoutEffect(() => {
|
||||
const initialPageElement = pagesRef.current[initialPage];
|
||||
if (!initialPageElement) {
|
||||
return () => {};
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(() => {
|
||||
initialPageElement.scrollIntoView({ inline: 'center' });
|
||||
});
|
||||
resizeObserver.observe(initialPageElement);
|
||||
|
||||
return () => resizeObserver.disconnect();
|
||||
}, [initialPage]);
|
||||
|
||||
useEffect(() => {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { useCallback, useEffect, useRef } from 'react';
|
||||
import { useCallback, useEffect, useLayoutEffect, useRef } from 'react';
|
||||
import { Box } from '@mui/material';
|
||||
import { IReaderProps } from '@/typings';
|
||||
import { Page } from '@/components/reader/Page';
|
||||
@@ -165,12 +165,18 @@ export function VerticalPager(props: IReaderProps) {
|
||||
};
|
||||
}, [go]);
|
||||
|
||||
useEffect(() => {
|
||||
// Delay scrolling to next cycle
|
||||
setTimeout(() => {
|
||||
// scroll last read page into view when initialPage changes
|
||||
pagesRef.current[initialPage]?.scrollIntoView();
|
||||
}, 0);
|
||||
useLayoutEffect(() => {
|
||||
const initialPageElement = pagesRef.current[initialPage];
|
||||
if (!initialPageElement) {
|
||||
return () => {};
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(() => {
|
||||
initialPageElement.scrollIntoView();
|
||||
});
|
||||
resizeObserver.observe(initialPageElement);
|
||||
|
||||
return () => resizeObserver.disconnect();
|
||||
}, [initialPage]);
|
||||
|
||||
return (
|
||||
|
||||
Reference in New Issue
Block a user