Deduplicate adjustedFilters computation

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) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2026-05-20 22:42:49 +02:00
parent ffa59be219
commit 9e880b70fd
@@ -246,12 +246,16 @@ export const EntityListProvider = <EntityFilters extends DefaultEntityFilters>(
// 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 = <EntityFilters extends DefaultEntityFilters>(
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);