Fix/manually deleting chapter ignores bookmark (#675)
* Rename "Chapters::isAutoDeletable" to "isDeletable" * Rename "Chapters::getAutoDeletable" to "getDeletable" * Prevent manually deleting bookmarked chapters unless allowed
This commit is contained in:
@@ -33,6 +33,7 @@ import { IChapterWithMeta } from '@/components/chapter/ChapterList.tsx';
|
|||||||
import { ChaptersWithMeta } from '@/lib/data/ChaptersWithMeta.ts';
|
import { ChaptersWithMeta } from '@/lib/data/ChaptersWithMeta.ts';
|
||||||
import { createGetMenuItemTitle, createIsMenuItemDisabled, createShouldShowMenuItem } from '@/components/menu/util.ts';
|
import { createGetMenuItemTitle, createIsMenuItemDisabled, createShouldShowMenuItem } from '@/components/menu/util.ts';
|
||||||
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
|
||||||
|
import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
|
||||||
|
|
||||||
type BaseProps = { onClose: () => void };
|
type BaseProps = { onClose: () => void };
|
||||||
|
|
||||||
@@ -64,6 +65,10 @@ export const ChapterActionMenuItems = ({
|
|||||||
const isSingleMode = !!chapter;
|
const isSingleMode = !!chapter;
|
||||||
const { isDownloaded, isRead, isBookmarked } = chapter ?? {};
|
const { isDownloaded, isRead, isBookmarked } = chapter ?? {};
|
||||||
|
|
||||||
|
const {
|
||||||
|
settings: { deleteChaptersWithBookmark },
|
||||||
|
} = useMetadataServerSettings();
|
||||||
|
|
||||||
const getMenuItemTitle = createGetMenuItemTitle(isSingleMode, actionToTranslationKey);
|
const getMenuItemTitle = createGetMenuItemTitle(isSingleMode, actionToTranslationKey);
|
||||||
const shouldShowMenuItem = createShouldShowMenuItem(isSingleMode);
|
const shouldShowMenuItem = createShouldShowMenuItem(isSingleMode);
|
||||||
const isMenuItemDisabled = createIsMenuItemDisabled(isSingleMode);
|
const isMenuItemDisabled = createIsMenuItemDisabled(isSingleMode);
|
||||||
@@ -96,6 +101,19 @@ export const ChapterActionMenuItems = ({
|
|||||||
const isMarkPrevAsRead = action === 'mark_prev_as_read';
|
const isMarkPrevAsRead = action === 'mark_prev_as_read';
|
||||||
const actualAction: ChapterAction = isMarkPrevAsRead ? 'mark_as_read' : action;
|
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)[] => {
|
const getChapters = (): (ChapterDownloadInfo & ChapterBookmarkInfo & ChapterReadInfo)[] => {
|
||||||
// select mode
|
// select mode
|
||||||
if (!chapter) {
|
if (!chapter) {
|
||||||
@@ -151,7 +169,12 @@ export const ChapterActionMenuItems = ({
|
|||||||
<MenuItem
|
<MenuItem
|
||||||
Icon={Delete}
|
Icon={Delete}
|
||||||
disabled={isMenuItemDisabled(!downloadedChapters.length)}
|
disabled={isMenuItemDisabled(!downloadedChapters.length)}
|
||||||
onClick={() => performAction('delete', downloadedChapters)}
|
onClick={() =>
|
||||||
|
performAction(
|
||||||
|
'delete',
|
||||||
|
ChaptersWithMeta.getDeletable(downloadedChapters, deleteChaptersWithBookmark),
|
||||||
|
)
|
||||||
|
}
|
||||||
title={getMenuItemTitle('delete', downloadedChapters.length)}
|
title={getMenuItemTitle('delete', downloadedChapters.length)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -133,18 +133,18 @@ export class Chapters {
|
|||||||
return chapters.filter(Chapters.isDownloaded);
|
return chapters.filter(Chapters.isDownloaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
static isAutoDeletable(
|
static isDeletable(
|
||||||
{ isBookmarked, ...chapter }: ChapterDownloadInfo & ChapterBookmarkInfo,
|
{ isBookmarked, ...chapter }: ChapterDownloadInfo & ChapterBookmarkInfo,
|
||||||
canDeleteBookmarked: boolean = false,
|
canDeleteBookmarked: boolean = false,
|
||||||
): boolean {
|
): boolean {
|
||||||
return Chapters.isDownloaded(chapter) && (!isBookmarked || canDeleteBookmarked);
|
return Chapters.isDownloaded(chapter) && (!isBookmarked || canDeleteBookmarked);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getAutoDeletable<Chapters extends ChapterDownloadInfo & ChapterBookmarkInfo>(
|
static getDeletable<Chapters extends ChapterDownloadInfo & ChapterBookmarkInfo>(
|
||||||
chapters: Chapters[],
|
chapters: Chapters[],
|
||||||
canDeleteBookmarked?: boolean,
|
canDeleteBookmarked?: boolean,
|
||||||
): Chapters[] {
|
): Chapters[] {
|
||||||
return chapters.filter((chapter) => Chapters.isAutoDeletable(chapter, canDeleteBookmarked));
|
return chapters.filter((chapter) => Chapters.isDeletable(chapter, canDeleteBookmarked));
|
||||||
}
|
}
|
||||||
|
|
||||||
static isBookmarked({ isBookmarked }: ChapterBookmarkInfo): boolean {
|
static isBookmarked({ isBookmarked }: ChapterBookmarkInfo): boolean {
|
||||||
@@ -211,7 +211,7 @@ export class Chapters {
|
|||||||
const { deleteChaptersManuallyMarkedRead, deleteChaptersWithBookmark } = await getMetadataServerSettings();
|
const { deleteChaptersManuallyMarkedRead, deleteChaptersWithBookmark } = await getMetadataServerSettings();
|
||||||
const chapterIdsToDelete =
|
const chapterIdsToDelete =
|
||||||
deleteChaptersManuallyMarkedRead && wasManuallyMarkedAsRead
|
deleteChaptersManuallyMarkedRead && wasManuallyMarkedAsRead
|
||||||
? Chapters.getIds(Chapters.getAutoDeletable(chapters, deleteChaptersWithBookmark))
|
? Chapters.getIds(Chapters.getDeletable(chapters, deleteChaptersWithBookmark))
|
||||||
: [];
|
: [];
|
||||||
return Chapters.executeAction(
|
return Chapters.executeAction(
|
||||||
'mark_as_read',
|
'mark_as_read',
|
||||||
|
|||||||
@@ -28,6 +28,13 @@ export class ChaptersWithMeta {
|
|||||||
return chapters.filter(({ chapter }) => Chapters.isDownloaded(chapter));
|
return chapters.filter(({ chapter }) => Chapters.isDownloaded(chapter));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static getDeletable<Chapter extends ChapterWithMetaType>(
|
||||||
|
chapters: Chapter[],
|
||||||
|
canDeleteBookmarked?: boolean,
|
||||||
|
): Chapter[] {
|
||||||
|
return chapters.filter(({ chapter }) => Chapters.isDeletable(chapter, canDeleteBookmarked));
|
||||||
|
}
|
||||||
|
|
||||||
static getNonDownloaded<Chapter extends ChapterWithMetaType>(chapters: Chapter[]): Chapter[] {
|
static getNonDownloaded<Chapter extends ChapterWithMetaType>(chapters: Chapter[]): Chapter[] {
|
||||||
return chapters.filter(({ chapter }) => !Chapters.isDownloaded(chapter));
|
return chapters.filter(({ chapter }) => !Chapters.isDownloaded(chapter));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ export function Reader() {
|
|||||||
|
|
||||||
const shouldDeleteChapter =
|
const shouldDeleteChapter =
|
||||||
chapterToDeleteUpToDateData.isRead &&
|
chapterToDeleteUpToDateData.isRead &&
|
||||||
Chapters.isAutoDeletable(chapterToDeleteUpToDateData, metadataSettings.deleteChaptersWithBookmark);
|
Chapters.isDeletable(chapterToDeleteUpToDateData, metadataSettings.deleteChaptersWithBookmark);
|
||||||
if (!shouldDeleteChapter) {
|
if (!shouldDeleteChapter) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user