Reduce rerenders on reader overlay visibility change

This commit is contained in:
schroda
2025-09-27 15:36:50 +02:00
parent b1babc9dd1
commit d7690f9a36
2 changed files with 8 additions and 10 deletions

View File

@@ -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);

View File

@@ -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 (