UNPKG

@matthew.ngo/react-filter-pilot

Version:

Powerful filtering, pagination, and sorting for React with TanStack Query integration

1 lines 29.5 kB
{"version":3,"sources":["../../src/hooks/useFilterPilotInfinite.ts"],"names":["useFilterPilotInfinite","options","filterConfigs","sortConfig","fetchConfig","providedUrlHandler","initialFiltersProvider","enablePresets","defaultUrlHandler","useDefaultUrlHandler","urlHandler","defaultFilters","useMemo","getDefaultFilters","defaultSort","filters","setFiltersState","useState","sort","setSortState","presets","setPresets","debouncedFilters","useRef","debounceTimers","urlSyncTrigger","setUrlSyncTrigger","useEffect","__name","urlParams","urlFilters","parseUrlParams","initialFilters","providedFilters","mergeFilters","finalFilters","sortField","sortDirection","params","filterParams","buildUrlParams","config","urlKey","value","key","c","queryKey","fetchData","useCallback","pageParam","transformedParams","transformedValue","transformFilterValue","query","useInfiniteQuery","lastPage","firstPage","data","page","setFilterValue","name","prev","setFilters","newFilters","resetFilters","resetFilter","defaultValue","setSort","field","direction","toggleSort","p","clearSort","hasActiveFilters","isFilterActive","getActiveFiltersCount","count","presetMethods","newPreset","preset","id","updatedPresets","savedPresets","totalRecords"],"mappings":"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","file":"useFilterPilotInfinite.cjs","sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react';\nimport { UseFilterPilotOptions, FetchParams, FetchResult, SortState, FilterPreset } from '../types';\nimport {\n getDefaultFilters,\n isFilterActive,\n parseUrlParams,\n buildUrlParams,\n transformFilterValue,\n mergeFilters,\n} from '../utils';\nimport { useDefaultUrlHandler } from './useUrlHandler';\n\ninterface InfiniteResult<TData> extends FetchResult<TData> {\n nextCursor?: string | number | null;\n previousCursor?: string | number | null;\n}\n\ninterface UseFilterPilotInfiniteOptions<TData, TFilters>\n extends Omit<UseFilterPilotOptions<TData, TFilters>, 'paginationConfig' | 'fetchConfig'> {\n fetchConfig: Omit<UseFilterPilotOptions<TData, TFilters>['fetchConfig'], 'fetchFn'> & {\n fetchFn: (\n params: FetchParams<TFilters> & { cursor?: string | number | null }\n ) => Promise<InfiniteResult<TData>>;\n getNextPageParam?: (\n lastPage: InfiniteResult<TData>,\n allPages: InfiniteResult<TData>[]\n ) => string | number | null | undefined;\n getPreviousPageParam?: (\n firstPage: InfiniteResult<TData>,\n allPages: InfiniteResult<TData>[]\n ) => string | number | null | undefined;\n initialPageParam?: string | number | null;\n maxPages?: number;\n };\n}\n\nexport interface UseFilterPilotInfiniteResult<TData, TFilters> {\n // Filter state\n filters: TFilters;\n setFilterValue: (name: keyof TFilters, value: any) => void;\n setFilters: (filters: Partial<TFilters>) => void;\n resetFilters: () => void;\n resetFilter: (name: keyof TFilters) => void;\n\n // Sort state\n sort?: SortState;\n setSort: (field: string, direction?: 'asc' | 'desc') => void;\n toggleSort: (field: string) => void;\n clearSort: () => void;\n\n // Data & Query state\n data: TData[]; // Flattened data from pages\n isLoading: boolean;\n isError: boolean;\n error?: Error;\n isFetching: boolean;\n isFetchingNextPage: boolean;\n isFetchingPreviousPage: boolean;\n hasNextPage: boolean;\n hasPreviousPage: boolean;\n fetchNextPage: () => void;\n fetchPreviousPage: () => void;\n refetch: () => void;\n totalRecords: number;\n pageParams: unknown[];\n\n // Utilities\n hasActiveFilters: () => boolean;\n getActiveFiltersCount: () => number;\n getQueryKey: () => unknown[];\n\n // Presets (if enabled)\n presets?: {\n savePreset: (name: string) => void;\n loadPreset: (preset: FilterPreset) => void;\n deletePreset: (id: string) => void;\n getPresets: () => FilterPreset[];\n };\n}\n\n/**\n * Hook for infinite scrolling with filters\n */\nexport function useFilterPilotInfinite<TData, TFilters = Record<string, any>>(\n options: UseFilterPilotInfiniteOptions<TData, TFilters>\n): UseFilterPilotInfiniteResult<TData, TFilters> {\n const {\n filterConfigs,\n sortConfig = {},\n fetchConfig,\n urlHandler: providedUrlHandler,\n initialFiltersProvider,\n enablePresets = false,\n } = options;\n\n // URL handler\n const defaultUrlHandler = useDefaultUrlHandler();\n const urlHandler = providedUrlHandler || defaultUrlHandler;\n\n // Default values\n const defaultFilters = useMemo(\n () => getDefaultFilters(filterConfigs) as TFilters,\n [filterConfigs]\n );\n\n const defaultSort: SortState | undefined = sortConfig.initialSortField\n ? {\n field: sortConfig.initialSortField,\n direction: sortConfig.initialSortDirection || 'asc',\n }\n : undefined;\n\n // State\n const [filters, setFiltersState] = useState<TFilters>(defaultFilters);\n const [sort, setSortState] = useState<SortState | undefined>(defaultSort);\n const [presets, setPresets] = useState<FilterPreset[]>([]);\n\n // Refs for debounced values\n const debouncedFilters = useRef<TFilters>(filters);\n const debounceTimers = useRef<Record<string, NodeJS.Timeout>>({});\n\n // Track URL sync trigger separately\n const [urlSyncTrigger, setUrlSyncTrigger] = useState(0);\n\n // Initialize from URL on mount\n useEffect(() => {\n const initializeFromUrl = async () => {\n const urlParams = urlHandler.getParams();\n const urlFilters = parseUrlParams(urlParams, filterConfigs);\n\n // Get initial filters from provider if available\n let initialFilters = defaultFilters;\n if (initialFiltersProvider) {\n try {\n const providedFilters = await initialFiltersProvider();\n // @ts-ignore\n initialFilters = mergeFilters(providedFilters, defaultFilters) as TFilters;\n } catch (error) {\n console.error('Error loading initial filters:', error);\n }\n }\n\n // Merge URL filters with initial filters\n // @ts-ignore\n const finalFilters = mergeFilters(urlFilters, initialFilters) as TFilters;\n setFiltersState(finalFilters);\n debouncedFilters.current = finalFilters; // Sync debouncedFilters immediately\n\n // Initialize sort from URL\n if (sortConfig.syncWithUrl !== false) {\n const sortField = urlParams.get('sortBy');\n const sortDirection = urlParams.get('sortOrder') as 'asc' | 'desc' | null;\n if (sortField) {\n setSortState({\n field: sortField,\n direction: sortDirection || 'asc',\n });\n }\n }\n // Mark as initialized, so the URL sync effect can run from the next change.\n // Important: setUrlSyncTrigger(1) would cause the URL sync effect to run immediately after initialization,\n // which might not be desired if you only want it to run on user interaction.\n // If you only want it to run when filters/sort change *after* initialization, this line is not needed.\n // Or, you might want more complex logic to decide when to sync for the first time.\n // To be consistent with useFilterPilot, we won't trigger here, but let the set... functions trigger.\n };\n\n initializeFromUrl();\n }, []); // Only run on mount\n\n // Sync to URL when state changes\n // Sync to URL when state changes\n useEffect(() => {\n // Skip on initial mount if urlSyncTrigger is still 0\n if (urlSyncTrigger === 0) {\n console.log('[useFilterPilotInfinite] Skipping initial URL sync (urlSyncTrigger === 0)');\n return;\n }\n console.log('[useFilterPilotInfinite] Performing URL sync, trigger:', urlSyncTrigger);\n\n const params = urlHandler.getParams();\n // @ts-ignore\n const filterParams = buildUrlParams(debouncedFilters.current, filterConfigs);\n\n // Clear existing filter params - CHỈ những filter sync với URL\n filterConfigs.forEach((config) => {\n if (config.syncWithUrl !== false) {\n const urlKey = config.urlKey || config.name;\n params.delete(urlKey);\n }\n });\n\n // Set new filter params - CHỈ những filter sync với URL\n filterParams.forEach((value, key) => {\n const config = filterConfigs.find((c) => c.urlKey === key || c.name === key);\n if (config?.syncWithUrl !== false) {\n params.set(key, value);\n }\n });\n\n // Add sort params\n if (sortConfig.syncWithUrl !== false && sort) {\n params.set('sortBy', sort.field);\n params.set('sortOrder', sort.direction);\n } else if (sortConfig.syncWithUrl !== false) {\n // Clear sort params if sort is cleared and sync is enabled\n params.delete('sortBy');\n params.delete('sortOrder');\n }\n\n urlHandler.setParams(params);\n }, [urlSyncTrigger, sort, filterConfigs, sortConfig.syncWithUrl, urlHandler]);\n\n // Query key\n const queryKey = useMemo(\n () => [\n fetchConfig.queryKey || 'filterPilotInfinite',\n 'filters',\n debouncedFilters.current, // Keep debouncedFilters.current here as the query should depend on the debounced value\n 'sort',\n sort,\n // urlSyncTrigger could be added here if you want the queryKey to change every time the URL is synced,\n // but usually, the queryKey should only depend on parameters that actually affect data fetching.\n // If debouncedFilters.current is updated correctly before urlSyncTrigger increments, it's not needed.\n ],\n [debouncedFilters.current, sort, fetchConfig.queryKey, urlSyncTrigger] // Add urlSyncTrigger to ensure queryKey updates\n );\n\n // Fetch function\n const fetchData = useCallback(\n async ({ pageParam }: { pageParam?: unknown }) => {\n const params: FetchParams<TFilters> & { cursor?: string | number | null } = {\n filters: debouncedFilters.current,\n pagination: {\n // Pagination is not really used for URL sync in infinite, but needed for API\n page: 1,\n pageSize: 20, // Default page size or from config if available\n },\n sort,\n cursor: pageParam as string | number | null,\n };\n\n // Transform filters for API\n const transformedParams = { ...params };\n transformedParams.filters = {} as TFilters;\n\n Object.entries(params.filters as Record<string, any>).forEach(([key, value]) => {\n const config = filterConfigs.find((c) => c.name === key);\n const transformedValue = transformFilterValue(value, config?.transformForApi);\n (transformedParams.filters as any)[key] = transformedValue;\n });\n console.log('[useFilterPilotInfinite] Fetching data with params:', transformedParams);\n return fetchConfig.fetchFn(transformedParams);\n },\n [sort, filterConfigs, fetchConfig.fetchFn, debouncedFilters.current] // Add debouncedFilters.current\n );\n\n // Infinite Query\n const query = useInfiniteQuery({\n queryKey,\n queryFn: fetchData,\n enabled: fetchConfig.enabled !== false,\n staleTime: fetchConfig.staleTime,\n gcTime: fetchConfig.gcTime || fetchConfig.cacheTime,\n refetchOnWindowFocus: fetchConfig.refetchOnWindowFocus,\n refetchInterval: fetchConfig.refetchInterval,\n refetchIntervalInBackground: fetchConfig.refetchIntervalInBackground,\n getNextPageParam: fetchConfig.getNextPageParam || ((lastPage) => lastPage.nextCursor),\n getPreviousPageParam:\n fetchConfig.getPreviousPageParam || ((firstPage) => firstPage.previousCursor),\n initialPageParam: fetchConfig.initialPageParam ?? null,\n maxPages: fetchConfig.maxPages,\n select: fetchConfig.select\n ? (data) => ({\n ...data,\n pages: data.pages.map((page) => fetchConfig.select!(page as InfiniteResult<TData>)), // Need to cast page type\n })\n : undefined,\n retry: fetchConfig.retry,\n retryDelay: fetchConfig.retryDelay,\n networkMode: fetchConfig.networkMode,\n meta: fetchConfig.meta,\n });\n\n // Handle success/error\n useEffect(() => {\n if (query.isSuccess && query.data) {\n // @ts-ignore\n fetchConfig.onSuccess?.(query.data.pages[query.data.pages.length - 1]);\n }\n }, [query.isSuccess, query.data, fetchConfig.onSuccess]);\n\n useEffect(() => {\n if (query.isError && query.error) {\n fetchConfig.onError?.(query.error);\n }\n }, [query.isError, query.error, fetchConfig.onError]);\n\n // Filter functions\n const setFilterValue = useCallback(\n (name: keyof TFilters, value: any) => {\n const config = filterConfigs.find((c) => c.name === String(name));\n\n setFiltersState((prev) => ({\n ...prev,\n [name]: value,\n }));\n\n if (config?.debounceMs) {\n if (debounceTimers.current[String(name)]) {\n clearTimeout(debounceTimers.current[String(name)]);\n }\n debounceTimers.current[String(name)] = setTimeout(() => {\n debouncedFilters.current = {\n ...debouncedFilters.current,\n [name]: value,\n };\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n }, config.debounceMs);\n } else {\n debouncedFilters.current = {\n ...debouncedFilters.current,\n [name]: value,\n };\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n }\n },\n [filterConfigs] // No need for urlSyncTrigger here\n );\n\n const setFilters = useCallback(\n (newFilters: Partial<TFilters>) => {\n setFiltersState((prev) => ({ ...prev, ...newFilters }));\n debouncedFilters.current = { ...debouncedFilters.current, ...newFilters };\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n },\n [] // No need for urlSyncTrigger here\n );\n\n const resetFilters = useCallback(() => {\n setFiltersState(defaultFilters);\n debouncedFilters.current = defaultFilters;\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n }, [defaultFilters]);\n\n const resetFilter = useCallback(\n (name: keyof TFilters) => {\n const defaultValue = (defaultFilters as any)[name];\n // setFilterValue will automatically trigger URL sync\n setFilterValue(name, defaultValue);\n },\n [defaultFilters, setFilterValue]\n );\n\n // Sort functions\n const setSort = useCallback((field: string, direction: 'asc' | 'desc' = 'asc') => {\n setSortState({ field, direction });\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n }, []);\n\n const toggleSort = useCallback((field: string) => {\n setSortState((prev) => {\n if (!prev || prev.field !== field) {\n setUrlSyncTrigger((p) => p + 1); // Trigger URL sync\n return { field, direction: 'asc' };\n }\n if (prev.direction === 'asc') {\n setUrlSyncTrigger((p) => p + 1); // Trigger URL sync\n return { field, direction: 'desc' };\n }\n setUrlSyncTrigger((p) => p + 1); // Trigger URL sync (when clearing sort)\n return undefined;\n });\n }, []);\n\n const clearSort = useCallback(() => {\n setSortState(undefined);\n setUrlSyncTrigger((prev) => prev + 1); // Trigger URL sync\n }, []);\n\n // Utilities\n const hasActiveFilters = useCallback(() => {\n // @ts-ignore\n return Object.entries(filters).some(([key, value]) => {\n const config = filterConfigs.find((c) => c.name === key);\n return isFilterActive(value, config?.defaultValue);\n });\n }, [filters, filterConfigs]);\n\n const getActiveFiltersCount = useCallback(() => {\n // @ts-ignore\n return Object.entries(filters).reduce((count, [key, value]) => {\n const config = filterConfigs.find((c) => c.name === key);\n return isFilterActive(value, config?.defaultValue) ? count + 1 : count;\n }, 0);\n }, [filters, filterConfigs]);\n\n // Preset management\n const presetMethods = useMemo(() => {\n if (!enablePresets) return undefined;\n\n return {\n savePreset: (name: string) => {\n const newPreset: FilterPreset = {\n id: Date.now().toString(),\n name,\n filters: filters as Record<string, any>, // current filters, not debounced\n createdAt: new Date(),\n };\n setPresets((prev) => [...prev, newPreset]);\n try {\n const key = `filterPilot_presets_${fetchConfig.queryKey || 'defaultInfinite'}`;\n localStorage.setItem(key, JSON.stringify([...presets, newPreset]));\n } catch (error) {\n console.error('Error saving preset:', error);\n }\n },\n loadPreset: (preset: FilterPreset) => {\n // setFilters will automatically trigger URL sync\n setFilters(preset.filters as Partial<TFilters>);\n },\n deletePreset: (id: string) => {\n const updatedPresets = presets.filter((p) => p.id !== id);\n setPresets(updatedPresets);\n try {\n const key = `filterPilot_presets_${fetchConfig.queryKey || 'defaultInfinite'}`;\n localStorage.setItem(key, JSON.stringify(updatedPresets));\n } catch (error) {\n console.error('Error deleting preset:', error);\n }\n },\n getPresets: () => presets,\n };\n }, [enablePresets, filters, presets, setFilters, fetchConfig.queryKey]); // `setFilters` is a dependency\n\n // Load presets from localStorage on mount\n useEffect(() => {\n if (enablePresets) {\n try {\n const key = `filterPilot_presets_${fetchConfig.queryKey || 'defaultInfinite'}`;\n const savedPresets = localStorage.getItem(key);\n if (savedPresets) {\n setPresets(JSON.parse(savedPresets));\n }\n } catch (error) {\n console.error('Error loading presets:', error);\n }\n }\n }, [enablePresets, fetchConfig.queryKey]);\n\n // Flatten data from pages\n const data = useMemo(() => {\n return query.data?.pages.flatMap((page) => page.data) || [];\n }, [query.data]);\n\n const totalRecords = useMemo(() => {\n const lastPage = query.data?.pages[query.data.pages.length - 1];\n return lastPage?.totalRecords || 0;\n }, [query.data]);\n\n return {\n filters,\n setFilterValue,\n setFilters,\n resetFilters,\n resetFilter,\n sort,\n setSort,\n toggleSort,\n clearSort,\n data,\n isLoading: query.isLoading,\n isError: query.isError,\n // @ts-ignore\n error: query.error,\n isFetching: query.isFetching,\n isFetchingNextPage: query.isFetchingNextPage,\n isFetchingPreviousPage: query.isFetchingPreviousPage,\n hasNextPage: query.hasNextPage ?? false,\n hasPreviousPage: query.hasPreviousPage ?? false,\n fetchNextPage: query.fetchNextPage,\n fetchPreviousPage: query.fetchPreviousPage,\n refetch: query.refetch,\n totalRecords,\n pageParams: query.data?.pageParams || [],\n hasActiveFilters,\n getActiveFiltersCount,\n getQueryKey: () => queryKey,\n presets: presetMethods,\n };\n}\n"]}