diff --git a/src/components/library/useGetVisibleLibraryMangas.ts b/src/components/library/useGetVisibleLibraryMangas.ts index edb34d1e..3bdd3a67 100644 --- a/src/components/library/useGetVisibleLibraryMangas.ts +++ b/src/components/library/useGetVisibleLibraryMangas.ts @@ -13,7 +13,7 @@ import { useLibraryOptionsContext } from '@/components/context/LibraryOptionsCon import { useMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts'; import { ChapterType, MangaType, SourceType, TrackRecordType } from '@/lib/graphql/generated/graphql.ts'; import { MangaIdInfo } from '@/lib/data/Mangas.ts'; -import { baseCleanup, enhancedCleanup } from '@/lib/data/Strings.ts'; +import { enhancedCleanup } from '@/lib/data/Strings.ts'; const triStateFilter = ( triState: NullAndUndefined, @@ -44,65 +44,37 @@ const triStateFilterBoolean = (triState: NullAndUndefined, status?: boo () => !status, ); -type TMangaQueryFilter = Pick; -const queryFilter = (query: NullAndUndefined, { title }: TMangaQueryFilter): boolean => { - if (!query) return true; +const performSearch = ( + queries: NullAndUndefined[] | undefined, + strings: NullAndUndefined[], +): boolean => { + const actualQueries = queries?.filter((query) => query != null); + const actualStrings = strings?.filter((str) => str != null); - const cleanedUpQuery = baseCleanup(query); + if (!actualQueries?.length) return true; - return baseCleanup(title).includes(cleanedUpQuery) || enhancedCleanup(title).includes(cleanedUpQuery); + const cleanedUpQueries = actualQueries.map(enhancedCleanup); + const cleanedUpStrings = actualStrings.map(enhancedCleanup).join(', '); + + return cleanedUpQueries.every((query) => cleanedUpStrings.includes(query)); }; -type TMangaQueryGenreFilter = Pick; -const queryGenreFilter = (query: NullAndUndefined, { genre: mangaGenres }: TMangaQueryGenreFilter): boolean => { - if (!query) return true; - - const genreQueries = query.split(',').map(baseCleanup); - const genres = mangaGenres - .map((genre) => { - const baseCleanedUpGenre = baseCleanup(genre); - const fullyCleanedUpGenre = enhancedCleanup(baseCleanedUpGenre); - - return `${baseCleanedUpGenre}, ${fullyCleanedUpGenre}`; - }) - .join(', '); - - return genreQueries.every((genreQuery) => genres.includes(genreQuery)); -}; - -type TMangaDescriptionFilter = Pick; -const queryDescriptionFilter = (query: NullAndUndefined, { description }: TMangaDescriptionFilter): boolean => { - if (!query) return true; - if (!description) return false; - - const cleanedUpQuery = baseCleanup(query); - - return baseCleanup(description).includes(cleanedUpQuery) || enhancedCleanup(description).includes(cleanedUpQuery); -}; - -type TMangaArtistFilter = Pick; -const queryArtistFilter = (query: NullAndUndefined, { artist }: TMangaArtistFilter): boolean => { - if (!query) return true; - if (!artist) return false; - - return enhancedCleanup(artist).includes(enhancedCleanup(query)); -}; - -type TMangaAuthorFilter = Pick; -const queryAuthorFilter = (query: NullAndUndefined, { author }: TMangaAuthorFilter): boolean => { - if (!query) return true; - if (!author) return false; - - return enhancedCleanup(author).includes(enhancedCleanup(query)); -}; - -type TMangaSourceFilter = { source?: NullAndUndefined> }; -const querySourceFilter = (query: NullAndUndefined, { source }: TMangaSourceFilter): boolean => { - if (!query) return true; - if (!source) return false; - - return enhancedCleanup(source.displayName).includes(enhancedCleanup(query)); +type TMangaQueryFilter = Pick & { + source?: NullAndUndefined>; }; +const querySearchManga = ( + query: NullAndUndefined, + { title, genre: genres, description, artist, author, source }: TMangaQueryFilter, +): boolean => + performSearch([query], [title]) || + performSearch( + query?.split(','), + genres.map((genre) => enhancedCleanup(genre)), + ) || + performSearch([query], [description]) || + performSearch([query], [artist]) || + performSearch([query], [author]) || + performSearch([query], [source?.displayName]); type TMangaTrackerFilter = { trackRecords: { nodes: Pick[] } }; const trackerFilter = (trackFilters: LibraryOptions['tracker'], manga: TMangaTrackerFilter): boolean => @@ -121,12 +93,7 @@ const trackerFilter = (trackFilters: LibraryOptions['tracker'], manga: TMangaTra .every((matchesFilter) => matchesFilter); type TMangaFilter = TMangaQueryFilter & - TMangaQueryGenreFilter & TMangaTrackerFilter & - TMangaDescriptionFilter & - TMangaArtistFilter & - TMangaAuthorFilter & - TMangaSourceFilter & Pick; const filterManga = ( mangas: Manga[], @@ -140,13 +107,7 @@ const filterManga = ( ): Manga[] => mangas.filter((manga) => { const ignoreFiltersWhileSearching = ignoreFilters && query?.length; - const matchesSearch = - queryFilter(query, manga) || - queryGenreFilter(query, manga) || - queryDescriptionFilter(query, manga) || - queryArtistFilter(query, manga) || - queryAuthorFilter(query, manga) || - querySourceFilter(query, manga); + const matchesSearch = querySearchManga(query, manga); const matchesFilters = ignoreFiltersWhileSearching || (triStateFilterNumber(downloaded, manga.downloadCount) &&