From 054b9c33bcc63ead6003c494aafc2f15946308aa Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Wed, 14 Aug 2024 23:12:51 +0200 Subject: [PATCH] Cleanup library filter logic --- .../library/useGetVisibleLibraryMangas.ts | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index 3bdd3a67..a7793fe3 100644 --- a/src/components/library/useGetVisibleLibraryMangas.ts +++ b/src/components/library/useGetVisibleLibraryMangas.ts @@ -92,32 +92,40 @@ const trackerFilter = (trackFilters: LibraryOptions['tracker'], manga: TMangaTra }) .every((matchesFilter) => matchesFilter); -type TMangaFilter = TMangaQueryFilter & - TMangaTrackerFilter & - Pick; -const filterManga = ( +type TMangaFilterOptions = { + unread: NullAndUndefined; + downloaded: NullAndUndefined; + bookmarked: NullAndUndefined; + hasDuplicateChapters: NullAndUndefined; + tracker: LibraryOptions['tracker']; +}; +type TMangaFilter = Pick & + TMangaTrackerFilter; +const filterManga = ( + manga: TMangaFilter, + { unread, downloaded, bookmarked, hasDuplicateChapters, tracker }: TMangaFilterOptions, +): boolean => + triStateFilterNumber(downloaded, manga.downloadCount) && + triStateFilterNumber(unread, manga.unreadCount) && + triStateFilterNumber(bookmarked, manga.bookmarkCount) && + triStateFilterBoolean(hasDuplicateChapters, manga.hasDuplicateChapters) && + trackerFilter(tracker, manga); + +type TMangasFilter = TMangaQueryFilter & TMangaFilter; +const filterMangas = ( mangas: Manga[], query: NullAndUndefined, - unread: NullAndUndefined, - downloaded: NullAndUndefined, - bookmarked: NullAndUndefined, - hasDuplicateChapters: NullAndUndefined, - tracker: LibraryOptions['tracker'], - ignoreFilters: boolean, -): Manga[] => - mangas.filter((manga) => { - const ignoreFiltersWhileSearching = ignoreFilters && query?.length; + options: TMangaFilterOptions & { ignoreFilters: boolean }, +): Manga[] => { + const ignoreFiltersWhileSearching = options.ignoreFilters && query?.length; + + return mangas.filter((manga) => { const matchesSearch = querySearchManga(query, manga); - const matchesFilters = - ignoreFiltersWhileSearching || - (triStateFilterNumber(downloaded, manga.downloadCount) && - triStateFilterNumber(unread, manga.unreadCount) && - triStateFilterNumber(bookmarked, manga.bookmarkCount) && - triStateFilterBoolean(hasDuplicateChapters, manga.hasDuplicateChapters) && - trackerFilter(tracker, manga)); + const matchesFilters = ignoreFiltersWhileSearching || filterManga(manga, options); return matchesSearch && matchesFilters; }); +}; const sortByNumber = (a: number | string = 0, b: number | string = 0) => Number(a) - Number(b); @@ -167,7 +175,7 @@ const sortManga = ( return result; }; -export const useGetVisibleLibraryMangas = ( +export const useGetVisibleLibraryMangas = ( mangas: Manga[], ): { visibleMangas: Manga[]; @@ -180,16 +188,14 @@ export const useGetVisibleLibraryMangas = - filterManga( - mangas, - query, + filterMangas(mangas, query, { unread, downloaded, bookmarked, hasDuplicateChapters, tracker, - settings.ignoreFilters, - ), + ignoreFilters: settings.ignoreFilters, + }), [mangas, query, unread, downloaded, bookmarked, hasDuplicateChapters, tracker, settings.ignoreFilters], ); const sortedMangas = useMemo(