From 9e880b70fd2d9a316497b68b341ca76b0f0a1e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 20 May 2026 22:42:49 +0200 Subject: [PATCH] Deduplicate adjustedFilters computation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the adjustedFilters useMemo above refresh and reuse it in both the fetch callback and the frontend filtering memo. Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Fredrik Adelöw --- .../src/hooks/useEntityListProvider.tsx | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx index 66043ad237..ced298b17d 100644 --- a/plugins/catalog-react/src/hooks/useEntityListProvider.tsx +++ b/plugins/catalog-react/src/hooks/useEntityListProvider.tsx @@ -246,12 +246,16 @@ export const EntityListProvider = ( // so out-of-order responses from overlapping requests are discarded. const fetchGenRef = useRef(0); - const refresh = useCallback(async () => { + // Adjusted filters remove the owners filter for user/group kinds, + // since ownership is not meaningful for those entity types. + const adjustedFilters = useMemo(() => { const kindValue = requestedFilters.kind?.value?.toLocaleLowerCase('en-US'); - const adjustedFilters = - kindValue === 'user' || kindValue === 'group' - ? { ...requestedFilters, owners: undefined } - : requestedFilters; + return kindValue === 'user' || kindValue === 'group' + ? { ...requestedFilters, owners: undefined } + : requestedFilters; + }, [requestedFilters]); + + const refresh = useCallback(async () => { const compacted = compact(Object.values(adjustedFilters)); let fetchParams: unknown; @@ -333,21 +337,14 @@ export const EntityListProvider = ( setLoading(false); } } - }, [catalogApi, requestedFilters, cursor, paginationMode, limit, offset]); + }, [catalogApi, adjustedFilters, cursor, paginationMode, limit, offset]); // Slight debounce on the refresh, since (especially on page load) // several filters will be calling updateFilters in rapid succession. - useDebounce(refresh, 10, [requestedFilters, cursor, limit, offset]); + useDebounce(refresh, 10, [adjustedFilters, cursor, limit, offset]); // Frontend filtering — synchronous, no debounce needed. Updates // instantly when requestedFilters or backendEntities change. - const adjustedFilters = useMemo(() => { - const kindValue = requestedFilters.kind?.value?.toLocaleLowerCase('en-US'); - return kindValue === 'user' || kindValue === 'group' - ? { ...requestedFilters, owners: undefined } - : requestedFilters; - }, [requestedFilters]); - const entities = useMemo(() => { const compacted = compact(Object.values(adjustedFilters)); const entityFilter = reduceEntityFilters(compacted);