Reduce rerenders on reader overlay visibility change
This commit is contained in:
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
import Box from '@mui/material/Box';
|
import Box from '@mui/material/Box';
|
||||||
import { memo, useCallback, useRef, useState } from 'react';
|
import { memo, useCallback, useRef, useState } from 'react';
|
||||||
import { BaseReaderOverlayProps, MobileHeaderProps } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import { ReaderSettings } from '@/features/reader/settings/screens/ReaderSettings.tsx';
|
import { ReaderSettings } from '@/features/reader/settings/screens/ReaderSettings.tsx';
|
||||||
import { ReaderPageNumber } from '@/features/reader/overlay/components/ReaderPageNumber.tsx';
|
import { ReaderPageNumber } from '@/features/reader/overlay/components/ReaderPageNumber.tsx';
|
||||||
import { StandardReaderProgressBar } from '@/features/reader/overlay/progress-bar/desktop/StandardReaderProgressBar.tsx';
|
import { StandardReaderProgressBar } from '@/features/reader/overlay/progress-bar/desktop/StandardReaderProgressBar.tsx';
|
||||||
@@ -18,14 +17,14 @@ import { ReaderBottomBarMobile } from '@/features/reader/overlay/navigation/mobi
|
|||||||
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
|
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
|
||||||
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
||||||
import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
|
import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
|
||||||
|
import { useReaderOverlayStore } from '@/features/reader/stores/ReaderStore.ts';
|
||||||
|
|
||||||
const BaseReaderOverlay = ({
|
const BaseReaderOverlay = ({
|
||||||
isVisible,
|
|
||||||
isDesktop,
|
isDesktop,
|
||||||
isMobile,
|
isMobile,
|
||||||
}: BaseReaderOverlayProps &
|
}: Pick<ReturnType<typeof ReaderService.useOverlayMode>, 'isDesktop' | 'isMobile'>) => {
|
||||||
MobileHeaderProps &
|
const isVisible = useReaderOverlayStore((state) => state.overlay.isVisible);
|
||||||
Pick<ReturnType<typeof ReaderService.useOverlayMode>, 'isDesktop' | 'isMobile'>) => {
|
|
||||||
const [areSettingsOpen, setAreSettingsOpen] = useState(false);
|
const [areSettingsOpen, setAreSettingsOpen] = useState(false);
|
||||||
|
|
||||||
const [mobileHeaderHeight, setMobileHeaderHeight] = useState(0);
|
const [mobileHeaderHeight, setMobileHeaderHeight] = useState(0);
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ import { useAppTitle } from '@/features/navigation-bar/hooks/useAppTitle.ts';
|
|||||||
import { useChapterListOptions } from '@/features/chapter/utils/ChapterList.util.tsx';
|
import { useChapterListOptions } from '@/features/chapter/utils/ChapterList.util.tsx';
|
||||||
import { FALLBACK_MANGA } from '@/features/manga/Manga.constants.ts';
|
import { FALLBACK_MANGA } from '@/features/manga/Manga.constants.ts';
|
||||||
import {
|
import {
|
||||||
|
getReaderOverlayStore,
|
||||||
getReaderStore,
|
getReaderStore,
|
||||||
useReaderChaptersStore,
|
useReaderChaptersStore,
|
||||||
useReaderOverlayStore,
|
|
||||||
useReaderSettingsStore,
|
useReaderSettingsStore,
|
||||||
useReaderStore,
|
useReaderStore,
|
||||||
useReaderTapZoneStore,
|
useReaderTapZoneStore,
|
||||||
@@ -52,7 +52,6 @@ const BaseReader = ({
|
|||||||
}: Pick<NavbarContextType, 'setOverride' | 'readerNavBarWidth'>) => {
|
}: Pick<NavbarContextType, 'setOverride' | 'readerNavBarWidth'>) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const manga = useReaderStore((state) => state.manga);
|
const manga = useReaderStore((state) => state.manga);
|
||||||
const overlay = useReaderOverlayStore((state) => state.overlay);
|
|
||||||
const { mangaChapters, initialChapter, chapterForDuplicatesHandling, currentChapter } = useReaderChaptersStore(
|
const { mangaChapters, initialChapter, chapterForDuplicatesHandling, currentChapter } = useReaderChaptersStore(
|
||||||
(state) => ({
|
(state) => ({
|
||||||
mangaChapters: state.chapters.mangaChapters,
|
mangaChapters: state.chapters.mangaChapters,
|
||||||
@@ -160,10 +159,10 @@ const BaseReader = ({
|
|||||||
value: (
|
value: (
|
||||||
<Box sx={{ position: 'absolute' }}>
|
<Box sx={{ position: 'absolute' }}>
|
||||||
<ReaderHotkeys scrollElementRef={scrollElementRef} />
|
<ReaderHotkeys scrollElementRef={scrollElementRef} />
|
||||||
<ReaderOverlay isVisible={overlay.isVisible} />
|
<ReaderOverlay />
|
||||||
{!scrollElementRef.current && (
|
{!scrollElementRef.current && (
|
||||||
<Box
|
<Box
|
||||||
onClick={() => overlay.setIsVisible(!overlay.isVisible)}
|
onClick={() => getReaderOverlayStore().setIsVisible(!getReaderOverlayStore().isVisible)}
|
||||||
sx={{
|
sx={{
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: 0,
|
top: 0,
|
||||||
@@ -179,7 +178,7 @@ const BaseReader = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
return () => setOverride({ status: false, value: null });
|
return () => setOverride({ status: false, value: null });
|
||||||
}, [overlay.isVisible, scrollElementRef.current]);
|
}, [scrollElementRef.current]);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
Reference in New Issue
Block a user