Move reader "overlay state" to "reader store"
This commit is contained in:
@@ -10,8 +10,12 @@ import { create } from 'zustand';
|
|||||||
import { immer } from 'zustand/middleware/immer';
|
import { immer } from 'zustand/middleware/immer';
|
||||||
import { useShallow } from 'zustand/react/shallow';
|
import { useShallow } from 'zustand/react/shallow';
|
||||||
import { TMangaReader } from '@/features/manga/Manga.types.ts';
|
import { TMangaReader } from '@/features/manga/Manga.types.ts';
|
||||||
|
import {
|
||||||
|
createReaderOverlayStoreSlice,
|
||||||
|
ReaderOverlayStoreSlice,
|
||||||
|
} from '@/features/reader/overlay/ReaderOverlayStore.ts';
|
||||||
|
|
||||||
interface ReaderStore {
|
interface ReaderStore extends ReaderOverlayStoreSlice {
|
||||||
reset: () => void;
|
reset: () => void;
|
||||||
manga: TMangaReader | undefined;
|
manga: TMangaReader | undefined;
|
||||||
setManga: (manga: TMangaReader | undefined) => void;
|
setManga: (manga: TMangaReader | undefined) => void;
|
||||||
@@ -32,12 +36,13 @@ const DEFAULT_STATE = {
|
|||||||
} satisfies Pick<ReaderStore, 'manga'> & { scrollbar: Pick<ReaderStore['scrollbar'], 'xSize' | 'ySize'> };
|
} satisfies Pick<ReaderStore, 'manga'> & { scrollbar: Pick<ReaderStore['scrollbar'], 'xSize' | 'ySize'> };
|
||||||
|
|
||||||
export const useReaderStore = create<ReaderStore>()(
|
export const useReaderStore = create<ReaderStore>()(
|
||||||
immer((set, get) => ({
|
immer((set, get, store) => ({
|
||||||
...DEFAULT_STATE,
|
...DEFAULT_STATE,
|
||||||
reset: () =>
|
reset: () =>
|
||||||
set((draft) => {
|
set((draft) => {
|
||||||
draft.manga = DEFAULT_STATE.manga;
|
draft.manga = DEFAULT_STATE.manga;
|
||||||
draft.scrollbar = { ...get().scrollbar, ...DEFAULT_STATE.scrollbar };
|
draft.scrollbar = { ...get().scrollbar, ...DEFAULT_STATE.scrollbar };
|
||||||
|
get().overlay.reset();
|
||||||
}),
|
}),
|
||||||
setManga: (manga) =>
|
setManga: (manga) =>
|
||||||
set((draft) => {
|
set((draft) => {
|
||||||
@@ -54,6 +59,7 @@ export const useReaderStore = create<ReaderStore>()(
|
|||||||
draft.scrollbar.ySize = size;
|
draft.scrollbar.ySize = size;
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
...createReaderOverlayStoreSlice(set, get, store),
|
||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
export const useReaderStoreShallow = <T>(selector: (state: ReaderStore) => T): T =>
|
export const useReaderStoreShallow = <T>(selector: (state: ReaderStore) => T): T =>
|
||||||
|
|||||||
@@ -9,18 +9,15 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { ReaderStateContextProvider } from '@/features/reader/contexts/state/ReaderStateContextProvider.tsx';
|
import { ReaderStateContextProvider } from '@/features/reader/contexts/state/ReaderStateContextProvider.tsx';
|
||||||
import { ReaderAutoScrollContextProvider } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
import { ReaderAutoScrollContextProvider } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
||||||
import { ReaderOverlayContextProvider } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { ReaderProgressBarContextProvider } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
|
import { ReaderProgressBarContextProvider } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
|
||||||
import { ReaderTapZoneContextProvider } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
import { ReaderTapZoneContextProvider } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
||||||
|
|
||||||
export const ReaderContextProvider = ({ children }: { children?: ReactNode }) => (
|
export const ReaderContextProvider = ({ children }: { children?: ReactNode }) => (
|
||||||
<ReaderStateContextProvider>
|
<ReaderStateContextProvider>
|
||||||
<ReaderTapZoneContextProvider>
|
<ReaderTapZoneContextProvider>
|
||||||
<ReaderOverlayContextProvider>
|
|
||||||
<ReaderProgressBarContextProvider>
|
<ReaderProgressBarContextProvider>
|
||||||
<ReaderAutoScrollContextProvider>{children}</ReaderAutoScrollContextProvider>
|
<ReaderAutoScrollContextProvider>{children}</ReaderAutoScrollContextProvider>
|
||||||
</ReaderProgressBarContextProvider>
|
</ReaderProgressBarContextProvider>
|
||||||
</ReaderOverlayContextProvider>
|
|
||||||
</ReaderTapZoneContextProvider>
|
</ReaderTapZoneContextProvider>
|
||||||
</ReaderStateContextProvider>
|
</ReaderStateContextProvider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import {
|
|||||||
TReaderStateSettingsContext,
|
TReaderStateSettingsContext,
|
||||||
} from '@/features/reader/Reader.types.ts';
|
} from '@/features/reader/Reader.types.ts';
|
||||||
import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
|
import { DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG } from '@/features/reader/settings/ReaderSettingsMetadata.ts';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import { READER_STATE_CHAPTERS_DEFAULTS } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
|
import { READER_STATE_CHAPTERS_DEFAULTS } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
|
||||||
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
@@ -29,7 +28,6 @@ export const useReaderResetStates = (
|
|||||||
setPageUrls: ReaderStatePages['setPageUrls'],
|
setPageUrls: ReaderStatePages['setPageUrls'],
|
||||||
setPageLoadStates: ReaderStatePages['setPageLoadStates'],
|
setPageLoadStates: ReaderStatePages['setPageLoadStates'],
|
||||||
setTransitionPageMode: ReaderStatePages['setTransitionPageMode'],
|
setTransitionPageMode: ReaderStatePages['setTransitionPageMode'],
|
||||||
setIsOverlayVisible: TReaderOverlayContext['setIsVisible'],
|
|
||||||
setSettings: TReaderStateSettingsContext['setSettings'],
|
setSettings: TReaderStateSettingsContext['setSettings'],
|
||||||
cancelAutoScroll: TReaderAutoScrollContext['cancel'],
|
cancelAutoScroll: TReaderAutoScrollContext['cancel'],
|
||||||
) => {
|
) => {
|
||||||
@@ -46,8 +44,6 @@ export const useReaderResetStates = (
|
|||||||
setPageLoadStates([{ url: '', loaded: false }]);
|
setPageLoadStates([{ url: '', loaded: false }]);
|
||||||
setTransitionPageMode(ReaderTransitionPageMode.NONE);
|
setTransitionPageMode(ReaderTransitionPageMode.NONE);
|
||||||
|
|
||||||
setIsOverlayVisible(false);
|
|
||||||
|
|
||||||
setSettings(DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG);
|
setSettings(DEFAULT_READER_SETTINGS_WITH_DEFAULT_FLAG);
|
||||||
|
|
||||||
cancelAutoScroll();
|
cancelAutoScroll();
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import { useTheme } from '@mui/material/styles';
|
|||||||
import { HOTKEY_SCOPES } from '@/features/hotkeys/Hotkeys.constants.ts';
|
import { HOTKEY_SCOPES } from '@/features/hotkeys/Hotkeys.constants.ts';
|
||||||
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
|
import { ReaderService } from '@/features/reader/services/ReaderService.ts';
|
||||||
import { IReaderSettings, ReaderHotkey } from '@/features/reader/Reader.types.ts';
|
import { IReaderSettings, ReaderHotkey } from '@/features/reader/Reader.types.ts';
|
||||||
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { getNextRotationValue } from '@/base/utils/ValueRotationButton.utils.ts';
|
import { getNextRotationValue } from '@/base/utils/ValueRotationButton.utils.ts';
|
||||||
import {
|
import {
|
||||||
AUTO_SCROLL_SPEED,
|
AUTO_SCROLL_SPEED,
|
||||||
@@ -27,6 +26,7 @@ import { ScrollOffset } from '@/base/Base.types.ts';
|
|||||||
import { getOptionForDirection } from '@/features/theme/services/ThemeCreator.ts';
|
import { getOptionForDirection } from '@/features/theme/services/ThemeCreator.ts';
|
||||||
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
||||||
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
||||||
|
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
const useHotkeys = (...args: Parameters<typeof useHotKeysHook>): ReturnType<typeof useHotKeysHook> => {
|
const useHotkeys = (...args: Parameters<typeof useHotKeysHook>): ReturnType<typeof useHotKeysHook> => {
|
||||||
const [keys, callback, options, dependencies] = args;
|
const [keys, callback, options, dependencies] = args;
|
||||||
@@ -64,7 +64,6 @@ export const ReaderHotkeys = ({
|
|||||||
const { direction: themeDirection } = useTheme();
|
const { direction: themeDirection } = useTheme();
|
||||||
const readerThemeDirection = ReaderService.useGetThemeDirection();
|
const readerThemeDirection = ReaderService.useGetThemeDirection();
|
||||||
const { enableScope, disableScope } = useHotkeysContext();
|
const { enableScope, disableScope } = useHotkeysContext();
|
||||||
const { isVisible, setIsVisible: setIsOverlayVisible } = useReaderOverlayContext();
|
|
||||||
const {
|
const {
|
||||||
hotkeys,
|
hotkeys,
|
||||||
pageScaleMode,
|
pageScaleMode,
|
||||||
@@ -104,7 +103,6 @@ export const ReaderHotkeys = ({
|
|||||||
themeDirection,
|
themeDirection,
|
||||||
scrollElementRef.current,
|
scrollElementRef.current,
|
||||||
openChapter,
|
openChapter,
|
||||||
setIsOverlayVisible,
|
|
||||||
setShowPreview,
|
setShowPreview,
|
||||||
scrollAmount,
|
scrollAmount,
|
||||||
);
|
);
|
||||||
@@ -139,7 +137,6 @@ export const ReaderHotkeys = ({
|
|||||||
themeDirection,
|
themeDirection,
|
||||||
scrollElementRef.current,
|
scrollElementRef.current,
|
||||||
openChapter,
|
openChapter,
|
||||||
setIsOverlayVisible,
|
|
||||||
setShowPreview,
|
setShowPreview,
|
||||||
scrollAmount,
|
scrollAmount,
|
||||||
);
|
);
|
||||||
@@ -164,7 +161,9 @@ export const ReaderHotkeys = ({
|
|||||||
() => openChapter(getOptionForDirection('next', 'previous', readerThemeDirection)),
|
() => openChapter(getOptionForDirection('next', 'previous', readerThemeDirection)),
|
||||||
[openChapter, readerThemeDirection],
|
[openChapter, readerThemeDirection],
|
||||||
);
|
);
|
||||||
useHotkeys(hotkeys[ReaderHotkey.TOGGLE_MENU], () => setIsOverlayVisible(!isVisible), [isVisible]);
|
useHotkeys(hotkeys[ReaderHotkey.TOGGLE_MENU], () =>
|
||||||
|
getReaderStore().overlay.setIsVisible(!getReaderStore().overlay.isVisible),
|
||||||
|
);
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
hotkeys[ReaderHotkey.CYCLE_SCALE_TYPE],
|
hotkeys[ReaderHotkey.CYCLE_SCALE_TYPE],
|
||||||
() => {
|
() => {
|
||||||
|
|||||||
@@ -19,8 +19,3 @@ interface ReaderNavBarBaseProps extends BaseReaderOverlayProps {
|
|||||||
export interface ReaderBottomBarMobileProps extends ReaderNavBarBaseProps {}
|
export interface ReaderBottomBarMobileProps extends ReaderNavBarBaseProps {}
|
||||||
|
|
||||||
export interface ReaderNavBarDesktopProps extends ReaderNavBarBaseProps {}
|
export interface ReaderNavBarDesktopProps extends ReaderNavBarBaseProps {}
|
||||||
|
|
||||||
export type TReaderOverlayContext = {
|
|
||||||
isVisible: boolean;
|
|
||||||
setIsVisible: React.Dispatch<React.SetStateAction<boolean>>;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) Contributors to the Suwayomi project
|
|
||||||
*
|
|
||||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { createContext, useContext, ReactNode, useMemo, useState } from 'react';
|
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
|
|
||||||
export const ReaderOverlayContext = createContext<TReaderOverlayContext>({
|
|
||||||
isVisible: false,
|
|
||||||
setIsVisible: () => {},
|
|
||||||
});
|
|
||||||
|
|
||||||
export const useReaderOverlayContext = () => useContext(ReaderOverlayContext);
|
|
||||||
|
|
||||||
export const ReaderOverlayContextProvider = ({ children }: { children: ReactNode }) => {
|
|
||||||
const [isVisible, setIsVisible] = useState(false);
|
|
||||||
|
|
||||||
const value = useMemo(() => ({ isVisible, setIsVisible }), [isVisible]);
|
|
||||||
|
|
||||||
return <ReaderOverlayContext.Provider value={value}>{children}</ReaderOverlayContext.Provider>;
|
|
||||||
};
|
|
||||||
35
src/features/reader/overlay/ReaderOverlayStore.ts
Normal file
35
src/features/reader/overlay/ReaderOverlayStore.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Contributors to the Suwayomi project
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ImmerStateCreator } from '@/lib/zustand/Zustand.types.ts';
|
||||||
|
|
||||||
|
export interface ReaderOverlayStoreSlice {
|
||||||
|
overlay: {
|
||||||
|
isVisible: boolean;
|
||||||
|
setIsVisible: (visible: boolean) => void;
|
||||||
|
reset: () => void;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const DEFAULT_STATE = {
|
||||||
|
isVisible: false,
|
||||||
|
} satisfies Pick<ReaderOverlayStoreSlice['overlay'], 'isVisible'>;
|
||||||
|
|
||||||
|
export const createReaderOverlayStoreSlice = <T extends ReaderOverlayStoreSlice>(
|
||||||
|
...[set, get]: Parameters<ImmerStateCreator<T>>
|
||||||
|
): ReaderOverlayStoreSlice =>
|
||||||
|
({
|
||||||
|
overlay: {
|
||||||
|
isVisible: DEFAULT_STATE.isVisible,
|
||||||
|
setIsVisible: (visible) =>
|
||||||
|
set((draft) => {
|
||||||
|
draft.overlay.isVisible = visible;
|
||||||
|
}),
|
||||||
|
reset: () => set(() => ({ overlay: { ...get().overlay, ...DEFAULT_STATE } })),
|
||||||
|
},
|
||||||
|
}) as T;
|
||||||
@@ -7,12 +7,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { MutableRefObject, useEffect } from 'react';
|
import { MutableRefObject, useEffect } from 'react';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
|
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
|
||||||
|
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
export const useReaderHideOverlayOnUserScroll = (
|
export const useReaderHideOverlayOnUserScroll = (
|
||||||
isOverlayVisible: boolean,
|
isOverlayVisible: boolean,
|
||||||
setIsOverlayVisible: TReaderOverlayContext['setIsVisible'],
|
|
||||||
showPreview: TReaderTapZoneContext['showPreview'],
|
showPreview: TReaderTapZoneContext['showPreview'],
|
||||||
setShowPreview: TReaderTapZoneContext['setShowPreview'],
|
setShowPreview: TReaderTapZoneContext['setShowPreview'],
|
||||||
scrollElementRef: MutableRefObject<HTMLDivElement | null>,
|
scrollElementRef: MutableRefObject<HTMLDivElement | null>,
|
||||||
@@ -20,7 +19,7 @@ export const useReaderHideOverlayOnUserScroll = (
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleScroll = () => {
|
const handleScroll = () => {
|
||||||
if (isOverlayVisible) {
|
if (isOverlayVisible) {
|
||||||
setIsOverlayVisible(false);
|
getReaderStore().overlay.setIsVisible(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showPreview) {
|
if (showPreview) {
|
||||||
|
|||||||
@@ -25,9 +25,7 @@ import { getOptionForDirection } from '@/features/theme/services/ThemeCreator.ts
|
|||||||
import { IReaderSettings, ProgressBarPosition, ReaderStateChapters } from '@/features/reader/Reader.types.ts';
|
import { IReaderSettings, ProgressBarPosition, ReaderStateChapters } from '@/features/reader/Reader.types.ts';
|
||||||
import { ReaderProgressBarDirectionWrapper } from '@/features/reader/overlay/progress-bar/components/ReaderProgressBarDirectionWrapper.tsx';
|
import { ReaderProgressBarDirectionWrapper } from '@/features/reader/overlay/progress-bar/components/ReaderProgressBarDirectionWrapper.tsx';
|
||||||
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
|
import { useReaderProgressBarContext } from '@/features/reader/overlay/progress-bar/ReaderProgressBarContext.tsx';
|
||||||
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import {
|
import {
|
||||||
ReaderProgressBarProps,
|
ReaderProgressBarProps,
|
||||||
TReaderProgressBarContext,
|
TReaderProgressBarContext,
|
||||||
@@ -38,7 +36,7 @@ import { applyStyles } from '@/base/utils/ApplyStyles.ts';
|
|||||||
import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
|
import { useResizeObserver } from '@/base/hooks/useResizeObserver.tsx';
|
||||||
import { getProgressBarPosition } from '@/features/reader/settings/ReaderSettings.utils.tsx';
|
import { getProgressBarPosition } from '@/features/reader/settings/ReaderSettings.utils.tsx';
|
||||||
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
|
import { ReaderControls } from '@/features/reader/services/ReaderControls.ts';
|
||||||
import { useReaderStoreShallow } from '@/features/reader/ReaderStore.ts';
|
import { useReaderStore, useReaderStoreShallow } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
const PROGRESS_BAR_POSITION_TO_SLIDE_DIRECTION: Record<ProgressBarPosition, SlideProps['direction']> = {
|
const PROGRESS_BAR_POSITION_TO_SLIDE_DIRECTION: Record<ProgressBarPosition, SlideProps['direction']> = {
|
||||||
[ProgressBarPosition.BOTTOM]: 'up',
|
[ProgressBarPosition.BOTTOM]: 'up',
|
||||||
@@ -51,7 +49,6 @@ const PROGRESS_BAR_POSITION_TO_SLIDE_DIRECTION: Record<ProgressBarPosition, Slid
|
|||||||
const BaseMobileReaderProgressBar = ({
|
const BaseMobileReaderProgressBar = ({
|
||||||
previousChapter,
|
previousChapter,
|
||||||
nextChapter,
|
nextChapter,
|
||||||
isVisible,
|
|
||||||
setIsMaximized,
|
setIsMaximized,
|
||||||
isDragging,
|
isDragging,
|
||||||
currentPageIndex,
|
currentPageIndex,
|
||||||
@@ -62,7 +59,6 @@ const BaseMobileReaderProgressBar = ({
|
|||||||
topOffset = 0,
|
topOffset = 0,
|
||||||
bottomOffset = 0,
|
bottomOffset = 0,
|
||||||
}: Pick<ReaderStateChapters, 'previousChapter' | 'nextChapter'> &
|
}: Pick<ReaderStateChapters, 'previousChapter' | 'nextChapter'> &
|
||||||
Pick<TReaderOverlayContext, 'isVisible'> &
|
|
||||||
Pick<TReaderProgressBarContext, 'setIsMaximized' | 'isDragging'> &
|
Pick<TReaderProgressBarContext, 'setIsMaximized' | 'isDragging'> &
|
||||||
Pick<ReaderProgressBarProps, 'currentPageIndex' | 'pages'> &
|
Pick<ReaderProgressBarProps, 'currentPageIndex' | 'pages'> &
|
||||||
Pick<IReaderSettings, 'progressBarPosition' | 'progressBarPositionAutoVertical'> & {
|
Pick<IReaderSettings, 'progressBarPosition' | 'progressBarPositionAutoVertical'> & {
|
||||||
@@ -72,6 +68,7 @@ const BaseMobileReaderProgressBar = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const openChapter = ReaderControls.useOpenChapter();
|
const openChapter = ReaderControls.useOpenChapter();
|
||||||
const scrollbar = useReaderStoreShallow((state) => state.scrollbar);
|
const scrollbar = useReaderStoreShallow((state) => state.scrollbar);
|
||||||
|
const isVisible = useReaderStore((state) => state.overlay.isVisible);
|
||||||
|
|
||||||
const [, setRefreshProgressBarPosition] = useState({});
|
const [, setRefreshProgressBarPosition] = useState({});
|
||||||
useResizeObserver(
|
useResizeObserver(
|
||||||
@@ -361,7 +358,6 @@ export const MobileReaderProgressBar = withPropsFrom(
|
|||||||
memo(BaseMobileReaderProgressBar),
|
memo(BaseMobileReaderProgressBar),
|
||||||
[
|
[
|
||||||
useReaderStateChaptersContext,
|
useReaderStateChaptersContext,
|
||||||
useReaderOverlayContext,
|
|
||||||
useReaderProgressBarContext,
|
useReaderProgressBarContext,
|
||||||
userReaderStatePagesContext,
|
userReaderStatePagesContext,
|
||||||
() => ({ direction: ReaderService.useGetThemeDirection() }),
|
() => ({ direction: ReaderService.useGetThemeDirection() }),
|
||||||
@@ -370,7 +366,6 @@ export const MobileReaderProgressBar = withPropsFrom(
|
|||||||
[
|
[
|
||||||
'previousChapter',
|
'previousChapter',
|
||||||
'nextChapter',
|
'nextChapter',
|
||||||
'isVisible',
|
|
||||||
'setIsMaximized',
|
'setIsMaximized',
|
||||||
'isDragging',
|
'isDragging',
|
||||||
'currentPageIndex',
|
'currentPageIndex',
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts'
|
|||||||
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
|
import { userReaderStatePagesContext } from '@/features/reader/contexts/state/ReaderStatePagesContext.tsx';
|
||||||
import { GET_CHAPTERS_READER } from '@/lib/graphql/queries/ChapterQuery.ts';
|
import { GET_CHAPTERS_READER } from '@/lib/graphql/queries/ChapterQuery.ts';
|
||||||
import { TapZoneLayout } from '@/features/reader/tap-zones/TapZoneLayout.tsx';
|
import { TapZoneLayout } from '@/features/reader/tap-zones/TapZoneLayout.tsx';
|
||||||
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { ReaderRGBAFilter } from '@/features/reader/filters/ReaderRGBAFilter.tsx';
|
import { ReaderRGBAFilter } from '@/features/reader/filters/ReaderRGBAFilter.tsx';
|
||||||
import { useReaderStateSettingsContext } from '@/features/reader/contexts/state/ReaderStateSettingsContext.tsx';
|
import { useReaderStateSettingsContext } from '@/features/reader/contexts/state/ReaderStateSettingsContext.tsx';
|
||||||
import { ReaderViewer } from '@/features/reader/viewer/ReaderViewer.tsx';
|
import { ReaderViewer } from '@/features/reader/viewer/ReaderViewer.tsx';
|
||||||
@@ -39,7 +38,6 @@ import {
|
|||||||
} from '@/features/reader/Reader.types.ts';
|
} from '@/features/reader/Reader.types.ts';
|
||||||
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
|
import { getErrorMessage } from '@/lib/HelperFunctions.ts';
|
||||||
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
|
import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types.ts';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
||||||
import { useReaderStateChaptersContext } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
|
import { useReaderStateChaptersContext } from '@/features/reader/contexts/state/ReaderStateChaptersContext.tsx';
|
||||||
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
||||||
@@ -57,8 +55,6 @@ import { useReaderStore, useReaderStoreShallow } from '@/features/reader/ReaderS
|
|||||||
const BaseReader = ({
|
const BaseReader = ({
|
||||||
setOverride,
|
setOverride,
|
||||||
readerNavBarWidth,
|
readerNavBarWidth,
|
||||||
isVisible: isOverlayVisible,
|
|
||||||
setIsVisible: setIsOverlayVisible,
|
|
||||||
shouldSkipDupChapters,
|
shouldSkipDupChapters,
|
||||||
shouldSkipFilteredChapters,
|
shouldSkipFilteredChapters,
|
||||||
backgroundColor,
|
backgroundColor,
|
||||||
@@ -83,7 +79,6 @@ const BaseReader = ({
|
|||||||
cancelAutoScroll,
|
cancelAutoScroll,
|
||||||
setShowPreview,
|
setShowPreview,
|
||||||
}: Pick<NavbarContextType, 'setOverride' | 'readerNavBarWidth'> &
|
}: Pick<NavbarContextType, 'setOverride' | 'readerNavBarWidth'> &
|
||||||
Pick<TReaderOverlayContext, 'isVisible' | 'setIsVisible'> &
|
|
||||||
Pick<TReaderStateSettingsContext, 'setSettings'> &
|
Pick<TReaderStateSettingsContext, 'setSettings'> &
|
||||||
Pick<
|
Pick<
|
||||||
IReaderSettings,
|
IReaderSettings,
|
||||||
@@ -117,6 +112,7 @@ const BaseReader = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const manga = useReaderStoreShallow((state) => state.manga);
|
const manga = useReaderStoreShallow((state) => state.manga);
|
||||||
|
const overlay = useReaderStoreShallow((state) => state.overlay);
|
||||||
|
|
||||||
const scrollElementRef = useRef<HTMLDivElement | null>(null);
|
const scrollElementRef = useRef<HTMLDivElement | null>(null);
|
||||||
|
|
||||||
@@ -166,7 +162,6 @@ const BaseReader = ({
|
|||||||
setPageUrls,
|
setPageUrls,
|
||||||
setPageLoadStates,
|
setPageLoadStates,
|
||||||
setTransitionPageMode,
|
setTransitionPageMode,
|
||||||
setIsOverlayVisible,
|
|
||||||
setSettings,
|
setSettings,
|
||||||
cancelAutoScroll,
|
cancelAutoScroll,
|
||||||
);
|
);
|
||||||
@@ -207,10 +202,10 @@ const BaseReader = ({
|
|||||||
value: (
|
value: (
|
||||||
<Box sx={{ position: 'absolute' }}>
|
<Box sx={{ position: 'absolute' }}>
|
||||||
<ReaderHotkeys scrollElementRef={scrollElementRef} />
|
<ReaderHotkeys scrollElementRef={scrollElementRef} />
|
||||||
<ReaderOverlay isVisible={isOverlayVisible} />
|
<ReaderOverlay isVisible={overlay.isVisible} />
|
||||||
{!scrollElementRef.current && (
|
{!scrollElementRef.current && (
|
||||||
<Box
|
<Box
|
||||||
onClick={() => setIsOverlayVisible(!isOverlayVisible)}
|
onClick={() => overlay.setIsVisible(!overlay.isVisible)}
|
||||||
sx={{
|
sx={{
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: 0,
|
top: 0,
|
||||||
@@ -226,7 +221,7 @@ const BaseReader = ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
return () => setOverride({ status: false, value: null });
|
return () => setOverride({ status: false, value: null });
|
||||||
}, [isOverlayVisible, setIsOverlayVisible, scrollElementRef.current]);
|
}, [overlay.isVisible, scrollElementRef.current]);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
return (
|
return (
|
||||||
@@ -301,7 +296,6 @@ export const Reader = withPropsFrom(
|
|||||||
memo(BaseReader),
|
memo(BaseReader),
|
||||||
[
|
[
|
||||||
useNavBarContext,
|
useNavBarContext,
|
||||||
useReaderOverlayContext,
|
|
||||||
useReaderStateChaptersContext,
|
useReaderStateChaptersContext,
|
||||||
useReaderStateSettingsContext,
|
useReaderStateSettingsContext,
|
||||||
() => {
|
() => {
|
||||||
@@ -331,8 +325,6 @@ export const Reader = withPropsFrom(
|
|||||||
[
|
[
|
||||||
'setOverride',
|
'setOverride',
|
||||||
'readerNavBarWidth',
|
'readerNavBarWidth',
|
||||||
'isVisible',
|
|
||||||
'setIsVisible',
|
|
||||||
'shouldSkipDupChapters',
|
'shouldSkipDupChapters',
|
||||||
'shouldSkipFilteredChapters',
|
'shouldSkipFilteredChapters',
|
||||||
'backgroundColor',
|
'backgroundColor',
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import {
|
|||||||
isEndOfPageInViewport,
|
isEndOfPageInViewport,
|
||||||
isPageInViewport,
|
isPageInViewport,
|
||||||
} from '@/features/reader/viewer/pager/ReaderPager.utils.tsx';
|
} from '@/features/reader/viewer/pager/ReaderPager.utils.tsx';
|
||||||
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
import { useReaderTapZoneContext } from '@/features/reader/tap-zones/ReaderTapZoneContext.tsx';
|
||||||
import { TapZoneRegionType, TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
|
import { TapZoneRegionType, TReaderTapZoneContext } 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';
|
||||||
@@ -51,11 +50,11 @@ import { useMetadataServerSettings } from '@/features/settings/services/ServerSe
|
|||||||
import { ChapterIdInfo, TChapterReader } from '@/features/chapter/Chapter.types.ts';
|
import { ChapterIdInfo, TChapterReader } from '@/features/chapter/Chapter.types.ts';
|
||||||
import { awaitConfirmation } from '@/base/utils/AwaitableDialog.tsx';
|
import { awaitConfirmation } from '@/base/utils/AwaitableDialog.tsx';
|
||||||
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';
|
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import {
|
import {
|
||||||
ReaderProgressBarProps,
|
ReaderProgressBarProps,
|
||||||
TReaderProgressCurrentPage,
|
TReaderProgressCurrentPage,
|
||||||
} from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
|
} from '@/features/reader/overlay/progress-bar/ReaderProgressBar.types.ts';
|
||||||
|
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
const getScrollDirectionInvert = (
|
const getScrollDirectionInvert = (
|
||||||
scrollDirection: ScrollDirection,
|
scrollDirection: ScrollDirection,
|
||||||
@@ -99,7 +98,6 @@ export class ReaderControls {
|
|||||||
themeDirection: Direction,
|
themeDirection: Direction,
|
||||||
element: HTMLElement,
|
element: HTMLElement,
|
||||||
openChapter: ReturnType<(typeof ReaderControls)['useOpenChapter']>,
|
openChapter: ReturnType<(typeof ReaderControls)['useOpenChapter']>,
|
||||||
setIsOverlayVisible: TReaderOverlayContext['setIsVisible'],
|
|
||||||
setShowPreview: TReaderTapZoneContext['setShowPreview'],
|
setShowPreview: TReaderTapZoneContext['setShowPreview'],
|
||||||
scrollAmountPercentage: number = ReaderScrollAmount.LARGE,
|
scrollAmountPercentage: number = ReaderScrollAmount.LARGE,
|
||||||
): void {
|
): void {
|
||||||
@@ -128,7 +126,7 @@ export class ReaderControls {
|
|||||||
const getNewScrollPosition = (currentPos: number, elementSize: number) =>
|
const getNewScrollPosition = (currentPos: number, elementSize: number) =>
|
||||||
currentPos + elementSize * scrollAmount * scrollDirection;
|
currentPos + elementSize * scrollAmount * scrollDirection;
|
||||||
|
|
||||||
setIsOverlayVisible(false);
|
getReaderStore().overlay.setIsVisible(false);
|
||||||
setShowPreview(false);
|
setShowPreview(false);
|
||||||
|
|
||||||
const doScroll = (
|
const doScroll = (
|
||||||
@@ -351,7 +349,6 @@ export class ReaderControls {
|
|||||||
const { currentPageIndex, setPageToScrollToIndex, pages, transitionPageMode, setTransitionPageMode } =
|
const { currentPageIndex, setPageToScrollToIndex, pages, transitionPageMode, setTransitionPageMode } =
|
||||||
userReaderStatePagesContext();
|
userReaderStatePagesContext();
|
||||||
const { previousChapter, nextChapter } = useReaderStateChaptersContext();
|
const { previousChapter, nextChapter } = useReaderStateChaptersContext();
|
||||||
const { setIsVisible: setIsOverlayVisible } = useReaderOverlayContext();
|
|
||||||
const { setShowPreview } = useReaderTapZoneContext();
|
const { setShowPreview } = useReaderTapZoneContext();
|
||||||
const { readingDirection, readingMode, shouldShowTransitionPage } = ReaderService.useSettings();
|
const { readingDirection, readingMode, shouldShowTransitionPage } = ReaderService.useSettings();
|
||||||
const openChapter = ReaderControls.useOpenChapter();
|
const openChapter = ReaderControls.useOpenChapter();
|
||||||
@@ -383,7 +380,7 @@ export class ReaderControls {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (hideOverlay) {
|
if (hideOverlay) {
|
||||||
setIsOverlayVisible(false);
|
getReaderStore().overlay.setIsVisible(false);
|
||||||
setShowPreview(false);
|
setShowPreview(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -598,7 +595,6 @@ export class ReaderControls {
|
|||||||
scrollElement: HTMLElement | null,
|
scrollElement: HTMLElement | null,
|
||||||
): (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void {
|
): (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void {
|
||||||
const { direction: themeDirection } = useTheme();
|
const { direction: themeDirection } = useTheme();
|
||||||
const { setIsVisible: setIsOverlayVisible } = useReaderOverlayContext();
|
|
||||||
const { currentPageIndex, pages } = userReaderStatePagesContext();
|
const { currentPageIndex, pages } = userReaderStatePagesContext();
|
||||||
const { setShowPreview } = useReaderTapZoneContext();
|
const { setShowPreview } = useReaderTapZoneContext();
|
||||||
const { readingMode, readingDirection, isStaticNav, scrollAmount } = ReaderService.useSettings();
|
const { readingMode, readingDirection, isStaticNav, scrollAmount } = ReaderService.useSettings();
|
||||||
@@ -624,7 +620,7 @@ export class ReaderControls {
|
|||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case TapZoneRegionType.MENU:
|
case TapZoneRegionType.MENU:
|
||||||
setIsOverlayVisible((isVisible) => isStaticNav || !isVisible);
|
getReaderStore().overlay.setIsVisible(isStaticNav || !getReaderStore().overlay.isVisible);
|
||||||
break;
|
break;
|
||||||
case TapZoneRegionType.PREVIOUS:
|
case TapZoneRegionType.PREVIOUS:
|
||||||
case TapZoneRegionType.NEXT:
|
case TapZoneRegionType.NEXT:
|
||||||
@@ -637,7 +633,6 @@ export class ReaderControls {
|
|||||||
themeDirection,
|
themeDirection,
|
||||||
scrollElement,
|
scrollElement,
|
||||||
openChapter,
|
openChapter,
|
||||||
setIsOverlayVisible,
|
|
||||||
setShowPreview,
|
setShowPreview,
|
||||||
scrollAmount,
|
scrollAmount,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -41,9 +41,7 @@ import {
|
|||||||
shouldApplyReaderWidth,
|
shouldApplyReaderWidth,
|
||||||
} from '@/features/reader/settings/ReaderSettings.utils.tsx';
|
} from '@/features/reader/settings/ReaderSettings.utils.tsx';
|
||||||
import { useMouseDragScroll } from '@/base/hooks/useMouseDragScroll.tsx';
|
import { useMouseDragScroll } from '@/base/hooks/useMouseDragScroll.tsx';
|
||||||
import { useReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlayContext.tsx';
|
|
||||||
import { applyStyles } from '@/base/utils/ApplyStyles.ts';
|
import { applyStyles } from '@/base/utils/ApplyStyles.ts';
|
||||||
import { TReaderOverlayContext } from '@/features/reader/overlay/ReaderOverlay.types.ts';
|
|
||||||
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
import { withPropsFrom } from '@/base/hoc/withPropsFrom.tsx';
|
||||||
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
import { useReaderAutoScrollContext } from '@/features/reader/auto-scroll/ReaderAutoScrollContext.tsx';
|
||||||
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
|
import { TReaderTapZoneContext } from '@/features/reader/tap-zones/TapZoneLayout.types.ts';
|
||||||
@@ -67,7 +65,7 @@ import { NavbarContextType } from '@/features/navigation-bar/NavigationBar.types
|
|||||||
import { useReaderPreserveScrollPosition } from '@/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts';
|
import { useReaderPreserveScrollPosition } from '@/features/reader/viewer/hooks/useReaderPreserveScrollPosition.ts';
|
||||||
|
|
||||||
import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
|
import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
|
||||||
import { getReaderStore } from '@/features/reader/ReaderStore.ts';
|
import { getReaderStore, useReaderStore } from '@/features/reader/ReaderStore.ts';
|
||||||
|
|
||||||
const READING_MODE_TO_IN_VIEWPORT_TYPE: Record<ReadingMode, PageInViewportType> = {
|
const READING_MODE_TO_IN_VIEWPORT_TYPE: Record<ReadingMode, PageInViewportType> = {
|
||||||
[ReadingMode.SINGLE_PAGE]: PageInViewportType.X,
|
[ReadingMode.SINGLE_PAGE]: PageInViewportType.X,
|
||||||
@@ -104,8 +102,6 @@ const BaseReaderViewer = forwardRef(
|
|||||||
shouldStretchPage,
|
shouldStretchPage,
|
||||||
isStaticNav,
|
isStaticNav,
|
||||||
readerNavBarWidth,
|
readerNavBarWidth,
|
||||||
isVisible: isOverlayVisible,
|
|
||||||
setIsVisible: setIsOverlayVisible,
|
|
||||||
updateCurrentPageIndex,
|
updateCurrentPageIndex,
|
||||||
showPreview,
|
showPreview,
|
||||||
setShowPreview,
|
setShowPreview,
|
||||||
@@ -145,7 +141,6 @@ const BaseReaderViewer = forwardRef(
|
|||||||
| 'isStaticNav'
|
| 'isStaticNav'
|
||||||
> &
|
> &
|
||||||
Pick<NavbarContextType, 'readerNavBarWidth'> &
|
Pick<NavbarContextType, 'readerNavBarWidth'> &
|
||||||
Pick<TReaderOverlayContext, 'isVisible' | 'setIsVisible'> &
|
|
||||||
Pick<
|
Pick<
|
||||||
ReaderStateChapters,
|
ReaderStateChapters,
|
||||||
| 'initialChapter'
|
| 'initialChapter'
|
||||||
@@ -162,6 +157,7 @@ const BaseReaderViewer = forwardRef(
|
|||||||
ref: ForwardedRef<HTMLDivElement | null>,
|
ref: ForwardedRef<HTMLDivElement | null>,
|
||||||
) => {
|
) => {
|
||||||
const { direction: themeDirection } = useTheme();
|
const { direction: themeDirection } = useTheme();
|
||||||
|
const isOverlayVisible = useReaderStore((state) => state.overlay.isVisible);
|
||||||
const { resumeMode = ReaderResumeMode.START } = useLocation<ReaderOpenChapterLocationState>().state ?? {
|
const { resumeMode = ReaderResumeMode.START } = useLocation<ReaderOpenChapterLocationState>().state ?? {
|
||||||
resumeMode: ReaderResumeMode.START,
|
resumeMode: ReaderResumeMode.START,
|
||||||
};
|
};
|
||||||
@@ -274,13 +270,7 @@ const BaseReaderViewer = forwardRef(
|
|||||||
);
|
);
|
||||||
useReaderHideCursorOnInactivity(scrollElementRef);
|
useReaderHideCursorOnInactivity(scrollElementRef);
|
||||||
useReaderHorizontalModeInvertXYScrolling(readingMode, readingDirection, scrollElementRef);
|
useReaderHorizontalModeInvertXYScrolling(readingMode, readingDirection, scrollElementRef);
|
||||||
useReaderHideOverlayOnUserScroll(
|
useReaderHideOverlayOnUserScroll(isOverlayVisible, showPreview, setShowPreview, scrollElementRef);
|
||||||
isOverlayVisible,
|
|
||||||
setIsOverlayVisible,
|
|
||||||
showPreview,
|
|
||||||
setShowPreview,
|
|
||||||
scrollElementRef,
|
|
||||||
);
|
|
||||||
useReaderAutoScroll(isOverlayVisible, automaticScrolling, isStaticNav);
|
useReaderAutoScroll(isOverlayVisible, automaticScrolling, isStaticNav);
|
||||||
useReaderPreserveScrollPosition(
|
useReaderPreserveScrollPosition(
|
||||||
scrollElementRef,
|
scrollElementRef,
|
||||||
@@ -447,7 +437,6 @@ export const ReaderViewer = withPropsFrom(
|
|||||||
[
|
[
|
||||||
userReaderStatePagesContext,
|
userReaderStatePagesContext,
|
||||||
ReaderService.useSettingsWithoutDefaultFlag,
|
ReaderService.useSettingsWithoutDefaultFlag,
|
||||||
useReaderOverlayContext,
|
|
||||||
() => ({ updateCurrentPageIndex: ReaderControls.useUpdateCurrentPageIndex() }),
|
() => ({ updateCurrentPageIndex: ReaderControls.useUpdateCurrentPageIndex() }),
|
||||||
useReaderTapZoneContext,
|
useReaderTapZoneContext,
|
||||||
useReaderStateChaptersContext,
|
useReaderStateChaptersContext,
|
||||||
@@ -478,8 +467,6 @@ export const ReaderViewer = withPropsFrom(
|
|||||||
'isStaticNav',
|
'isStaticNav',
|
||||||
'readerNavBarWidth',
|
'readerNavBarWidth',
|
||||||
'transitionPageMode',
|
'transitionPageMode',
|
||||||
'isVisible',
|
|
||||||
'setIsVisible',
|
|
||||||
'updateCurrentPageIndex',
|
'updateCurrentPageIndex',
|
||||||
'showPreview',
|
'showPreview',
|
||||||
'setShowPreview',
|
'setShowPreview',
|
||||||
|
|||||||
11
src/lib/zustand/Zustand.types.ts
Normal file
11
src/lib/zustand/Zustand.types.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) Contributors to the Suwayomi project
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { StateCreator } from 'zustand';
|
||||||
|
|
||||||
|
export type ImmerStateCreator<T> = StateCreator<T, [['zustand/immer', never], never], [], T>;
|
||||||
Reference in New Issue
Block a user