Cleanup library filter logic

This commit is contained in:
schroda
2024-08-14 23:12:51 +02:00
parent 431248d69a
commit 054b9c33bc

View File

@@ -92,32 +92,40 @@ const trackerFilter = (trackFilters: LibraryOptions['tracker'], manga: TMangaTra
}) })
.every((matchesFilter) => matchesFilter); .every((matchesFilter) => matchesFilter);
type TMangaFilter = TMangaQueryFilter & type TMangaFilterOptions = {
TMangaTrackerFilter & unread: NullAndUndefined<boolean>;
Pick<MangaType, 'downloadCount' | 'unreadCount' | 'bookmarkCount' | 'hasDuplicateChapters'>; downloaded: NullAndUndefined<boolean>;
const filterManga = <Manga extends TMangaFilter>( bookmarked: NullAndUndefined<boolean>;
mangas: Manga[], hasDuplicateChapters: NullAndUndefined<boolean>;
query: NullAndUndefined<string>, tracker: LibraryOptions['tracker'];
unread: NullAndUndefined<boolean>, };
downloaded: NullAndUndefined<boolean>, type TMangaFilter = Pick<MangaType, 'downloadCount' | 'unreadCount' | 'bookmarkCount' | 'hasDuplicateChapters'> &
bookmarked: NullAndUndefined<boolean>, TMangaTrackerFilter;
hasDuplicateChapters: NullAndUndefined<boolean>, const filterManga = (
tracker: LibraryOptions['tracker'], manga: TMangaFilter,
ignoreFilters: boolean, { unread, downloaded, bookmarked, hasDuplicateChapters, tracker }: TMangaFilterOptions,
): Manga[] => ): boolean =>
mangas.filter((manga) => { triStateFilterNumber(downloaded, manga.downloadCount) &&
const ignoreFiltersWhileSearching = ignoreFilters && query?.length;
const matchesSearch = querySearchManga(query, manga);
const matchesFilters =
ignoreFiltersWhileSearching ||
(triStateFilterNumber(downloaded, manga.downloadCount) &&
triStateFilterNumber(unread, manga.unreadCount) && triStateFilterNumber(unread, manga.unreadCount) &&
triStateFilterNumber(bookmarked, manga.bookmarkCount) && triStateFilterNumber(bookmarked, manga.bookmarkCount) &&
triStateFilterBoolean(hasDuplicateChapters, manga.hasDuplicateChapters) && triStateFilterBoolean(hasDuplicateChapters, manga.hasDuplicateChapters) &&
trackerFilter(tracker, manga)); trackerFilter(tracker, manga);
type TMangasFilter = TMangaQueryFilter & TMangaFilter;
const filterMangas = <Manga extends TMangasFilter>(
mangas: Manga[],
query: NullAndUndefined<string>,
options: TMangaFilterOptions & { ignoreFilters: boolean },
): Manga[] => {
const ignoreFiltersWhileSearching = options.ignoreFilters && query?.length;
return mangas.filter((manga) => {
const matchesSearch = querySearchManga(query, manga);
const matchesFilters = ignoreFiltersWhileSearching || filterManga(manga, options);
return matchesSearch && matchesFilters; return matchesSearch && matchesFilters;
}); });
};
const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number(a) - Number(b); const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number(a) - Number(b);
@@ -167,7 +175,7 @@ const sortManga = <Manga extends TMangaSort>(
return result; return result;
}; };
export const useGetVisibleLibraryMangas = <Manga extends MangaIdInfo & TMangaFilter & TMangaSort>( export const useGetVisibleLibraryMangas = <Manga extends MangaIdInfo & TMangasFilter & TMangaSort>(
mangas: Manga[], mangas: Manga[],
): { ): {
visibleMangas: Manga[]; visibleMangas: Manga[];
@@ -180,16 +188,14 @@ export const useGetVisibleLibraryMangas = <Manga extends MangaIdInfo & TMangaFil
const filteredMangas = useMemo( const filteredMangas = useMemo(
() => () =>
filterManga( filterMangas(mangas, query, {
mangas,
query,
unread, unread,
downloaded, downloaded,
bookmarked, bookmarked,
hasDuplicateChapters, hasDuplicateChapters,
tracker, tracker,
settings.ignoreFilters, ignoreFilters: settings.ignoreFilters,
), }),
[mangas, query, unread, downloaded, bookmarked, hasDuplicateChapters, tracker, settings.ignoreFilters], [mangas, query, unread, downloaded, bookmarked, hasDuplicateChapters, tracker, settings.ignoreFilters],
); );
const sortedMangas = useMemo( const sortedMangas = useMemo(