From d51150b7848cf7a6596bbba7c015328a578dfd16 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:37:12 +0200 Subject: [PATCH] Feature/reader skip duplicate chapters (#262) * Skip duplicate chapters in the Reader * Debounce "end of page" handling in the reader * Update keyboard event listener In case the "go" function changed, the listeners have to be updated --- src/components/navbar/ReaderNavBar.tsx | 66 ++++++++----- .../reader/ReaderSettingsOptions.tsx | 11 +++ .../reader/pager/DoublePagedPager.tsx | 2 +- .../reader/pager/HorizontalPager.tsx | 2 +- src/components/reader/pager/PagedPager.tsx | 2 +- src/components/reader/pager/VerticalPager.tsx | 13 ++- src/i18n/locale/en.json | 9 +- src/screens/Reader.tsx | 92 ++++++++++++++++--- .../settings/DefaultReaderSettings.tsx | 1 + src/typings.ts | 6 ++ src/util/readerSettings.ts | 1 + 11 files changed, 165 insertions(+), 40 deletions(-) diff --git a/src/components/navbar/ReaderNavBar.tsx b/src/components/navbar/ReaderNavBar.tsx index 44976b66..2fb81f9c 100644 --- a/src/components/navbar/ReaderNavBar.tsx +++ b/src/components/navbar/ReaderNavBar.tsx @@ -25,7 +25,7 @@ import Collapse from '@mui/material/Collapse'; import { styled } from '@mui/system'; import useBackTo from 'util/useBackTo'; import ReaderSettingsOptions from 'components/reader/ReaderSettingsOptions'; -import { IChapter, IManga, IMangaCard, IReaderSettings } from 'typings'; +import { ChapterOffset, IChapter, IManga, IMangaCard, IReaderSettings } from 'typings'; import { useTranslation } from 'react-i18next'; const Root = styled('div')(({ theme }) => ({ @@ -119,6 +119,8 @@ interface IProps { chapter: IChapter; curPage: number; scrollToPage: (page: number) => void; + openNextChapter: (offset: ChapterOffset, setHistory: (nextChapterIndex: number) => void) => Promise; + retrievingNextChapter: boolean; } export default function ReaderNavBar(props: IProps) { @@ -131,7 +133,8 @@ export default function ReaderNavBar(props: IProps) { }>(); const { prevDrawerOpen, prevSettingsCollapseOpen } = location.state ?? {}; - const { settings, setSettingValue, manga, chapter, curPage, scrollToPage } = props; + const { settings, setSettingValue, manga, chapter, curPage, scrollToPage, openNextChapter, retrievingNextChapter } = + props; const [drawerOpen, setDrawerOpen] = useState(settings.staticNav || prevDrawerOpen); const [updateDrawerOnRender, setUpdateDrawerOnRender] = useState(true); @@ -139,6 +142,8 @@ export default function ReaderNavBar(props: IProps) { const [prevScrollPos, setPrevScrollPos] = useState(0); const [settingsCollapseOpen, setSettingsCollapseOpen] = useState(prevSettingsCollapseOpen ?? true); + const disableChapterNavButtons = retrievingNextChapter; + const updateSettingValue = (key: keyof IReaderSettings, value: string | boolean) => { // prevent closing the navBar when updating the "staticNav" setting setUpdateDrawerOnRender(key !== 'staticNav'); @@ -254,6 +259,7 @@ export default function ReaderNavBar(props: IProps) { staticNav={settings.staticNav} showPageNumber={settings.showPageNumber} loadNextOnEnding={settings.loadNextOnEnding} + skipDupChapters={settings.skipDupChapters} readerType={settings.readerType} /> @@ -261,7 +267,11 @@ export default function ReaderNavBar(props: IProps) { {t('reader.page_info.label.currently_on_page')} - + = 1 ? chapter.index : ''} @@ -328,15 +344,21 @@ export default function ReaderNavBar(props: IProps) { = chapter.chapterCount} + disabled={ + disableChapterNavButtons || + chapter.index < 1 || + chapter.index >= chapter.chapterCount + } onClick={() => { - history.replace({ - pathname: `/manga/${manga.id}/chapter/${chapter.index + 1}`, - state: { - prevDrawerOpen: drawerOpen, - prevSettingsCollapseOpen: settingsCollapseOpen, - }, - }); + openNextChapter(ChapterOffset.NEXT, (nextChapterIndex) => + history.replace({ + pathname: `/manga/${manga.id}/chapter/${nextChapterIndex}`, + state: { + prevDrawerOpen: drawerOpen, + prevSettingsCollapseOpen: settingsCollapseOpen, + }, + }), + ); }} > diff --git a/src/components/reader/ReaderSettingsOptions.tsx b/src/components/reader/ReaderSettingsOptions.tsx index 1aa5c408..6133938e 100644 --- a/src/components/reader/ReaderSettingsOptions.tsx +++ b/src/components/reader/ReaderSettingsOptions.tsx @@ -23,6 +23,7 @@ export default function ReaderSettingsOptions({ loadNextOnEnding, readerType, showPageNumber, + skipDupChapters, setSettingValue, }: IProps) { const { t } = useTranslation(); @@ -59,6 +60,16 @@ export default function ReaderSettingsOptions({ /> + + + + setSettingValue('skipDupChapters', e.target.checked)} + /> + +