From 4175ffbc1e78a1cb926f93dd68f53871ac25951a Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 21 Apr 2025 18:04:03 +0200 Subject: [PATCH] Cleanup "SourceAll.tsx" --- .../global-search/screens/SearchAll.tsx | 58 +++++-------------- .../hooks/useGetVisibleLibraryMangas.ts | 5 +- 2 files changed, 18 insertions(+), 45 deletions(-) diff --git a/src/modules/global-search/screens/SearchAll.tsx b/src/modules/global-search/screens/SearchAll.tsx index db827a70..1679f7df 100644 --- a/src/modules/global-search/screens/SearchAll.tsx +++ b/src/modules/global-search/screens/SearchAll.tsx @@ -16,7 +16,7 @@ import { useTranslation } from 'react-i18next'; import Box from '@mui/material/Box'; import { requestManager } from '@/lib/requests/RequestManager.ts'; import { useLocalStorage } from '@/modules/core/hooks/useStorage.tsx'; -import { langSortCmp, sourceDefualtLangs } from '@/modules/core/utils/Languages.ts'; +import { sourceDefualtLangs } from '@/modules/core/utils/Languages.ts'; import { AppbarSearch } from '@/modules/core/components/AppbarSearch.tsx'; import { LangSelect } from '@/modules/core/components/inputs/LangSelect.tsx'; import { useDebounce } from '@/modules/core/hooks/useDebounce.ts'; @@ -32,36 +32,13 @@ import { AppRoutes } from '@/modules/core/AppRoute.constants.ts'; import { getErrorMessage } from '@/lib/HelperFunctions.ts'; import { useNavBarContext } from '@/modules/navigation-bar/contexts/NavbarContext.tsx'; import { Sources } from '@/modules/source/services/Sources.ts'; -import { SourceIdInfo } from '@/modules/source/Source.types.ts'; +import { SourceDisplayNameInfo, SourceIdInfo } from '@/modules/source/Source.types.ts'; type SourceLoadingState = { isLoading: boolean; hasResults: boolean; emptySearch: boolean }; type SourceToLoadingStateMap = Map; -function sourceToLangList(sources: Pick[]) { - const result: string[] = []; - - sources.forEach((source) => { - if (result.indexOf(source.lang) === -1) { - result.push(source.lang); - } - }); - - result.sort(langSortCmp); - return result; -} - -const compareSourceByName = ( - sourceA: Pick, - sourceB: Pick, -): -1 | 0 | 1 => { - if (sourceA.displayName < sourceB.displayName) { - return -1; - } - if (sourceA.displayName > sourceB.displayName) { - return 1; - } - return 0; -}; +const compareSourceByName = (sourceA: SourceDisplayNameInfo, sourceB: SourceDisplayNameInfo): number => + sourceA.displayName.localeCompare(sourceB.displayName); const compareSourcesBySearchResult = ( sourceA: SourceIdInfo, @@ -214,24 +191,23 @@ export const SearchAll: React.FC = () => { const { data, loading, error, refetch } = requestManager.useGetSourceList({ notifyOnNetworkStatusChange: true }); const sources = useMemo(() => data?.sources.nodes ?? [], [data?.sources.nodes]); + const filteredSources = useMemo( + () => Sources.filter(sources, { showNsfw, languages: shownLangs, keepLocalSource: true }), + [sources, shownLangs], + ); + const sourcesSortedByName = useMemo(() => [...filteredSources].toSorted(compareSourceByName), [filteredSources]); + const [sourceToLoadingStateMap, setSourceToLoadingStateMap] = useState(new Map()); const debouncedSourceToLoadingStateMap = useDebounce(sourceToLoadingStateMap, 500); - const sourcesSortedByName = useMemo(() => [...sources].sort(compareSourceByName), [sources]); - const sourcesFilteredByLang = useMemo( - () => sourcesSortedByName.filter((source) => shownLangs.includes(source.lang) || Sources.isLocalSource(source)), - [sourcesSortedByName, shownLangs], - ); - const sourcesFilteredByNsfw = useMemo( - () => sourcesFilteredByLang.filter((source) => showNsfw || !source.isNsfw), - [sourcesFilteredByLang, showNsfw], - ); + const sourceLanguages = useMemo(() => Sources.getLanguages(sources), [sources]); + const sourcesSortedByResult = useMemo( () => - [...sourcesFilteredByNsfw].sort((sourceA, sourceB) => + [...sourcesSortedByName].sort((sourceA, sourceB) => compareSourcesBySearchResult(sourceA, sourceB, debouncedSourceToLoadingStateMap), ), - [sourcesFilteredByNsfw, debouncedSourceToLoadingStateMap], + [sourcesSortedByName, debouncedSourceToLoadingStateMap], ); const updateSourceLoadingState = useCallback( @@ -250,11 +226,7 @@ export const SearchAll: React.FC = () => { setAction( <> - + , ); diff --git a/src/modules/library/hooks/useGetVisibleLibraryMangas.ts b/src/modules/library/hooks/useGetVisibleLibraryMangas.ts index 2f21ef06..99979ef1 100644 --- a/src/modules/library/hooks/useGetVisibleLibraryMangas.ts +++ b/src/modules/library/hooks/useGetVisibleLibraryMangas.ts @@ -9,13 +9,14 @@ import { StringParam, useQueryParam } from 'use-query-params'; import { useMemo } from 'react'; import { useMetadataServerSettings } from '@/modules/settings/services/ServerSettingsMetadata.ts'; -import { ChapterType, MangaType, SourceType, TrackRecordType } from '@/lib/graphql/generated/graphql.ts'; +import { ChapterType, MangaType, TrackRecordType } from '@/lib/graphql/generated/graphql.ts'; import { enhancedCleanup } from '@/util/Strings.ts'; import { useGetCategoryMetadata } from '@/modules/category/services/CategoryMetadata.ts'; import { NullAndUndefined } from '@/Base.types.ts'; import { LibraryOptions, LibrarySortMode } from '@/modules/library/Library.types.ts'; import { CategoryIdInfo, CategoryMetadataInfo } from '@/modules/category/Category.types.ts'; import { MangaChapterCountInfo, MangaIdInfo } from '@/modules/manga/Manga.types.ts'; +import { SourceDisplayNameInfo } from '@/modules/source/Source.types.ts'; const triStateFilter = ( triState: NullAndUndefined, @@ -62,7 +63,7 @@ const performSearch = ( }; type TMangaQueryFilter = Pick & { - source?: NullAndUndefined>; + source?: NullAndUndefined; }; const querySearchManga = ( query: NullAndUndefined,