Resume chapter at specific page
- open from outside reader - is read - yes: 1st page - no : last read page - inside reader via - chapter selection: first page - previous chapter : last page - next chapter : first page
This commit is contained in:
@@ -24,6 +24,7 @@ import { ReaderNavBarDesktopNextPreviousButton } from '@/modules/reader/componen
|
||||
import { useGetOptionForDirection } from '@/theme.tsx';
|
||||
import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
|
||||
import { READING_DIRECTION_TO_THEME_DIRECTION } from '@/modules/reader/constants/ReaderSettings.constants.tsx';
|
||||
import { ReaderResumeMode } from '@/modules/reader/types/Reader.types.ts';
|
||||
|
||||
export const ReaderNavBarDesktopChapterNavigation = ({
|
||||
currentChapter,
|
||||
@@ -61,6 +62,7 @@ export const ReaderNavBarDesktopChapterNavigation = ({
|
||||
direction,
|
||||
)}
|
||||
replace
|
||||
state={{ resumeMode: getOptionForDirection(ReaderResumeMode.END, ReaderResumeMode.START) }}
|
||||
/>
|
||||
<FormControl sx={{ flexBasis: '70%', flexGrow: 0, flexShrink: 0 }}>
|
||||
<InputLabel id="reader-nav-bar-desktop-chapter-select">{t('chapter.title_one')}</InputLabel>
|
||||
@@ -92,6 +94,7 @@ export const ReaderNavBarDesktopChapterNavigation = ({
|
||||
direction,
|
||||
)}
|
||||
replace
|
||||
state={{ resumeMode: getOptionForDirection(ReaderResumeMode.START, ReaderResumeMode.END) }}
|
||||
/>
|
||||
<Popover
|
||||
{...bindPopover(popupState)}
|
||||
|
||||
@@ -20,7 +20,7 @@ import { useReaderStateChaptersContext } from '@/modules/reader/contexts/state/R
|
||||
import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
|
||||
import { getPage } from '@/modules/reader/utils/ReaderProgressBar.utils.tsx';
|
||||
import { getOptionForDirection } from '@/theme.tsx';
|
||||
import { ProgressBarPosition } from '@/modules/reader/types/Reader.types.ts';
|
||||
import { ProgressBarPosition, ReaderResumeMode } from '@/modules/reader/types/Reader.types.ts';
|
||||
import { ReaderProgressBarDirectionWrapper } from '@/modules/reader/components/overlay/progress-bar/ReaderProgressBarDirectionWrapper.tsx';
|
||||
import { useReaderProgressBarContext } from '@/modules/reader/contexts/ReaderProgressBarContext.tsx';
|
||||
import { useReaderOverlayContext } from '@/modules/reader/contexts/ReaderOverlayContext.tsx';
|
||||
@@ -34,8 +34,8 @@ export const MobileReaderProgressBar = () => {
|
||||
|
||||
const direction = ReaderService.useGetThemeDirection();
|
||||
|
||||
const openNextChapter = ReaderService.useNavigateToChapter(nextChapter);
|
||||
const openPreviousChapter = ReaderService.useNavigateToChapter(previousChapter);
|
||||
const openNextChapter = ReaderService.useNavigateToChapter(nextChapter, ReaderResumeMode.START);
|
||||
const openPreviousChapter = ReaderService.useNavigateToChapter(previousChapter, ReaderResumeMode.END);
|
||||
|
||||
useLayoutEffect(() => {
|
||||
setIsMaximized(isVisible);
|
||||
|
||||
@@ -15,9 +15,10 @@ import { ReaderService } from '@/modules/reader/services/ReaderService.ts';
|
||||
import { useReaderStateChaptersContext } from '@/modules/reader/contexts/state/ReaderStateChaptersContext.tsx';
|
||||
import {
|
||||
PageInViewportType,
|
||||
ReaderResumeMode,
|
||||
ReaderTransitionPageMode,
|
||||
ReadingDirection,
|
||||
ReadingMode,
|
||||
ReaderTransitionPageMode,
|
||||
} from '@/modules/reader/types/Reader.types.ts';
|
||||
import { ScrollDirection, ScrollOffset } from '@/modules/core/Core.types.ts';
|
||||
import { ReaderScrollAmount } from '@/modules/reader/constants/ReaderSettings.constants.tsx';
|
||||
@@ -115,8 +116,8 @@ export class ReaderControls {
|
||||
const { previousChapter, nextChapter } = useReaderStateChaptersContext();
|
||||
const direction = READING_DIRECTION_TO_DIRECTION[readingDirection.value];
|
||||
|
||||
const openPreviousChapter = ReaderService.useNavigateToChapter(previousChapter);
|
||||
const openNextChapter = ReaderService.useNavigateToChapter(nextChapter);
|
||||
const openPreviousChapter = ReaderService.useNavigateToChapter(previousChapter, ReaderResumeMode.END);
|
||||
const openNextChapter = ReaderService.useNavigateToChapter(nextChapter, ReaderResumeMode.START);
|
||||
|
||||
return useCallback(
|
||||
(offset) => {
|
||||
|
||||
@@ -17,6 +17,7 @@ import {
|
||||
IReaderSettingsWithDefaultFlag,
|
||||
ReaderExitMode,
|
||||
ReaderOverlayMode,
|
||||
ReaderResumeMode,
|
||||
ReadingDirection,
|
||||
} from '@/modules/reader/types/Reader.types.ts';
|
||||
import { useReaderStateMangaContext } from '@/modules/reader/contexts/state/ReaderStateMangaContext.tsx';
|
||||
@@ -44,9 +45,19 @@ const DIRECTION_TO_READING_DIRECTION: Record<Direction, ReadingDirection> = {
|
||||
};
|
||||
|
||||
export class ReaderService {
|
||||
static useNavigateToChapter(chapter?: TChapterReader): () => void {
|
||||
static useNavigateToChapter(chapter?: TChapterReader, resumeMode?: ReaderResumeMode): () => void {
|
||||
const navigate = useNavigate();
|
||||
return useCallback(() => chapter && navigate(Chapters.getReaderUrl(chapter), { replace: true }), [chapter]);
|
||||
return useCallback(
|
||||
() =>
|
||||
chapter &&
|
||||
navigate(Chapters.getReaderUrl(chapter), {
|
||||
replace: true,
|
||||
state: {
|
||||
resumeMode,
|
||||
},
|
||||
}),
|
||||
[chapter],
|
||||
);
|
||||
}
|
||||
|
||||
static useSettings(): IReaderSettingsWithDefaultFlag {
|
||||
|
||||
@@ -214,3 +214,9 @@ export enum ReaderTransitionPageMode {
|
||||
NEXT,
|
||||
BOTH,
|
||||
}
|
||||
|
||||
export enum ReaderResumeMode {
|
||||
START,
|
||||
END,
|
||||
LAST_READ,
|
||||
}
|
||||
|
||||
25
src/modules/reader/utils/Reader.utils.ts
Normal file
25
src/modules/reader/utils/Reader.utils.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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 { ReaderResumeMode } from '@/modules/reader/types/Reader.types.ts';
|
||||
|
||||
export const getInitialReaderPageIndex = (
|
||||
resumeMode: ReaderResumeMode,
|
||||
lastReadPageIndex: number,
|
||||
lastPageIndex: number,
|
||||
): number => {
|
||||
if (resumeMode === ReaderResumeMode.START) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (resumeMode === ReaderResumeMode.END) {
|
||||
return lastPageIndex;
|
||||
}
|
||||
|
||||
return Math.max(0, Math.min(lastPageIndex, lastReadPageIndex));
|
||||
};
|
||||
Reference in New Issue
Block a user