Access reader store setters directly without hook

This commit is contained in:
schroda
2026-02-21 15:34:17 +01:00
parent 75cf18b254
commit daeb2a4e45
21 changed files with 118 additions and 216 deletions

View File

@@ -8,20 +8,21 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { IReaderSettings } from '@/features/reader/Reader.types.ts'; import { IReaderSettings } from '@/features/reader/Reader.types.ts';
import { getReaderAutoScrollStore, useReaderAutoScrollStore } from '@/features/reader/stores/ReaderStore.ts';
export const useReaderAutoScroll = (isOverlayVisible: boolean, isStaticNav: IReaderSettings['isStaticNav']): void => {
const { isPaused } = useReaderAutoScrollStore((state) => ({
isPaused: state.autoScroll.isPaused,
}));
export const useReaderAutoScroll = (
isOverlayVisible: boolean,
isAutoScrollPaused: boolean,
pauseAutoScroll: () => void,
resumeAutoScroll: () => void,
isStaticNav: IReaderSettings['isStaticNav'],
): void => {
useEffect(() => { useEffect(() => {
const { pause, resume } = getReaderAutoScrollStore();
if (isOverlayVisible && !isStaticNav) { if (isOverlayVisible && !isStaticNav) {
pauseAutoScroll(); pause();
return; return;
} }
resumeAutoScroll(); resume();
}, [isOverlayVisible, isAutoScrollPaused, isStaticNav]); }, [isOverlayVisible, isPaused, isStaticNav]);
}; };

View File

@@ -19,7 +19,7 @@ import { plural } from '@lingui/core/macro';
import { IReaderSettings } from '@/features/reader/Reader.types.ts'; import { IReaderSettings } from '@/features/reader/Reader.types.ts';
import { AUTO_SCROLL_SPEED } from '@/features/reader/settings/ReaderSettings.constants.tsx'; import { AUTO_SCROLL_SPEED } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { coerceIn } from '@/lib/HelperFunctions.ts'; import { coerceIn } from '@/lib/HelperFunctions.ts';
import { useReaderAutoScrollStore } from '@/features/reader/stores/ReaderStore.ts'; import { getReaderAutoScrollStore, useReaderAutoScrollStore } from '@/features/reader/stores/ReaderStore.ts';
export const ReaderNavBarDesktopAutoScroll = ({ export const ReaderNavBarDesktopAutoScroll = ({
autoScroll, autoScroll,
@@ -28,10 +28,7 @@ export const ReaderNavBarDesktopAutoScroll = ({
setAutoScroll: (newAutoScroll: IReaderSettings['autoScroll'], commit: boolean) => void; setAutoScroll: (newAutoScroll: IReaderSettings['autoScroll'], commit: boolean) => void;
}) => { }) => {
const { t } = useLingui(); const { t } = useLingui();
const { isActive, toggleActive } = useReaderAutoScrollStore((state) => ({ const isActive = useReaderAutoScrollStore((state) => state.autoScroll.isActive);
isActive: state.autoScroll.isActive,
toggleActive: state.autoScroll.toggleActive,
}));
const updateTimeout = useRef<NodeJS.Timeout>(undefined); const updateTimeout = useRef<NodeJS.Timeout>(undefined);
@@ -40,7 +37,7 @@ export const ReaderNavBarDesktopAutoScroll = ({
<Button <Button
sx={{ justifyContent: 'start', textTransform: 'unset', flexGrow: 1 }} sx={{ justifyContent: 'start', textTransform: 'unset', flexGrow: 1 }}
size="large" size="large"
onClick={toggleActive} onClick={() => getReaderAutoScrollStore().toggleActive()}
color={isActive ? 'secondary' : 'primary'} color={isActive ? 'secondary' : 'primary'}
variant="contained" variant="contained"
startIcon={isActive ? <PauseCircleFilledIcon /> : <PlayCircleFilledIcon />} startIcon={isActive ? <PauseCircleFilledIcon /> : <PlayCircleFilledIcon />}

View File

@@ -13,16 +13,16 @@ import {
useDefaultReaderSettings, useDefaultReaderSettings,
} from '@/features/reader/settings/ReaderSettingsMetadata.ts'; } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
import { isAutoWebtoonMode } from '@/features/reader/settings/ReaderSettings.utils.tsx'; import { isAutoWebtoonMode } from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { ReadingMode, TReaderStateSettingsContext } from '@/features/reader/Reader.types.ts'; import { ReadingMode } from '@/features/reader/Reader.types.ts';
import { GetMangaReaderQuery } from '@/lib/graphql/generated/graphql.ts'; import { GetMangaReaderQuery } from '@/lib/graphql/generated/graphql.ts';
import { requestManager } from '@/lib/requests/RequestManager.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts';
import { getReaderSettingsStore } from '@/features/reader/stores/ReaderStore.ts';
export const useReaderSetSettingsState = ( export const useReaderSetSettingsState = (
mangaResponse: ReturnType<typeof requestManager.useGetManga<GetMangaReaderQuery>>, mangaResponse: ReturnType<typeof requestManager.useGetManga<GetMangaReaderQuery>>,
defaultSettingsResponse: ReturnType<typeof useDefaultReaderSettings>['request'], defaultSettingsResponse: ReturnType<typeof useDefaultReaderSettings>['request'],
defaultSettings: ReturnType<typeof useDefaultReaderSettings>['settings'], defaultSettings: ReturnType<typeof useDefaultReaderSettings>['settings'],
defaultSettingsMetadata: ReturnType<typeof useDefaultReaderSettings>['metadata'], defaultSettingsMetadata: ReturnType<typeof useDefaultReaderSettings>['metadata'],
setSettings: TReaderStateSettingsContext['setSettings'],
setAreSettingsSet: (areSet: boolean) => void, setAreSettingsSet: (areSet: boolean) => void,
) => { ) => {
useEffect(() => { useEffect(() => {
@@ -56,7 +56,7 @@ export const useReaderSetSettingsState = (
); );
const finalSettings = getReaderSettingsFor(mangaFromResponse, profileSettings); const finalSettings = getReaderSettingsFor(mangaFromResponse, profileSettings);
setSettings(finalSettings); getReaderSettingsStore().setSettings(finalSettings);
setAreSettingsSet(true); setAreSettingsSet(true);
}, [mangaResponse.data?.manga, defaultSettings]); }, [mangaResponse.data?.manga, defaultSettings]);
}; };

View File

@@ -13,7 +13,7 @@ import { useLingui } from '@lingui/react/macro';
import { IReaderSettings, IReaderSettingsWithDefaultFlag } from '@/features/reader/Reader.types.ts'; import { IReaderSettings, IReaderSettingsWithDefaultFlag } from '@/features/reader/Reader.types.ts';
import { makeToast } from '@/base/utils/Toast.ts'; import { makeToast } from '@/base/utils/Toast.ts';
import { READING_MODE_VALUE_TO_DISPLAY_DATA } from '@/features/reader/settings/ReaderSettings.constants.tsx'; import { READING_MODE_VALUE_TO_DISPLAY_DATA } from '@/features/reader/settings/ReaderSettings.constants.tsx';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts'; import { getReaderTapZoneStore } from '@/features/reader/stores/ReaderStore.ts';
const HIDE_PREVIEW_TIMEOUT = d(5).seconds.inWholeMilliseconds; const HIDE_PREVIEW_TIMEOUT = d(5).seconds.inWholeMilliseconds;
@@ -26,7 +26,6 @@ export const useReaderShowSettingPreviewOnChange = (
tapZoneInvertMode: IReaderSettingsWithDefaultFlag['tapZoneInvertMode'], tapZoneInvertMode: IReaderSettingsWithDefaultFlag['tapZoneInvertMode'],
shouldShowReadingModePreview: IReaderSettings['shouldShowReadingModePreview'], shouldShowReadingModePreview: IReaderSettings['shouldShowReadingModePreview'],
shouldShowTapZoneLayoutPreview: IReaderSettings['shouldShowTapZoneLayoutPreview'], shouldShowTapZoneLayoutPreview: IReaderSettings['shouldShowTapZoneLayoutPreview'],
setShowPreview: TReaderTapZoneContext['setShowPreview'],
) => { ) => {
const { t } = useLingui(); const { t } = useLingui();
@@ -55,9 +54,9 @@ export const useReaderShowSettingPreviewOnChange = (
JSON.stringify(tapZoneInvertMode) !== JSON.stringify(previousTapZoneInvertMode.current); JSON.stringify(tapZoneInvertMode) !== JSON.stringify(previousTapZoneInvertMode.current);
const showTapZoneLayoutPreview = shouldShowTapZoneLayoutPreview && didTapZoneLayoutChange; const showTapZoneLayoutPreview = shouldShowTapZoneLayoutPreview && didTapZoneLayoutChange;
if (showTapZoneLayoutPreview) { if (showTapZoneLayoutPreview) {
setShowPreview(true); getReaderTapZoneStore().setShowPreview(true);
if (isInitialPreview.current) { if (isInitialPreview.current) {
setTimeout(() => setShowPreview(false), HIDE_PREVIEW_TIMEOUT); setTimeout(() => getReaderTapZoneStore().setShowPreview(false), HIDE_PREVIEW_TIMEOUT);
} }
} }
previousTapZoneLayout.current = tapZoneLayout; previousTapZoneLayout.current = tapZoneLayout;

View File

@@ -27,7 +27,6 @@ import {
getReaderAutoScrollStore, getReaderAutoScrollStore,
getReaderOverlayStore, getReaderOverlayStore,
getReaderSettingsStore, getReaderSettingsStore,
getReaderTapZoneStore,
useReaderSettingsStore, useReaderSettingsStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
@@ -92,7 +91,6 @@ export const ReaderHotkeys = ({
readingMode.value, readingMode.value,
readingDirection.value, readingDirection.value,
scrollElementRef.current, scrollElementRef.current,
getReaderTapZoneStore().setShowPreview,
scrollAmount, scrollAmount,
); );
}); });
@@ -115,7 +113,6 @@ export const ReaderHotkeys = ({
readingMode.value, readingMode.value,
readingDirection.value, readingDirection.value,
scrollElementRef.current, scrollElementRef.current,
getReaderTapZoneStore().setShowPreview,
scrollAmount, scrollAmount,
); );
}); });

View File

@@ -7,15 +7,20 @@
*/ */
import { MutableRefObject, useEffect } from 'react'; import { MutableRefObject, useEffect } from 'react';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts'; import {
import { getReaderOverlayStore } from '@/features/reader/stores/ReaderStore.ts'; getReaderOverlayStore,
getReaderTapZoneStore,
useReaderTapZoneStore,
} from '@/features/reader/stores/ReaderStore.ts';
export const useReaderHideOverlayOnUserScroll = ( export const useReaderHideOverlayOnUserScroll = (
isOverlayVisible: boolean, isOverlayVisible: boolean,
showPreview: TReaderTapZoneContext['showPreview'],
setShowPreview: TReaderTapZoneContext['setShowPreview'],
scrollElementRef: MutableRefObject<HTMLDivElement | null>, scrollElementRef: MutableRefObject<HTMLDivElement | null>,
) => { ) => {
const { showPreview } = useReaderTapZoneStore((state) => ({
showPreview: state.tapZone.showPreview,
}));
useEffect(() => { useEffect(() => {
const handleScroll = () => { const handleScroll = () => {
if (isOverlayVisible) { if (isOverlayVisible) {
@@ -23,7 +28,7 @@ export const useReaderHideOverlayOnUserScroll = (
} }
if (showPreview) { if (showPreview) {
setShowPreview(false); getReaderTapZoneStore().setShowPreview(false);
} }
}; };

View File

@@ -22,7 +22,11 @@ import { CHAPTER_ACTION_TO_TRANSLATION, FALLBACK_CHAPTER } from '@/features/chap
import { IconBrowser } from '@/assets/icons/IconBrowser.tsx'; import { IconBrowser } from '@/assets/icons/IconBrowser.tsx';
import { IconWebView } from '@/assets/icons/IconWebView.tsx'; import { IconWebView } from '@/assets/icons/IconWebView.tsx';
import { requestManager } from '@/lib/requests/RequestManager.ts'; import { requestManager } from '@/lib/requests/RequestManager.ts';
import { useReaderChaptersStore, useReaderPagesStore } from '@/features/reader/stores/ReaderStore.ts'; import {
getReaderPagesStore,
useReaderChaptersStore,
useReaderPagesStore,
} from '@/features/reader/stores/ReaderStore.ts';
import { ChapterDownloadInfo, ChapterIdInfo } from '@/features/chapter/Chapter.types.ts'; import { ChapterDownloadInfo, ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
const DownloadButton = ({ id = -1, isDownloaded }: ChapterIdInfo & ChapterDownloadInfo) => { const DownloadButton = ({ id = -1, isDownloaded }: ChapterIdInfo & ChapterDownloadInfo) => {
@@ -68,11 +72,7 @@ export const ReaderNavBarDesktopActions = memo(() => {
})); }));
const { t } = useLingui(); const { t } = useLingui();
const { pageLoadStates, setPageLoadStates, setRetryFailedPagesKeyPrefix } = useReaderPagesStore((state) => ({ const pageLoadStates = useReaderPagesStore((state) => state.pages.pageLoadStates);
pageLoadStates: state.pages.pageLoadStates,
setPageLoadStates: state.pages.setPageLoadStates,
setRetryFailedPagesKeyPrefix: state.pages.setRetryFailedPagesKeyPrefix,
}));
const pageRetryKeyPrefix = useRef<number>(0); const pageRetryKeyPrefix = useRef<number>(0);
@@ -88,13 +88,13 @@ export const ReaderNavBarDesktopActions = memo(() => {
<CustomTooltip title={t`Retry errored pages`} disabled={!haveSomePagesFailedToLoad}> <CustomTooltip title={t`Retry errored pages`} disabled={!haveSomePagesFailedToLoad}>
<IconButton <IconButton
onClick={() => { onClick={() => {
setPageLoadStates((statePageLoadStates) => getReaderPagesStore().setPageLoadStates((statePageLoadStates) =>
statePageLoadStates.map((pageLoadState) => ({ statePageLoadStates.map((pageLoadState) => ({
url: pageLoadState.url, url: pageLoadState.url,
loaded: pageLoadState.loaded, loaded: pageLoadState.loaded,
})), })),
); );
setRetryFailedPagesKeyPrefix(`${pageRetryKeyPrefix.current}`); getReaderPagesStore().setRetryFailedPagesKeyPrefix(`${pageRetryKeyPrefix.current}`);
pageRetryKeyPrefix.current = (pageRetryKeyPrefix.current + 1) % 1000; pageRetryKeyPrefix.current = (pageRetryKeyPrefix.current + 1) % 1000;
}} }}
disabled={!haveSomePagesFailedToLoad} disabled={!haveSomePagesFailedToLoad}

View File

@@ -15,14 +15,15 @@ import { ReaderService } from '@/features/reader/services/ReaderService.ts';
import { DefaultSettingFootnote } from '@/features/reader/settings/components/DefaultSettingFootnote.tsx'; import { DefaultSettingFootnote } from '@/features/reader/settings/components/DefaultSettingFootnote.tsx';
import { ReaderSettingAutoScroll } from '@/features/reader/auto-scroll/settings/ReaderSettingAutoScroll.tsx'; import { ReaderSettingAutoScroll } from '@/features/reader/auto-scroll/settings/ReaderSettingAutoScroll.tsx';
import { CheckboxInput } from '@/base/components/inputs/CheckboxInput.tsx'; import { CheckboxInput } from '@/base/components/inputs/CheckboxInput.tsx';
import { useReaderAutoScrollStore, useReaderSettingsStore } from '@/features/reader/stores/ReaderStore.ts'; import {
getReaderAutoScrollStore,
useReaderAutoScrollStore,
useReaderSettingsStore,
} from '@/features/reader/stores/ReaderStore.ts';
const BaseReaderBottomBarMobileQuickSettings = () => { const BaseReaderBottomBarMobileQuickSettings = () => {
const { t } = useLingui(); const { t } = useLingui();
const { isActive, toggleActive } = useReaderAutoScrollStore((state) => ({ const isActive = useReaderAutoScrollStore((state) => state.autoScroll.isActive);
isActive: state.autoScroll.isActive,
toggleActive: state.autoScroll.toggleActive,
}));
const { readingMode, readingDirection, autoScroll } = useReaderSettingsStore((state) => ({ const { readingMode, readingDirection, autoScroll } = useReaderSettingsStore((state) => ({
readingMode: state.settings.readingMode, readingMode: state.settings.readingMode,
readingDirection: state.settings.readingDirection, readingDirection: state.settings.readingDirection,
@@ -44,7 +45,11 @@ const BaseReaderBottomBarMobileQuickSettings = () => {
isDefaultable isDefaultable
onDefault={() => ReaderService.deleteSetting('readingDirection')} onDefault={() => ReaderService.deleteSetting('readingDirection')}
/> />
<CheckboxInput label={t`Auto scroll`} checked={isActive} onChange={() => toggleActive()} /> <CheckboxInput
label={t`Auto scroll`}
checked={isActive}
onChange={() => getReaderAutoScrollStore().toggleActive()}
/>
<ReaderSettingAutoScroll <ReaderSettingAutoScroll
autoScroll={autoScroll} autoScroll={autoScroll}
setAutoScroll={(...args) => ReaderService.updateSetting('autoScroll', ...args)} setAutoScroll={(...args) => ReaderService.updateSetting('autoScroll', ...args)}

View File

@@ -32,6 +32,7 @@ import { ReaderProgressBarSlotWrapper } from '@/features/reader/overlay/progress
import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx'; import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
import { ReadingMode } from '@/features/reader/Reader.types.ts'; import { ReadingMode } from '@/features/reader/Reader.types.ts';
import { import {
getReaderProgressBarStore,
useReaderPagesStore, useReaderPagesStore,
useReaderProgressBarStore, useReaderProgressBarStore,
useReaderSettingsStore, useReaderSettingsStore,
@@ -73,10 +74,7 @@ const BaseReaderProgressBar = ({
currentPageIndex: state.pages.currentPageIndex, currentPageIndex: state.pages.currentPageIndex,
})); }));
const readingMode = useReaderSettingsStore((state) => state.settings.readingMode.value); const readingMode = useReaderSettingsStore((state) => state.settings.readingMode.value);
const { isDragging, setIsDragging } = useReaderProgressBarStore((state) => ({ const isDragging = useReaderProgressBarStore((state) => state.progressBar.isDragging);
isDragging: state.progressBar.isDragging,
setIsDragging: state.progressBar.setIsDragging,
}));
const progressBarRef = useRef<HTMLDivElement | null>(null); const progressBarRef = useRef<HTMLDivElement | null>(null);
const draggingDetectionTimeout = useRef<NodeJS.Timeout>(undefined); const draggingDetectionTimeout = useRef<NodeJS.Timeout>(undefined);
@@ -147,11 +145,11 @@ const BaseReaderProgressBar = ({
); );
clearTimeout(draggingDetectionTimeout.current); clearTimeout(draggingDetectionTimeout.current);
draggingDetectionTimeout.current = setTimeout(() => setIsDragging(true), 250); draggingDetectionTimeout.current = setTimeout(() => getReaderProgressBarStore().setIsDragging(true), 250);
}; };
const handleMouseUp = () => { const handleMouseUp = () => {
setIsDragging(false); getReaderProgressBarStore().setIsDragging(false);
clearTimeout(draggingDetectionTimeout.current); clearTimeout(draggingDetectionTimeout.current);
}; };
@@ -174,7 +172,7 @@ const BaseReaderProgressBar = ({
> >
{currentPage.name} {currentPage.name}
</ReaderProgressBarPageNumber> </ReaderProgressBarPageNumber>
<ClickAwayListener onClickAway={() => setIsDragging(false)}> <ClickAwayListener onClickAway={() => getReaderProgressBarStore().setIsDragging(false)}>
<ReaderProgressBarSlotsActionArea <ReaderProgressBarSlotsActionArea
{...slotProps?.progressBarSlotsActionArea} {...slotProps?.progressBarSlotsActionArea}
onMouseDown={handleMouseDown} onMouseDown={handleMouseDown}

View File

@@ -25,6 +25,7 @@ import {
useReaderProgressBarStore, useReaderProgressBarStore,
useReaderScrollbarStore, useReaderScrollbarStore,
useReaderSettingsStore, useReaderSettingsStore,
getReaderProgressBarStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
const BaseStandardReaderProgressBar = ({ const BaseStandardReaderProgressBar = ({
@@ -44,9 +45,8 @@ const BaseStandardReaderProgressBar = ({
progressBarPosition: state.settings.progressBarPosition, progressBarPosition: state.settings.progressBarPosition,
progressBarPositionAutoVertical: state.settings.progressBarPositionAutoVertical, progressBarPositionAutoVertical: state.settings.progressBarPositionAutoVertical,
})); }));
const { isMaximized, setIsMaximized, isDragging } = useReaderProgressBarStore((state) => ({ const { isMaximized, isDragging } = useReaderProgressBarStore((state) => ({
isMaximized: state.progressBar.isMaximized, isMaximized: state.progressBar.isMaximized,
setIsMaximized: state.progressBar.setIsMaximized,
isDragging: state.progressBar.isDragging, isDragging: state.progressBar.isDragging,
})); }));
@@ -151,8 +151,8 @@ const BaseStandardReaderProgressBar = ({
pointerEvents: 'none', pointerEvents: 'none',
}), }),
}, },
onMouseEnter: () => setIsMaximized(true), onMouseEnter: () => getReaderProgressBarStore().setIsMaximized(true),
onMouseLeave: () => setIsMaximized(false), onMouseLeave: () => getReaderProgressBarStore().setIsMaximized(false),
}, },
progressBarRoot: { progressBarRoot: {
sx: { sx: {

View File

@@ -35,6 +35,7 @@ import {
useReaderProgressBarStore, useReaderProgressBarStore,
useReaderScrollbarStore, useReaderScrollbarStore,
useReaderSettingsStore, useReaderSettingsStore,
getReaderProgressBarStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts'; import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
@@ -69,10 +70,7 @@ const BaseMobileReaderProgressBar = ({
progressBarPosition: state.settings.progressBarPosition, progressBarPosition: state.settings.progressBarPosition,
progressBarPositionAutoVertical: state.settings.progressBarPositionAutoVertical, progressBarPositionAutoVertical: state.settings.progressBarPositionAutoVertical,
})); }));
const { setIsMaximized, isDragging } = useReaderProgressBarStore((state) => ({ const isDragging = useReaderProgressBarStore((state) => state.progressBar.isDragging);
setIsMaximized: state.progressBar.setIsMaximized,
isDragging: state.progressBar.isDragging,
}));
const [, setRefreshProgressBarPosition] = useState({}); const [, setRefreshProgressBarPosition] = useState({});
useResizeObserver( useResizeObserver(
@@ -218,9 +216,9 @@ const BaseMobileReaderProgressBar = ({
); );
useLayoutEffect(() => { useLayoutEffect(() => {
setIsMaximized(isVisible); getReaderProgressBarStore().setIsMaximized(isVisible);
return () => setIsMaximized(false); return () => getReaderProgressBarStore().setIsMaximized(false);
}, [isVisible]); }, [isVisible]);
return ( return (

View File

@@ -41,7 +41,6 @@ import {
useReaderChaptersStore, useReaderChaptersStore,
useReaderSettingsStore, useReaderSettingsStore,
useReaderStore, useReaderStore,
useReaderTapZoneStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
import { ReaderAutoScroll } from '@/features/reader/auto-scroll/ReaderAutoScroll.tsx'; import { ReaderAutoScroll } from '@/features/reader/auto-scroll/ReaderAutoScroll.tsx';
@@ -68,7 +67,6 @@ const BaseReader = ({
tapZoneInvertMode, tapZoneInvertMode,
shouldShowReadingModePreview, shouldShowReadingModePreview,
shouldShowTapZoneLayoutPreview, shouldShowTapZoneLayoutPreview,
setSettings,
} = useReaderSettingsStore((state) => ({ } = useReaderSettingsStore((state) => ({
shouldSkipDupChapters: state.settings.shouldSkipDupChapters, shouldSkipDupChapters: state.settings.shouldSkipDupChapters,
shouldSkipFilteredChapters: state.settings.shouldSkipFilteredChapters, shouldSkipFilteredChapters: state.settings.shouldSkipFilteredChapters,
@@ -78,9 +76,7 @@ const BaseReader = ({
tapZoneInvertMode: state.settings.tapZoneInvertMode, tapZoneInvertMode: state.settings.tapZoneInvertMode,
shouldShowReadingModePreview: state.settings.shouldShowReadingModePreview, shouldShowReadingModePreview: state.settings.shouldShowReadingModePreview,
shouldShowTapZoneLayoutPreview: state.settings.shouldShowTapZoneLayoutPreview, shouldShowTapZoneLayoutPreview: state.settings.shouldShowTapZoneLayoutPreview,
setSettings: state.settings.setSettings,
})); }));
const setShowPreview = useReaderTapZoneStore((state) => state.tapZone.setShowPreview);
const scrollElementRef = useRef<HTMLDivElement | null>(null); const scrollElementRef = useRef<HTMLDivElement | null>(null);
@@ -127,7 +123,6 @@ const BaseReader = ({
defaultSettingsResponse, defaultSettingsResponse,
defaultSettings, defaultSettings,
defaultSettingsMetadata, defaultSettingsMetadata,
setSettings,
setAreSettingsSet, setAreSettingsSet,
); );
useReaderShowSettingPreviewOnChange( useReaderShowSettingPreviewOnChange(
@@ -139,7 +134,6 @@ const BaseReader = ({
tapZoneInvertMode, tapZoneInvertMode,
shouldShowReadingModePreview, shouldShowReadingModePreview,
shouldShowTapZoneLayoutPreview, shouldShowTapZoneLayoutPreview,
setShowPreview,
); );
useReaderSetChaptersState( useReaderSetChaptersState(
chaptersResponse, chaptersResponse,

View File

@@ -36,7 +36,7 @@ import {
isEndOfPageInViewport, isEndOfPageInViewport,
isPageInViewport, isPageInViewport,
} from '@/features/reader/viewer/pager/ReaderPager.utils.tsx'; } from '@/features/reader/viewer/pager/ReaderPager.utils.tsx';
import { TapZoneRegionType, TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts'; import { TapZoneRegionType } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
import { ReaderTapZoneService } from '@/features/reader/tap-zones/ReaderTapZoneService.ts'; import { ReaderTapZoneService } from '@/features/reader/tap-zones/ReaderTapZoneService.ts';
import { isContinuousReadingMode } from '@/features/reader/settings/ReaderSettings.utils.tsx'; import { isContinuousReadingMode } from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { import {
@@ -100,7 +100,6 @@ export class ReaderControls {
readingMode: ReadingMode, readingMode: ReadingMode,
readingDirection: ReadingDirection, readingDirection: ReadingDirection,
element: HTMLElement, element: HTMLElement,
setShowPreview: TReaderTapZoneContext['setShowPreview'],
scrollAmountPercentage: number = ReaderScrollAmount.LARGE, scrollAmountPercentage: number = ReaderScrollAmount.LARGE,
): void { ): void {
if (!element) { if (!element) {
@@ -129,7 +128,7 @@ export class ReaderControls {
currentPos + elementSize * scrollAmount * scrollDirection; currentPos + elementSize * scrollAmount * scrollDirection;
getReaderOverlayStore().setIsVisible(false); getReaderOverlayStore().setIsVisible(false);
setShowPreview(false); getReaderTapZoneStore().setShowPreview(false);
const doScroll = ( const doScroll = (
isAtStartForDirection: boolean, isAtStartForDirection: boolean,
@@ -432,14 +431,8 @@ export class ReaderControls {
return useCallback( return useCallback(
(pageIndex, debounceChapterUpdate = true, endReached = false) => { (pageIndex, debounceChapterUpdate = true, endReached = false) => {
const { currentPageIndex, setCurrentPageIndex } = getReaderPagesStore(); const { currentPageIndex, setCurrentPageIndex } = getReaderPagesStore();
const { const { currentChapter, chapters, previousChapter, nextChapter, visibleChapters } =
currentChapter, getReaderChaptersStore();
chapters,
previousChapter,
nextChapter,
visibleChapters,
setReaderStateChapters,
} = getReaderChaptersStore();
if (pageIndex === currentPageIndex && !endReached) { if (pageIndex === currentPageIndex && !endReached) {
return; return;
@@ -464,7 +457,6 @@ export class ReaderControls {
direction === DirectionOffset.NEXT ? nextChapter : previousChapter, direction === DirectionOffset.NEXT ? nextChapter : previousChapter,
visibleChapters.lastLeadingChapterSourceOrder, visibleChapters.lastLeadingChapterSourceOrder,
visibleChapters.lastTrailingChapterSourceOrder, visibleChapters.lastTrailingChapterSourceOrder,
setReaderStateChapters,
direction, direction,
); );
@@ -581,7 +573,6 @@ export class ReaderControls {
readingMode.value, readingMode.value,
readingDirection.value, readingDirection.value,
scrollElement, scrollElement,
getReaderTapZoneStore().setShowPreview,
scrollAmount, scrollAmount,
); );
} else { } else {

View File

@@ -53,7 +53,6 @@ import {
useReaderSettingsStore, useReaderSettingsStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
import { ReactRouter } from '@/lib/react-router/ReactRouter.ts'; import { ReactRouter } from '@/lib/react-router/ReactRouter.ts';
import { ReaderChaptersStoreSlice } from '@/features/reader/stores/ReaderChaptersStore.ts';
import { getPage } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.utils.tsx'; import { getPage } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.utils.tsx';
const DIRECTION_TO_INVERTED: Record<Direction, Direction> = { const DIRECTION_TO_INVERTED: Record<Direction, Direction> = {
@@ -122,7 +121,6 @@ export class ReaderService {
chapter: TChapterReader | undefined | null, chapter: TChapterReader | undefined | null,
lastLeadingChapterSourceOrder: number, lastLeadingChapterSourceOrder: number,
lastTrailingChapterSourceOrder: number, lastTrailingChapterSourceOrder: number,
setReaderStateChapters: ReaderChaptersStoreSlice['chapters']['setReaderStateChapters'],
direction: DirectionOffset, direction: DirectionOffset,
): void { ): void {
if (!chapter) { if (!chapter) {
@@ -140,7 +138,7 @@ export class ReaderService {
return; return;
} }
setReaderStateChapters((state) => getReaderChaptersStore().setReaderStateChapters((state) =>
updateReaderStateVisibleChapters( updateReaderStateVisibleChapters(
isPreviousChapter, isPreviousChapter,
state, state,

View File

@@ -23,7 +23,6 @@ import { ReaderBehaviourSettings } from '@/features/reader/settings/behaviour/Re
import { ReaderDefaultLayoutSettings } from '@/features/reader/settings/layout/ReaderDefaultLayoutSettings.tsx'; import { ReaderDefaultLayoutSettings } from '@/features/reader/settings/layout/ReaderDefaultLayoutSettings.tsx';
import { ReaderHotkeysSettings } from '@/features/reader/hotkeys/settings/ReaderHotkeysSettings.tsx'; import { ReaderHotkeysSettings } from '@/features/reader/hotkeys/settings/ReaderHotkeysSettings.tsx';
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx'; import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
import { useReaderTapZoneStore } from '@/features/reader/stores/ReaderStore.ts';
const BaseReaderSettingsTabs = ({ const BaseReaderSettingsTabs = ({
activeTab, activeTab,
@@ -45,7 +44,6 @@ const BaseReaderSettingsTabs = ({
}) => { }) => {
const { t } = useLingui(); const { t } = useLingui();
const isTouchDevice = MediaQuery.useIsTouchDevice(); const isTouchDevice = MediaQuery.useIsTouchDevice();
const setShowPreview = useReaderTapZoneStore((state) => state.tapZone.setShowPreview);
return ( return (
<> <>
@@ -99,7 +97,6 @@ const BaseReaderSettingsTabs = ({
<ReaderLayoutSettings <ReaderLayoutSettings
settings={settings} settings={settings}
updateSetting={(...args) => updateSetting(...args)} updateSetting={(...args) => updateSetting(...args)}
setShowPreview={setShowPreview!}
isDefaultable={!areDefaultSettings} isDefaultable={!areDefaultSettings}
onDefault={(...args) => deleteSetting?.(...args)} onDefault={(...args) => deleteSetting?.(...args)}
isSeriesMode isSeriesMode

View File

@@ -20,11 +20,10 @@ import { ReaderSettingsTypeProps } from '@/features/reader/Reader.types.ts';
import { ReaderSettingPageGap } from '@/features/reader/settings/layout/components/ReaderSettingPageGap.tsx'; import { ReaderSettingPageGap } from '@/features/reader/settings/layout/components/ReaderSettingPageGap.tsx';
import { ReaderSettingWidth } from '@/features/reader/settings/layout/components/ReaderSettingWidth.tsx'; import { ReaderSettingWidth } from '@/features/reader/settings/layout/components/ReaderSettingWidth.tsx';
import { DefaultSettingFootnote } from '@/features/reader/settings/components/DefaultSettingFootnote.tsx'; import { DefaultSettingFootnote } from '@/features/reader/settings/components/DefaultSettingFootnote.tsx';
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts'; import { getReaderTapZoneStore } from '@/features/reader/stores/ReaderStore.ts';
import { ReaderDefaultLayoutSettings } from '@/features/reader/settings/layout/ReaderDefaultLayoutSettings.tsx'; import { ReaderDefaultLayoutSettings } from '@/features/reader/settings/layout/ReaderDefaultLayoutSettings.tsx';
export const ReaderLayoutSettings = ({ export const ReaderLayoutSettings = ({
setShowPreview,
settings, settings,
updateSetting, updateSetting,
isDefaultable, isDefaultable,
@@ -32,7 +31,6 @@ export const ReaderLayoutSettings = ({
isSeriesMode, isSeriesMode,
setTransparent, setTransparent,
}: ReaderSettingsTypeProps & { }: ReaderSettingsTypeProps & {
setShowPreview: TReaderTapZoneContext['setShowPreview'];
isSeriesMode?: boolean; isSeriesMode?: boolean;
}) => { }) => {
const { t } = useLingui(); const { t } = useLingui();
@@ -67,24 +65,24 @@ export const ReaderLayoutSettings = ({
<ReaderSettingTapZoneLayout <ReaderSettingTapZoneLayout
tapZoneLayout={settings.tapZoneLayout} tapZoneLayout={settings.tapZoneLayout}
setTapZoneLayout={(value) => { setTapZoneLayout={(value) => {
setShowPreview(true); getReaderTapZoneStore().setShowPreview(true);
updateSetting('tapZoneLayout', value); updateSetting('tapZoneLayout', value);
}} }}
isDefaultable={isDefaultable} isDefaultable={isDefaultable}
onDefault={() => { onDefault={() => {
setShowPreview(true); getReaderTapZoneStore().setShowPreview(true);
onDefault?.('tapZoneLayout'); onDefault?.('tapZoneLayout');
}} }}
/> />
<ReaderSettingTapZoneInvertMode <ReaderSettingTapZoneInvertMode
tapZoneInvertMode={settings.tapZoneInvertMode} tapZoneInvertMode={settings.tapZoneInvertMode}
setTapZoneInvertMode={(value) => { setTapZoneInvertMode={(value) => {
setShowPreview(true); getReaderTapZoneStore().setShowPreview(true);
updateSetting('tapZoneInvertMode', value); updateSetting('tapZoneInvertMode', value);
}} }}
isDefaultable={isDefaultable} isDefaultable={isDefaultable}
onDefault={() => { onDefault={() => {
setShowPreview(true); getReaderTapZoneStore().setShowPreview(true);
onDefault?.('tapZoneInvertMode'); onDefault?.('tapZoneInvertMode');
}} }}
/> />

View File

@@ -49,7 +49,6 @@ export const ReaderSettingProfileSettings = ({
<Stack sx={{ px: Number(!isSeriesMode) * 2 }}> <Stack sx={{ px: Number(!isSeriesMode) * 2 }}>
<ReaderLayoutSettings <ReaderLayoutSettings
{...props} {...props}
setShowPreview={() => {}}
settings={adjustedSettings} settings={adjustedSettings}
updateSetting={(setting, value, commit) => updateSetting(setting, value, commit, true, profile)} updateSetting={(setting, value, commit) => updateSetting(setting, value, commit, true, profile)}
/> />

View File

@@ -44,21 +44,13 @@ import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts'; import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
import { READER_DEFAULT_PAGES_STATE } from '@/features/reader/stores/ReaderPagesStore.ts'; import { READER_DEFAULT_PAGES_STATE } from '@/features/reader/stores/ReaderPagesStore.ts';
import { getReaderChaptersStore } from '@/features/reader/stores/ReaderStore.ts'; import { getReaderChaptersStore, getReaderPagesStore } from '@/features/reader/stores/ReaderStore.ts';
const BaseReaderChapterViewer = ({ const BaseReaderChapterViewer = ({
currentPageIndex, currentPageIndex,
setPages: setContextPages,
setPageUrls: setContextPageUrls,
setPageSpreadStates: setContextPageSpreadStates,
setPageLoadStates: setContextPageLoadStates,
setTotalPages: setContextTotalPages,
setCurrentPageIndex: setContextCurrentPageIndex,
updateCurrentPageIndex, updateCurrentPageIndex,
setPageToScrollToIndex,
transitionPageMode, transitionPageMode,
retryFailedPagesKeyPrefix, retryFailedPagesKeyPrefix,
setTransitionPageMode,
readingMode, readingMode,
readerWidth, readerWidth,
pageScaleMode, pageScaleMode,
@@ -89,20 +81,7 @@ const BaseReaderChapterViewer = ({
minWidth, minWidth,
minHeight, minHeight,
scrollElement, scrollElement,
}: Pick< }: Pick<ReaderStatePages, 'currentPageIndex' | 'transitionPageMode' | 'retryFailedPagesKeyPrefix'> &
ReaderStatePages,
| 'currentPageIndex'
| 'setPages'
| 'setPageUrls'
| 'setPageSpreadStates'
| 'setPageLoadStates'
| 'setTotalPages'
| 'setCurrentPageIndex'
| 'setPageToScrollToIndex'
| 'transitionPageMode'
| 'retryFailedPagesKeyPrefix'
| 'setTransitionPageMode'
> &
Omit<ReaderPagerProps, 'pages' | 'totalPages' | 'pageLoadStates' | 'handleAsInitialRender' | 'resumeMode'> & Omit<ReaderPagerProps, 'pages' | 'totalPages' | 'pageLoadStates' | 'handleAsInitialRender' | 'resumeMode'> &
Pick< Pick<
IReaderSettings, IReaderSettings,
@@ -205,14 +184,14 @@ const BaseReaderChapterViewer = ({
actualPages, actualPages,
(value) => { (value) => {
if (isCurrentChapterRef.current) { if (isCurrentChapterRef.current) {
setContextPageSpreadStates(value); getReaderPagesStore().setPageSpreadStates(value);
} }
setPagesToSpreadState(value); setPagesToSpreadState(value);
}, },
(value) => { (value) => {
if (isCurrentChapterRef.current) { if (isCurrentChapterRef.current) {
setContextPageLoadStates(value); getReaderPagesStore().setPageLoadStates(value);
} }
setPageLoadStates(value); setPageLoadStates(value);
@@ -226,7 +205,7 @@ const BaseReaderChapterViewer = ({
() => () =>
createHandleReaderPageLoadError((value) => { createHandleReaderPageLoadError((value) => {
if (isCurrentChapterRef.current) { if (isCurrentChapterRef.current) {
setContextPageLoadStates(value); getReaderPagesStore().setPageLoadStates(value);
} }
setPageLoadStates(value); setPageLoadStates(value);
@@ -274,29 +253,35 @@ const BaseReaderChapterViewer = ({
arePagesFetched, arePagesFetched,
setArePagesFetched, setArePagesFetched,
(value) => updateState(value, noOp, getReaderChaptersStore().setReaderStateChapters), (value) => updateState(value, noOp, getReaderChaptersStore().setReaderStateChapters),
(value) => updateState(value, setTotalPages, setContextTotalPages), (value) => updateState(value, setTotalPages, getReaderPagesStore().setTotalPages.bind(getReaderPagesStore())),
(value) => updateState(value, setPages, setContextPages), (value) => updateState(value, setPages, getReaderPagesStore().setPages.bind(getReaderPagesStore())),
(value) => updateState(value, setPageUrls, setContextPageUrls), (value) => updateState(value, setPageUrls, getReaderPagesStore().setPageUrls.bind(getReaderPagesStore())),
(value) => updateState(value, setPageLoadStates, setContextPageLoadStates), (value) =>
(value) => updateState(value, setPagesToSpreadState, setContextPageSpreadStates), updateState(value, setPageLoadStates, getReaderPagesStore().setPageLoadStates.bind(getReaderPagesStore())),
(value) => updateState(value, noOp, setContextCurrentPageIndex), (value) =>
updateState(
value,
setPagesToSpreadState,
getReaderPagesStore().setPageSpreadStates.bind(getReaderPagesStore()),
),
(value) => updateState(value, noOp, getReaderPagesStore().setCurrentPageIndex.bind(getReaderPagesStore())),
(value) => { (value) => {
if ((isInitialChapter && !arePagesFetched) || scrollIntoView) { if ((isInitialChapter && !arePagesFetched) || scrollIntoView) {
setPageToScrollToIndex(value); getReaderPagesStore().setPageToScrollToIndex(value);
getReaderChaptersStore().setReaderStateChapters((prevState) => ({ getReaderChaptersStore().setReaderStateChapters((prevState) => ({
...prevState, ...prevState,
visibleChapters: { ...prevState.visibleChapters, scrollIntoView: false, resumeMode: undefined }, visibleChapters: { ...prevState.visibleChapters, scrollIntoView: false, resumeMode: undefined },
})); }));
} }
}, },
(value) => updateState(value, noOp, setTransitionPageMode), (value) => updateState(value, noOp, getReaderPagesStore().setTransitionPageMode.bind(getReaderPagesStore())),
); );
useReaderConvertPagesForReadingMode( useReaderConvertPagesForReadingMode(
currentPageIndex, currentPageIndex,
actualPages, actualPages,
pageUrls, pageUrls,
(value) => updateState(value, setPages, setContextPages, true), (value) => updateState(value, setPages, getReaderPagesStore().setPages.bind(getReaderPagesStore()), true),
(value) => updateState(value, setPagesToSpreadState, noOp, true), (value) => updateState(value, setPagesToSpreadState, noOp, true),
(value) => updateState(value, noOp, updateCurrentPageIndex), (value) => updateState(value, noOp, updateCurrentPageIndex),
readingMode, readingMode,

View File

@@ -47,13 +47,12 @@ import { useReaderPreserveScrollPosition } from '@/features/reader/viewer/hooks/
import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts'; import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
import { import {
getReaderAutoScrollStore,
getReaderStore, getReaderStore,
useReaderAutoScrollStore,
useReaderChaptersStore, useReaderChaptersStore,
useReaderOverlayStore, useReaderOverlayStore,
useReaderPagesStore, useReaderPagesStore,
useReaderSettingsStore, useReaderSettingsStore,
useReaderTapZoneStore,
} from '@/features/reader/stores/ReaderStore.ts'; } from '@/features/reader/stores/ReaderStore.ts';
const READING_MODE_TO_IN_VIEWPORT_TYPE: Record<ReadingMode, PageInViewportType> = { const READING_MODE_TO_IN_VIEWPORT_TYPE: Record<ReadingMode, PageInViewportType> = {
@@ -74,44 +73,21 @@ const BaseReaderViewer = ({
}) => { }) => {
const { direction: themeDirection } = useTheme(); const { direction: themeDirection } = useTheme();
const isOverlayVisible = useReaderOverlayStore((state) => state.overlay.isVisible); const isOverlayVisible = useReaderOverlayStore((state) => state.overlay.isVisible);
const { const { currentPageIndex, pageToScrollToIndex, pages, totalPages, transitionPageMode, retryFailedPagesKeyPrefix } =
currentPageIndex, useReaderPagesStore((state) => ({
pageToScrollToIndex, currentPageIndex: state.pages.currentPageIndex,
setPageToScrollToIndex, pageToScrollToIndex: state.pages.pageToScrollToIndex,
pages, pages: state.pages.pages,
totalPages, totalPages: state.pages.totalPages,
setPages, transitionPageMode: state.pages.transitionPageMode,
setPageUrls, retryFailedPagesKeyPrefix: state.pages.retryFailedPagesKeyPrefix,
setPageSpreadStates, }));
setPageLoadStates,
setTotalPages,
setCurrentPageIndex,
transitionPageMode,
retryFailedPagesKeyPrefix,
setTransitionPageMode,
} = useReaderPagesStore((state) => ({
currentPageIndex: state.pages.currentPageIndex,
pageToScrollToIndex: state.pages.pageToScrollToIndex,
setPageToScrollToIndex: state.pages.setPageToScrollToIndex,
pages: state.pages.pages,
totalPages: state.pages.totalPages,
setPages: state.pages.setPages,
setPageUrls: state.pages.setPageUrls,
setPageSpreadStates: state.pages.setPageSpreadStates,
setPageLoadStates: state.pages.setPageLoadStates,
setTotalPages: state.pages.setTotalPages,
setCurrentPageIndex: state.pages.setCurrentPageIndex,
transitionPageMode: state.pages.transitionPageMode,
retryFailedPagesKeyPrefix: state.pages.retryFailedPagesKeyPrefix,
setTransitionPageMode: state.pages.setTransitionPageMode,
}));
const { initialChapter, currentChapter, chapters, visibleChapters, isCurrentChapterReady } = useReaderChaptersStore( const { initialChapter, currentChapter, chapters, visibleChapters, isCurrentChapterReady } = useReaderChaptersStore(
(state) => ({ (state) => ({
initialChapter: state.chapters.initialChapter, initialChapter: state.chapters.initialChapter,
currentChapter: state.chapters.currentChapter, currentChapter: state.chapters.currentChapter,
chapters: state.chapters.chapters, chapters: state.chapters.chapters,
visibleChapters: state.chapters.visibleChapters, visibleChapters: state.chapters.visibleChapters,
setReaderStateChapters: state.chapters.setReaderStateChapters,
isCurrentChapterReady: state.chapters.isCurrentChapterReady, isCurrentChapterReady: state.chapters.isCurrentChapterReady,
}), }),
); );
@@ -138,10 +114,6 @@ const BaseReaderViewer = ({
shouldStretchPage: state.settings.shouldStretchPage.value, shouldStretchPage: state.settings.shouldStretchPage.value,
isStaticNav: state.settings.isStaticNav, isStaticNav: state.settings.isStaticNav,
})); }));
const { showPreview, setShowPreview } = useReaderTapZoneStore((state) => ({
showPreview: state.tapZone.showPreview,
setShowPreview: state.tapZone.setShowPreview,
}));
const { resumeMode = ReaderResumeMode.START } = useLocation<ReaderOpenChapterLocationState>().state ?? { const { resumeMode = ReaderResumeMode.START } = useLocation<ReaderOpenChapterLocationState>().state ?? {
resumeMode: ReaderResumeMode.START, resumeMode: ReaderResumeMode.START,
}; };
@@ -153,13 +125,7 @@ const BaseReaderViewer = ({
const isContinuousReadingModeActive = isContinuousReadingMode(readingMode); const isContinuousReadingModeActive = isContinuousReadingMode(readingMode);
const isDragging = useMouseDragScroll(scrollElementRef); const isDragging = useMouseDragScroll(scrollElementRef);
const automaticScrolling = useReaderAutoScrollStore((state) => ({ useEffect(() => getReaderAutoScrollStore().setScrollRef(scrollElementRef.current), []);
isPaused: state.autoScroll.isPaused,
pause: state.autoScroll.pause,
resume: state.autoScroll.resume,
setScrollRef: state.autoScroll.setScrollRef,
}));
useEffect(() => automaticScrolling.setScrollRef(scrollElementRef.current), []);
const scrollbarXSize = MediaQuery.useGetScrollbarSize('width', scrollElementRef.current); const scrollbarXSize = MediaQuery.useGetScrollbarSize('width', scrollElementRef.current);
const scrollbarYSize = MediaQuery.useGetScrollbarSize('height', scrollElementRef.current); const scrollbarYSize = MediaQuery.useGetScrollbarSize('height', scrollElementRef.current);
@@ -240,7 +206,6 @@ const BaseReaderViewer = ({
pageToScrollToIndex, pageToScrollToIndex,
pages, pages,
totalPages, totalPages,
setPageToScrollToIndex,
updateCurrentPageIndex, updateCurrentPageIndex,
isContinuousReadingModeActive, isContinuousReadingModeActive,
imageRefs, imageRefs,
@@ -256,14 +221,8 @@ const BaseReaderViewer = ({
); );
useReaderHideCursorOnInactivity(scrollElementRef); useReaderHideCursorOnInactivity(scrollElementRef);
useReaderHorizontalModeRevampScrolling(readingMode, readingDirection, scrollElementRef); useReaderHorizontalModeRevampScrolling(readingMode, readingDirection, scrollElementRef);
useReaderHideOverlayOnUserScroll(isOverlayVisible, showPreview, setShowPreview, scrollElementRef); useReaderHideOverlayOnUserScroll(isOverlayVisible, scrollElementRef);
useReaderAutoScroll( useReaderAutoScroll(isOverlayVisible, isStaticNav);
isOverlayVisible,
automaticScrolling.isPaused,
automaticScrolling.pause,
automaticScrolling.resume,
isStaticNav,
);
useReaderPreserveScrollPosition( useReaderPreserveScrollPosition(
scrollElementRef, scrollElementRef,
currentChapter?.id, currentChapter?.id,
@@ -273,7 +232,6 @@ const BaseReaderViewer = ({
visibleChapters, visibleChapters,
readingMode, readingMode,
readingDirection, readingDirection,
setPageToScrollToIndex,
pageScaleMode, pageScaleMode,
shouldStretchPage, shouldStretchPage,
readerWidth, readerWidth,
@@ -381,13 +339,6 @@ const BaseReaderViewer = ({
isTrailingChapter={isTrailingChapter} isTrailingChapter={isTrailingChapter}
isPreloadMode={isPreloadMode} isPreloadMode={isPreloadMode}
imageRefs={imageRefs} imageRefs={imageRefs}
setPages={setPages}
setPageUrls={setPageUrls}
setPageSpreadStates={setPageSpreadStates}
setPageLoadStates={setPageLoadStates}
setTotalPages={setTotalPages}
setCurrentPageIndex={setCurrentPageIndex}
setPageToScrollToIndex={setPageToScrollToIndex}
transitionPageMode={transitionPageMode} transitionPageMode={transitionPageMode}
retryFailedPagesKeyPrefix={retryFailedPagesKeyPrefix} retryFailedPagesKeyPrefix={retryFailedPagesKeyPrefix}
readingMode={readingMode} readingMode={readingMode}
@@ -405,7 +356,6 @@ const BaseReaderViewer = ({
visibleChapters.resumeMode, visibleChapters.resumeMode,
resumeMode, resumeMode,
)} )}
setTransitionPageMode={setTransitionPageMode}
pageGap={pageGap} pageGap={pageGap}
imagePreLoadAmount={imagePreLoadAmount} imagePreLoadAmount={imagePreLoadAmount}
customFilter={customFilter} customFilter={customFilter}

View File

@@ -12,12 +12,12 @@ import { ReaderStatePages, ReadingDirection } from '@/features/reader/Reader.typ
import { getIndexOfPage, getPage } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.utils.tsx'; import { getIndexOfPage, getPage } from '@/features/reader/overlay/progress-bar/ReaderProgressBar.utils.tsx';
import { getScrollIntoViewInlineOption } from '@/features/reader/viewer/pager/ReaderPager.utils.tsx'; import { getScrollIntoViewInlineOption } from '@/features/reader/viewer/pager/ReaderPager.utils.tsx';
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts'; import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
import { getReaderPagesStore } from '@/features/reader/stores/ReaderStore.ts';
export const useReaderHandlePageSelection = ( export const useReaderHandlePageSelection = (
pageToScrollToIndex: ReaderStatePages['pageToScrollToIndex'], pageToScrollToIndex: ReaderStatePages['pageToScrollToIndex'],
pages: ReaderStatePages['pages'], pages: ReaderStatePages['pages'],
totalPages: number, totalPages: number,
setPageToScrollToIndex: ReaderStatePages['setPageToScrollToIndex'],
updateCurrentPageIndex: ReturnType<typeof ReaderControls.useUpdateCurrentPageIndex>, updateCurrentPageIndex: ReturnType<typeof ReaderControls.useUpdateCurrentPageIndex>,
isContinuousReadingModeActive: boolean, isContinuousReadingModeActive: boolean,
imageRefs: MutableRefObject<(HTMLElement | null)[]>, imageRefs: MutableRefObject<(HTMLElement | null)[]>,
@@ -43,7 +43,7 @@ export const useReaderHandlePageSelection = (
const newPageIndex = getIndexOfPage(pageToScrollTo); const newPageIndex = getIndexOfPage(pageToScrollTo);
const isLastPage = newPageIndex === totalPages - 1; const isLastPage = newPageIndex === totalPages - 1;
setPageToScrollToIndex(null); getReaderPagesStore().setPageToScrollToIndex(null);
updateCurrentPageIndex(newPageIndex, !isLastPage, isLastPage); updateCurrentPageIndex(newPageIndex, !isLastPage, isLastPage);
}, [pageToScrollToIndex]); }, [pageToScrollToIndex]);
}; };

View File

@@ -12,7 +12,6 @@ import {
IReaderSettingsManga, IReaderSettingsManga,
ReaderPageScaleMode, ReaderPageScaleMode,
ReaderStateChapters, ReaderStateChapters,
ReaderStatePages,
ReadingDirection, ReadingDirection,
ReadingMode, ReadingMode,
} from '@/features/reader/Reader.types.ts'; } from '@/features/reader/Reader.types.ts';
@@ -24,6 +23,7 @@ import {
} from '@/features/reader/settings/ReaderSettings.utils.tsx'; } from '@/features/reader/settings/ReaderSettings.utils.tsx';
import { getPreviousNextChapterVisibility } from '@/features/reader/Reader.utils.ts'; import { getPreviousNextChapterVisibility } from '@/features/reader/Reader.utils.ts';
import { ChapterIdInfo, TChapterReader } from '@/features/chapter/Chapter.types.ts'; import { ChapterIdInfo, TChapterReader } from '@/features/chapter/Chapter.types.ts';
import { getReaderPagesStore } from '@/features/reader/stores/ReaderStore.ts';
const shouldPreserveOnResizeChange = ( const shouldPreserveOnResizeChange = (
readingMode: ReadingMode, readingMode: ReadingMode,
@@ -47,22 +47,13 @@ const shouldPreserveOnResizeChange = (
return handleWidthChange || handleHeightChange; return handleWidthChange || handleHeightChange;
}; };
const usePreserveOnValueChange = ( const usePreserveOnValueChange = (value: unknown, currentPageIndex: number) => {
value: unknown,
currentPageIndex: number,
setPageToScrollToIndex: ReaderStatePages['setPageToScrollToIndex'],
) => {
useLayoutEffect(() => { useLayoutEffect(() => {
setPageToScrollToIndex(currentPageIndex); getReaderPagesStore().setPageToScrollToIndex(currentPageIndex);
}, [value]); }, [value]);
}; };
const usePreserveOnWindowResize = ( const usePreserveOnWindowResize = (readingMode: ReadingMode, pageScaleMode: ReaderPageScaleMode, pageIndex: number) => {
readingMode: ReadingMode,
pageScaleMode: ReaderPageScaleMode,
setPageToScrollToIndex: (index: number | null) => void,
pageIndex: number,
) => {
const previousDimensionsRef = useRef({ width: window.innerWidth, height: window.innerHeight }); const previousDimensionsRef = useRef({ width: window.innerWidth, height: window.innerHeight });
const isResizeInProgressRef = useRef(false); const isResizeInProgressRef = useRef(false);
const activeResizeTimeoutRef = useRef<NodeJS.Timeout>(undefined); const activeResizeTimeoutRef = useRef<NodeJS.Timeout>(undefined);
@@ -81,7 +72,7 @@ const usePreserveOnWindowResize = (
return; return;
} }
setPageToScrollToIndex(pageIndexOnResizeStartRef.current); getReaderPagesStore().setPageToScrollToIndex(pageIndexOnResizeStartRef.current);
clearTimeout(activeResizeTimeoutRef.current); clearTimeout(activeResizeTimeoutRef.current);
activeResizeTimeoutRef.current = setTimeout(() => { activeResizeTimeoutRef.current = setTimeout(() => {
@@ -357,7 +348,6 @@ export const useReaderPreserveScrollPosition = (
visibleChapters: ReaderStateChapters['visibleChapters'], visibleChapters: ReaderStateChapters['visibleChapters'],
readingMode: ReadingMode, readingMode: ReadingMode,
readingDirection: ReadingDirection, readingDirection: ReadingDirection,
setPageToScrollToIndex: ReaderStatePages['setPageToScrollToIndex'],
pageScaleMode: ReaderPageScaleMode, pageScaleMode: ReaderPageScaleMode,
shouldStretchPage: boolean, shouldStretchPage: boolean,
readerWidth: IReaderSettingsManga['readerWidth'], readerWidth: IReaderSettingsManga['readerWidth'],
@@ -372,10 +362,10 @@ export const useReaderPreserveScrollPosition = (
isContinuousReadingMode(readingMode), isContinuousReadingMode(readingMode),
); );
usePreserveOnLeadingPageRender(scrollElementRef, readingMode); usePreserveOnLeadingPageRender(scrollElementRef, readingMode);
usePreserveOnWindowResize(readingMode, pageScaleMode, setPageToScrollToIndex, currentPageIndex); usePreserveOnWindowResize(readingMode, pageScaleMode, currentPageIndex);
usePreserveOnValueChange(readingDirection, currentPageIndex, setPageToScrollToIndex); usePreserveOnValueChange(readingDirection, currentPageIndex);
usePreserveOnValueChange(readingMode, currentPageIndex, setPageToScrollToIndex); usePreserveOnValueChange(readingMode, currentPageIndex);
usePreserveOnValueChange(pageScaleMode, currentPageIndex, setPageToScrollToIndex); usePreserveOnValueChange(pageScaleMode, currentPageIndex);
usePreserveOnValueChange(shouldStretchPage, currentPageIndex, setPageToScrollToIndex); usePreserveOnValueChange(shouldStretchPage, currentPageIndex);
usePreserveOnValueChange(`${readerWidth.value}_${readerWidth.enabled}`, currentPageIndex, setPageToScrollToIndex); usePreserveOnValueChange(`${readerWidth.value}_${readerWidth.enabled}`, currentPageIndex);
}; };