From d01837d5cde9962629179f9902f6276bef3a2406 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Mon, 21 Apr 2025 01:48:25 +0200 Subject: [PATCH] Move filtering to "groupExtensionsByLanguage" --- src/modules/extension/Extensions.utils.ts | 18 ++++++++++-- src/modules/extension/screens/Extensions.tsx | 31 ++++++-------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/modules/extension/Extensions.utils.ts b/src/modules/extension/Extensions.utils.ts index 065f9493..31d97298 100644 --- a/src/modules/extension/Extensions.utils.ts +++ b/src/modules/extension/Extensions.utils.ts @@ -17,6 +17,7 @@ import { } from '@/modules/extension/Extensions.types.ts'; import { DefaultLanguage, langCodeToName, langSortCmp } from '@/modules/core/utils/Languages.ts'; import { extensionLanguageToTranslationKey } from '@/modules/extension/Extensions.constants.ts'; +import { enhancedCleanup } from '@/util/Strings.ts'; export const getInstalledState = ( isInstalled: boolean, @@ -81,11 +82,24 @@ export function groupExtensionsByLanguage(extensions: TExtension[]): GroupedExte return langSortCmp(a, b); }); - return extensionsBySortedLanguage.map(([language, extensionsOfLanguage]) => [ + const groupedExtensionsSortedByLanguage = extensionsBySortedLanguage.map(([language, extensionsOfLanguage]) => [ language, (extensionsOfLanguage ?? []).toSorted((a, b) => langSortCmp(a.lang, b.lang)), - ]); + ]) satisfies GroupedExtensionsResult; + + return groupedExtensionsSortedByLanguage.filter(([, extensionsOfLanguage]) => !!extensionsOfLanguage.length); } export const getLanguagesFromExtensions = (extensions: TExtension[]): string[] => [...new Set(extensions.map((extension) => extension.lang))].toSorted(langSortCmp); + +export const filterExtensions = ( + extensions: TExtension[], + selectedLanguages: string[], + showNsfw: boolean, + query: string | null | undefined, +): TExtension[] => + extensions + .filter((extension) => selectedLanguages.includes(extension.lang)) + .filter((extension) => showNsfw || !extension.isNsfw) + .filter((extension) => !query || enhancedCleanup(extension.name).includes(enhancedCleanup(query))); diff --git a/src/modules/extension/screens/Extensions.tsx b/src/modules/extension/screens/Extensions.tsx index 9c35e86e..a963d90a 100644 --- a/src/modules/extension/screens/Extensions.tsx +++ b/src/modules/extension/screens/Extensions.tsx @@ -35,7 +35,7 @@ import { groupExtensionsByLanguage, getLanguagesFromExtensions, translateExtensionLanguage, - isExtensionState, + filterExtensions, } from '@/modules/extension/Extensions.utils.ts'; import { ExtensionAction, @@ -98,37 +98,24 @@ export function Extensions({ tabsMenuHeight }: { tabsMenuHeight: number }) { const allLangs = useMemo(() => getLanguagesFromExtensions(allExtensions ?? []), [allExtensions]); const filteredExtensions = useMemo( - () => - (allExtensions ?? []).filter((ext) => { - const nsfwFilter = showNsfw || !ext.isNsfw; - if (!query) return nsfwFilter; - return nsfwFilter && ext.name.toLowerCase().includes(query.toLowerCase()); - }), - [allExtensions, showNsfw, query], + () => filterExtensions(allExtensions ?? [], shownLangs, showNsfw, query), + [allExtensions, shownLangs, shownLangs, query], ); const groupedExtensions = useMemo(() => groupExtensionsByLanguage(filteredExtensions), [filteredExtensions]); - const filteredGroupedExtensions = useMemo( - () => - groupedExtensions - .filter((group) => group[EXTENSIONS].length > 0) - .filter((group) => isExtensionState(group[LANGUAGE]) || shownLangs.includes(group[LANGUAGE])), - [shownLangs, groupedExtensions], - ); - const groupCounts = useMemo( - () => filteredGroupedExtensions.map((extensionGroup) => extensionGroup[EXTENSIONS].length), - [filteredGroupedExtensions], + () => groupedExtensions.map((extensionGroup) => extensionGroup[EXTENSIONS].length), + [groupedExtensions], ); const visibleExtensions = useMemo( - () => filteredGroupedExtensions.map(([, extensions]) => extensions).flat(1), - [filteredGroupedExtensions], + () => groupedExtensions.map(([, extensions]) => extensions).flat(1), + [groupedExtensions], ); const computeItemKey = VirtuosoUtil.useCreateGroupedComputeItemKey( groupCounts, - useCallback((index) => filteredGroupedExtensions[index][LANGUAGE], [filteredGroupedExtensions]), + useCallback((index) => groupedExtensions[index][LANGUAGE], [groupedExtensions]), useCallback((index) => visibleExtensions[index].pkgName, [visibleExtensions]), ); @@ -262,7 +249,7 @@ export function Extensions({ tabsMenuHeight }: { tabsMenuHeight: number }) { overscan={window.innerHeight * 0.5} groupCounts={groupCounts} groupContent={(index) => { - const [groupName, groupExtensions] = filteredGroupedExtensions[index]; + const [groupName, groupExtensions] = groupedExtensions[index]; const isUpdateGroup = groupName === ExtensionGroupState.UPDATE_PENDING; return (