From 6fc70121c6964043bd3b989f3410e71a19d99f00 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Tue, 26 Mar 2024 23:39:04 +0100 Subject: [PATCH] Fix/manually deleting chapter ignores bookmark (#675) * Rename "Chapters::isAutoDeletable" to "isDeletable" * Rename "Chapters::getAutoDeletable" to "getDeletable" * Prevent manually deleting bookmarked chapters unless allowed --- .../chapter/ChapterActionMenuItems.tsx | 25 ++++++++++++++++++- src/lib/data/Chapters.ts | 8 +++--- src/lib/data/ChaptersWithMeta.ts | 7 ++++++ src/screens/Reader.tsx | 2 +- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/components/chapter/ChapterActionMenuItems.tsx b/src/components/chapter/ChapterActionMenuItems.tsx index 9ad03052..c48c5b93 100644 --- a/src/components/chapter/ChapterActionMenuItems.tsx +++ b/src/components/chapter/ChapterActionMenuItems.tsx @@ -33,6 +33,7 @@ import { IChapterWithMeta } from '@/components/chapter/ChapterList.tsx'; import { ChaptersWithMeta } from '@/lib/data/ChaptersWithMeta.ts'; import { createGetMenuItemTitle, createIsMenuItemDisabled, createShouldShowMenuItem } from '@/components/menu/util.ts'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; +import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; type BaseProps = { onClose: () => void }; @@ -64,6 +65,10 @@ export const ChapterActionMenuItems = ({ const isSingleMode = !!chapter; const { isDownloaded, isRead, isBookmarked } = chapter ?? {}; + const { + settings: { deleteChaptersWithBookmark }, + } = useMetadataServerSettings(); + const getMenuItemTitle = createGetMenuItemTitle(isSingleMode, actionToTranslationKey); const shouldShowMenuItem = createShouldShowMenuItem(isSingleMode); const isMenuItemDisabled = createIsMenuItemDisabled(isSingleMode); @@ -96,6 +101,19 @@ export const ChapterActionMenuItems = ({ const isMarkPrevAsRead = action === 'mark_prev_as_read'; const actualAction: ChapterAction = isMarkPrevAsRead ? 'mark_as_read' : action; + if (actualAction === 'delete' && chapter) { + const isDeletable = Chapters.isDeletable(chapter, deleteChaptersWithBookmark); + if (!isDeletable) { + onClose(); + return; + } + } + + if (!chaptersWithMeta.length) { + onClose(); + return; + } + const getChapters = (): (ChapterDownloadInfo & ChapterBookmarkInfo & ChapterReadInfo)[] => { // select mode if (!chapter) { @@ -151,7 +169,12 @@ export const ChapterActionMenuItems = ({ performAction('delete', downloadedChapters)} + onClick={() => + performAction( + 'delete', + ChaptersWithMeta.getDeletable(downloadedChapters, deleteChaptersWithBookmark), + ) + } title={getMenuItemTitle('delete', downloadedChapters.length)} /> )} diff --git a/src/lib/data/Chapters.ts b/src/lib/data/Chapters.ts index 221e6a16..565d6cce 100644 --- a/src/lib/data/Chapters.ts +++ b/src/lib/data/Chapters.ts @@ -133,18 +133,18 @@ export class Chapters { return chapters.filter(Chapters.isDownloaded); } - static isAutoDeletable( + static isDeletable( { isBookmarked, ...chapter }: ChapterDownloadInfo & ChapterBookmarkInfo, canDeleteBookmarked: boolean = false, ): boolean { return Chapters.isDownloaded(chapter) && (!isBookmarked || canDeleteBookmarked); } - static getAutoDeletable( + static getDeletable( chapters: Chapters[], canDeleteBookmarked?: boolean, ): Chapters[] { - return chapters.filter((chapter) => Chapters.isAutoDeletable(chapter, canDeleteBookmarked)); + return chapters.filter((chapter) => Chapters.isDeletable(chapter, canDeleteBookmarked)); } static isBookmarked({ isBookmarked }: ChapterBookmarkInfo): boolean { @@ -211,7 +211,7 @@ export class Chapters { const { deleteChaptersManuallyMarkedRead, deleteChaptersWithBookmark } = await getMetadataServerSettings(); const chapterIdsToDelete = deleteChaptersManuallyMarkedRead && wasManuallyMarkedAsRead - ? Chapters.getIds(Chapters.getAutoDeletable(chapters, deleteChaptersWithBookmark)) + ? Chapters.getIds(Chapters.getDeletable(chapters, deleteChaptersWithBookmark)) : []; return Chapters.executeAction( 'mark_as_read', diff --git a/src/lib/data/ChaptersWithMeta.ts b/src/lib/data/ChaptersWithMeta.ts index 494f2066..bc8d541b 100644 --- a/src/lib/data/ChaptersWithMeta.ts +++ b/src/lib/data/ChaptersWithMeta.ts @@ -28,6 +28,13 @@ export class ChaptersWithMeta { return chapters.filter(({ chapter }) => Chapters.isDownloaded(chapter)); } + static getDeletable( + chapters: Chapter[], + canDeleteBookmarked?: boolean, + ): Chapter[] { + return chapters.filter(({ chapter }) => Chapters.isDeletable(chapter, canDeleteBookmarked)); + } + static getNonDownloaded(chapters: Chapter[]): Chapter[] { return chapters.filter(({ chapter }) => !Chapters.isDownloaded(chapter)); } diff --git a/src/screens/Reader.tsx b/src/screens/Reader.tsx index 7b5f1a3b..efc4dc48 100644 --- a/src/screens/Reader.tsx +++ b/src/screens/Reader.tsx @@ -203,7 +203,7 @@ export function Reader() { const shouldDeleteChapter = chapterToDeleteUpToDateData.isRead && - Chapters.isAutoDeletable(chapterToDeleteUpToDateData, metadataSettings.deleteChaptersWithBookmark); + Chapters.isDeletable(chapterToDeleteUpToDateData, metadataSettings.deleteChaptersWithBookmark); if (!shouldDeleteChapter) { return -1; }