11import { useCallback , useMemo , useEffect } from 'react' ;
22
3- export const useInitialiseFilters = ( filterOptions , searchParams , selectedFilters = { } , setSearchParams ) => {
3+ export const useInitialiseFilters = ( filterOptions , searchParams , selectedFilters = { } , setSearchParams , setSelectedFilters ) => {
44 const { filters, urlHadParams } = useMemo ( ( ) => {
55 const f = { } ;
66 let any = false ;
@@ -24,6 +24,31 @@ export const useInitialiseFilters = (filterOptions, searchParams, selectedFilter
2424 }
2525 } , [ urlHadParams , selectedFilters , setSearchParams ] ) ;
2626
27+ const areFiltersEqual = ( a = { } , b = { } ) => {
28+ const aKeys = Object . keys ( a ) ;
29+ const bKeys = Object . keys ( b ) ;
30+ if ( aKeys . length !== bKeys . length ) return false ;
31+ for ( const k of aKeys ) {
32+ const aVals = a [ k ] || [ ] ;
33+ const bVals = b [ k ] || [ ] ;
34+ if ( aVals . length !== bVals . length ) return false ;
35+ for ( let i = 0 ; i < aVals . length ; i ++ ) {
36+ if ( aVals [ i ] !== bVals [ i ] ) return false ;
37+ }
38+ }
39+ return true ;
40+ } ;
41+
42+ // if the URL contained filter params on first load, push them into selected state
43+ useEffect ( ( ) => {
44+ if ( urlHadParams ) {
45+ // only set if different to avoid update loops
46+ if ( ! areFiltersEqual ( selectedFilters , filters ) ) {
47+ setSelectedFilters ( filters ) ;
48+ }
49+ }
50+ } , [ urlHadParams , filters , selectedFilters , setSelectedFilters ] ) ;
51+
2752 return filters ;
2853} ;
2954
0 commit comments