Cleanup library filter logic
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user