From a65ca228fefcb3e0dec1d693bd21f217c305b7fa Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 13 May 2024 04:04:41 +0200 Subject: [PATCH] Keep initial opened chapter as duplicate reference In case "skip duplicated chapters" is enabled and the next chapter is from a different scanlator, the initial opened chapter should still be used to remove duplicated chapters. Otherwise, the original scanlator would get lost and the scanlator of the next chapter would get used, which was only a fallback chapter, because the initial chapters scanlator did not have a next chapter. --- src/lib/data/Chapters.ts | 7 ++++--- src/screens/Reader.tsx | 45 ++++++++++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/lib/data/Chapters.ts b/src/lib/data/Chapters.ts index f8f51ea8..8a9941f9 100644 --- a/src/lib/data/Chapters.ts +++ b/src/lib/data/Chapters.ts @@ -342,7 +342,7 @@ export class Chapters { { offset = ChapterOffset.NEXT, ...options - }: { offset?: ChapterOffset; onlyUnread?: boolean; skipDupe?: boolean } = {}, + }: { offset?: ChapterOffset; onlyUnread?: boolean; skipDupe?: boolean; skipDupeChapter?: Chapter } = {}, ): Chapter | undefined { const nextChapters = Chapters.getNextChapters(currentChapter, chapters, { offset, ...options }); @@ -360,7 +360,8 @@ export class Chapters { offset = ChapterOffset.NEXT, onlyUnread = false, skipDupe = false, - }: { offset?: ChapterOffset; onlyUnread?: boolean; skipDupe?: boolean } = {}, + skipDupeChapter = fromChapter, + }: { offset?: ChapterOffset; onlyUnread?: boolean; skipDupe?: boolean; skipDupeChapter?: Chapter } = {}, ): Chapter[] { const fromChapterIndex = chapters.findIndex((chapter) => chapter.id === fromChapter.id); @@ -370,7 +371,7 @@ export class Chapters { const nextChaptersIncludingCurrent = chapters.slice(sliceStartIndex, sliceEndIndex); const uniqueNextChapters = skipDupe - ? Chapters.removeDuplicates(fromChapter, nextChaptersIncludingCurrent) + ? Chapters.removeDuplicates(skipDupeChapter, nextChaptersIncludingCurrent) : nextChaptersIncludingCurrent; const nextChapters = uniqueNextChapters.toSpliced(isNextChapterOffset ? -1 : 0, 1); diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index 7ffdb7a0..003ab539 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -60,12 +60,13 @@ const getReaderComponent = (readerType: ReaderType) => { }; const range = (n: number) => Array.from({ length: n }, (value, key) => key); -const initialChapter = { +const fallbackChapter = { pageCount: -1, sourceOrder: -1, chapterCount: 0, lastPageRead: 0, name: 'Loading...', + manga: { id: -1 }, } as unknown as TChapter; export function Reader() { @@ -75,7 +76,7 @@ export function Reader() { const { chapterIndex, mangaId } = useParams<{ chapterIndex: string; mangaId: string }>(); - const initialManga = useMemo( + const fallbackManga = useMemo( () => ({ id: +mangaId, @@ -101,7 +102,7 @@ export function Reader() { Number(mangaId) === loadedChapter.current?.manga.id && Number(chapterIndex) === loadedChapter.current?.sourceOrder && loadedChapter.current?.pageCount !== -1; - const manga = data?.manga ?? initialManga; + const manga = data?.manga ?? fallbackManga; const { data: chapterData, loading: isChapterLoading, @@ -135,7 +136,16 @@ export function Reader() { }; loadedChapter.current = getLoadedChapter(); - const chapter = loadedChapter.current ?? initialChapter; + const chapter = loadedChapter.current ?? fallbackChapter; + + const initialChapterRef = useRef(fallbackChapter); + if (initialChapterRef.current === fallbackChapter) { + initialChapterRef.current = chapter; + } + if (chapter.manga.id !== initialChapterRef.current?.manga.id) { + initialChapterRef.current = fallbackChapter; + } + const [fetchPages, { loading: arePagesLoading, error: pagesError }] = requestManager.useGetChapterPagesFetch( chapter.id, ); @@ -187,39 +197,48 @@ export function Reader() { const uniqueChapters = useMemo( () => - settings.skipDupChapters ? Chapters.removeDuplicates(chapter, mangaChapters ?? []) : mangaChapters ?? [], - [chapter, mangaChapters, settings.skipDupChapters], + settings.skipDupChapters + ? Chapters.removeDuplicates(initialChapterRef.current, mangaChapters ?? []) + : mangaChapters ?? [], + [initialChapterRef.current, mangaChapters, settings.skipDupChapters], ); const prevChapters = useMemo( () => Chapters.getNextChapters(chapter, mangaChapters ?? [], { offset: ChapterOffset.PREV, skipDupe: settings.skipDupChapters, + skipDupeChapter: initialChapterRef.current, }), - [chapter, mangaChapters, settings.skipDupChapters], + [chapter, initialChapterRef.current, mangaChapters, settings.skipDupChapters], ); const nextChapters = useMemo( - () => Chapters.getNextChapters(chapter, mangaChapters ?? [], { skipDupe: settings.skipDupChapters }), - [chapter, mangaChapters, settings.skipDupChapters], + () => + Chapters.getNextChapters(chapter, mangaChapters ?? [], { + skipDupe: settings.skipDupChapters, + skipDupeChapter: initialChapterRef.current, + }), + [chapter, initialChapterRef.current, mangaChapters, settings.skipDupChapters], ); const prevChapter = useMemo( () => Chapters.getNextChapter(chapter, mangaChapters ?? [], { offset: ChapterOffset.PREV, skipDupe: settings.skipDupChapters, + skipDupeChapter: initialChapterRef.current, }), - [chapter, mangaChapters, settings.skipDupChapters], + [chapter, initialChapterRef.current, mangaChapters, settings.skipDupChapters], ); const nextChapter = useMemo( () => Chapters.getNextChapter(chapter, mangaChapters ?? [], { skipDupe: settings.skipDupChapters, + skipDupeChapter: initialChapterRef.current, }), - [chapter, mangaChapters, settings.skipDupChapters], + [chapter, initialChapterRef.current, mangaChapters, settings.skipDupChapters], ); const updateChapter = (patch: UpdateChapterPatchInput) => { - if (chapter === initialChapter) { + if (chapter === fallbackChapter) { return; } @@ -404,7 +423,7 @@ export function Reader() { return; } - if (chapter === initialChapter) { + if (chapter === fallbackChapter) { return; }