2022-01-24 15:09:28 +05:30
|
|
|
/*
|
|
|
|
|
* 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
|
2023-05-18 13:17:41 +02:00
|
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
|
|
|
*/
|
2022-01-24 15:09:28 +05:30
|
|
|
|
2024-10-05 19:15:25 +02:00
|
|
|
import { ChapterBookmarkInfo, ChapterDownloadInfo, ChapterReadInfo } from '@/modules/chapter/services/Chapters.ts';
|
2024-07-02 16:20:28 +02:00
|
|
|
import { ChapterType } from '@/lib/graphql/generated/graphql.ts';
|
2024-10-05 19:15:25 +02:00
|
|
|
import { NullAndUndefined } from '@/Base.types.ts';
|
|
|
|
|
import { ChapterListOptions } from '@/modules/chapter/Chapter.types.ts';
|
2022-01-24 15:09:28 +05:30
|
|
|
|
2024-07-02 16:20:28 +02:00
|
|
|
export function unreadFilter(unread: NullAndUndefined<boolean>, { isRead: isChapterRead }: ChapterReadInfo) {
|
2022-01-24 15:09:28 +05:30
|
|
|
switch (unread) {
|
|
|
|
|
case true:
|
|
|
|
|
return !isChapterRead;
|
|
|
|
|
case false:
|
|
|
|
|
return isChapterRead;
|
|
|
|
|
default:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-02 16:20:28 +02:00
|
|
|
function downloadFilter(downloaded: NullAndUndefined<boolean>, { isDownloaded: chapterDownload }: ChapterDownloadInfo) {
|
2022-01-24 15:09:28 +05:30
|
|
|
switch (downloaded) {
|
|
|
|
|
case true:
|
|
|
|
|
return chapterDownload;
|
|
|
|
|
case false:
|
|
|
|
|
return !chapterDownload;
|
|
|
|
|
default:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-02 16:20:28 +02:00
|
|
|
function bookmarkedFilter(
|
|
|
|
|
bookmarked: NullAndUndefined<boolean>,
|
|
|
|
|
{ isBookmarked: chapterBookmarked }: ChapterBookmarkInfo,
|
|
|
|
|
) {
|
2022-01-24 15:09:28 +05:30
|
|
|
switch (bookmarked) {
|
|
|
|
|
case true:
|
|
|
|
|
return chapterBookmarked;
|
|
|
|
|
case false:
|
|
|
|
|
return !chapterBookmarked;
|
|
|
|
|
default:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-02 16:20:28 +02:00
|
|
|
type TChapterSort = Pick<ChapterType, 'sourceOrder' | 'fetchedAt' | 'chapterNumber' | 'uploadDate'>;
|
|
|
|
|
const sortChapters = <T extends TChapterSort>(
|
|
|
|
|
chapters: T[],
|
2024-06-30 13:40:10 +02:00
|
|
|
{ sortBy, reverse }: Pick<ChapterListOptions, 'sortBy' | 'reverse'>,
|
2024-07-02 16:20:28 +02:00
|
|
|
): T[] => {
|
|
|
|
|
const sortedChapters: T[] = [...chapters];
|
2024-06-30 13:40:10 +02:00
|
|
|
|
|
|
|
|
switch (sortBy) {
|
|
|
|
|
case 'source':
|
|
|
|
|
sortedChapters.sort((a, b) => a.sourceOrder - b.sourceOrder);
|
|
|
|
|
break;
|
|
|
|
|
case 'fetchedAt':
|
|
|
|
|
sortedChapters.sort((a, b) => Number(a.fetchedAt ?? 0) - Number(b.fetchedAt ?? 0));
|
|
|
|
|
break;
|
2024-06-30 13:46:09 +02:00
|
|
|
case 'chapterNumber':
|
|
|
|
|
sortedChapters.sort((a, b) => a.chapterNumber - b.chapterNumber);
|
|
|
|
|
break;
|
|
|
|
|
case 'uploadedAt':
|
|
|
|
|
sortedChapters.sort((a, b) => Number(a.uploadDate ?? 0) - Number(b.uploadDate ?? 0));
|
|
|
|
|
break;
|
2024-06-30 13:40:10 +02:00
|
|
|
default:
|
|
|
|
|
// nothing to do
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (reverse) {
|
|
|
|
|
sortedChapters.reverse();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sortedChapters;
|
|
|
|
|
};
|
|
|
|
|
|
2024-07-02 16:20:28 +02:00
|
|
|
type TChapterFilter = TChapterSort & ChapterReadInfo & ChapterDownloadInfo & ChapterBookmarkInfo;
|
|
|
|
|
export function filterAndSortChapters<Chapters extends TChapterFilter>(
|
|
|
|
|
chapters: Chapters[],
|
|
|
|
|
options: ChapterListOptions,
|
|
|
|
|
): Chapters[] {
|
2022-01-24 15:09:28 +05:30
|
|
|
const filtered = options.active
|
2023-02-06 10:06:33 +01:00
|
|
|
? chapters.filter(
|
|
|
|
|
(chp) =>
|
|
|
|
|
unreadFilter(options.unread, chp) &&
|
|
|
|
|
downloadFilter(options.downloaded, chp) &&
|
|
|
|
|
bookmarkedFilter(options.bookmarked, chp),
|
|
|
|
|
)
|
2022-01-24 15:09:28 +05:30
|
|
|
: [...chapters];
|
2024-06-30 13:40:10 +02:00
|
|
|
|
|
|
|
|
return sortChapters(filtered, options);
|
2022-01-24 15:09:28 +05:30
|
|
|
}
|
|
|
|
|
|
2022-11-09 18:09:15 +01:00
|
|
|
export const isFilterActive = (options: ChapterListOptions) => {
|
|
|
|
|
const { unread, downloaded, bookmarked } = options;
|
|
|
|
|
return unread != null || downloaded != null || bookmarked != null;
|
|
|
|
|
};
|