From d8c6a90c558880c9f7ee8973902d7c643e48d221 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Thu, 23 Apr 2026 16:38:02 +0700 Subject: [PATCH] feat: add excludeKeysFromUrl to useTableFilter parameters --- src/services/hooks/useTableFilter.tsx | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/services/hooks/useTableFilter.tsx b/src/services/hooks/useTableFilter.tsx index 43fc173c..5db57bcb 100644 --- a/src/services/hooks/useTableFilter.tsx +++ b/src/services/hooks/useTableFilter.tsx @@ -31,6 +31,8 @@ export type UseTableFilterOptions> = { paramMap?: Partial, string>>; /** If true, `toSearchParams`/`toQueryString` will omit values equal to defaults */ omitDefaultsInUrl?: boolean; + /** Optional list of state keys that should never be serialized into the URL/query string */ + excludeKeysFromUrl?: Partial<(keyof TableFilterState)[]>; persist?: boolean; storeName?: string; @@ -218,9 +220,12 @@ export function useTableFilter>( ); const extras = useMemo(() => { - const { page, pageSize, ...rest } = state as TableFilterState< - Record - >; + const stateWithExtras = state as TableFilterState>; + const rest = Object.fromEntries( + Object.entries(stateWithExtras).filter( + ([key]) => key !== 'page' && key !== 'pageSize' + ) + ); return rest as TExtra; }, [state]); @@ -240,8 +245,13 @@ export function useTableFilter>( const baseline = options?.omitDefaultsInUrl ? (defaults as Record) : null; + const excludedKeys = new Set( + (options?.excludeKeysFromUrl as string[] | undefined) ?? [] + ); for (const key of Object.keys(source)) { + if (excludedKeys.has(key)) continue; + const value = source[key]; if (value === undefined || value === null) continue; @@ -260,7 +270,13 @@ export function useTableFilter>( if (serialized !== null) params.set(mapped, serialized); } return params; - }, [state, defaults, options?.omitDefaultsInUrl, mapKey]); + }, [ + state, + defaults, + options?.omitDefaultsInUrl, + options?.excludeKeysFromUrl, + mapKey, + ]); /** Build query string (prefixed with '?', or empty string if none) */ const toQueryString = useCallback(() => {