@@ -11,19 +11,24 @@ import { dataTableRouterParsers } from '../../remix-hook-form/data-table-router-
1111 *
1212 * @returns A tuple containing the current filter state and a function to update it
1313 */
14- export function useFilterSync ( ) : [ BazzaFiltersState , ( newFilters : BazzaFiltersState ) => void ] {
14+ export function useFilterSync ( ) : [ BazzaFiltersState , ( newFilters : BazzaFiltersState | ( ( prev : BazzaFiltersState ) => BazzaFiltersState ) ) => void ] {
1515 const [ searchParams , setSearchParams ] = useSearchParams ( ) ;
1616
1717 // Parse filters from URL
1818 const filtersFromUrl = dataTableRouterParsers . filters . parse ( searchParams . get ( 'filters' ) ) ;
1919
2020 // Function to update filters in URL
21- const setFilters = useCallback ( ( newFilters : BazzaFiltersState ) => {
21+ const setFilters = useCallback ( ( newFilters : BazzaFiltersState | ( ( prev : BazzaFiltersState ) => BazzaFiltersState ) ) => {
22+ // Handle functional updates by resolving the function with current filters
23+ const resolvedFilters = typeof newFilters === 'function'
24+ ? newFilters ( filtersFromUrl )
25+ : newFilters ;
26+
2227 const newParams = new URLSearchParams ( searchParams ) ;
2328
2429 // Update or remove the filters parameter
25- if ( newFilters . length > 0 ) {
26- const serialized = dataTableRouterParsers . filters . serialize ( newFilters ) ;
30+ if ( resolvedFilters . length > 0 ) {
31+ const serialized = dataTableRouterParsers . filters . serialize ( resolvedFilters ) ;
2732 if ( serialized !== null ) {
2833 newParams . set ( 'filters' , serialized ) ;
2934 }
@@ -33,8 +38,7 @@ export function useFilterSync(): [BazzaFiltersState, (newFilters: BazzaFiltersSt
3338
3439 // Update the URL with the new search parameters
3540 setSearchParams ( newParams , { replace : true } ) ;
36- } , [ searchParams , setSearchParams ] ) ;
41+ } , [ searchParams , setSearchParams , filtersFromUrl ] ) ;
3742
3843 return [ filtersFromUrl , setFilters ] ;
3944}
40-
0 commit comments