1414 * limitations under the License.
1515 */
1616
17- import { useMemo } from 'react'
17+ import { useEffect , useMemo } from 'react'
1818import { useHistory , useLocation } from 'react-router-dom'
1919import { DEFAULT_BASE_PAGE_SIZE , EXCLUDED_FALSY_VALUES , SortingOrder } from '../../Constants'
2020import { DEFAULT_PAGE_NUMBER , URL_FILTER_KEYS } from './constants'
2121import { UseUrlFiltersProps , UseUrlFiltersReturnType } from './types'
22+ import { setItemInLocalStorageIfKeyExists } from './utils'
2223
2324const { PAGE_SIZE , PAGE_NUMBER , SEARCH_KEY , SORT_BY , SORT_ORDER } = URL_FILTER_KEYS
2425
@@ -42,11 +43,20 @@ const { PAGE_SIZE, PAGE_NUMBER, SEARCH_KEY, SORT_BY, SORT_ORDER } = URL_FILTER_K
4243const useUrlFilters = < T = string , K = unknown > ( {
4344 initialSortKey,
4445 parseSearchParams,
46+ localStorageKey,
4547} : UseUrlFiltersProps < T , K > = { } ) : UseUrlFiltersReturnType < T , K > => {
4648 const location = useLocation ( )
4749 const history = useHistory ( )
4850 const searchParams = new URLSearchParams ( location . search )
4951
52+ const getParsedSearchParams : UseUrlFiltersProps < T , K > [ 'parseSearchParams' ] = ( searchParamsToParse ) => {
53+ if ( parseSearchParams ) {
54+ return parseSearchParams ( searchParamsToParse )
55+ }
56+
57+ return { } as K
58+ }
59+
5060 const { pageSize, pageNumber, searchKey, sortBy, sortOrder, parsedParams } = useMemo ( ( ) => {
5161 const _pageSize = searchParams . get ( PAGE_SIZE )
5262 const _pageNumber = searchParams . get ( PAGE_NUMBER )
@@ -58,7 +68,7 @@ const useUrlFilters = <T = string, K = unknown>({
5868 // Fallback to ascending order
5969 const sortByOrder = Object . values ( SortingOrder ) . includes ( _sortOrder ) ? _sortOrder : SortingOrder . ASC
6070
61- const _parsedParams = parseSearchParams ? parseSearchParams ( searchParams ) : ( { } as K )
71+ const _parsedParams = getParsedSearchParams ( searchParams )
6272
6373 return {
6474 pageSize : Number ( _pageSize ) || DEFAULT_BASE_PAGE_SIZE ,
@@ -126,6 +136,7 @@ const useUrlFilters = <T = string, K = unknown>({
126136
127137 const clearFilters = ( ) => {
128138 history . replace ( { search : '' } )
139+ setItemInLocalStorageIfKeyExists ( localStorageKey , '' )
129140 }
130141
131142 const updateSearchParams = ( paramsToSerialize : Partial < K > ) => {
@@ -143,10 +154,24 @@ const useUrlFilters = <T = string, K = unknown>({
143154 searchParams . delete ( key )
144155 }
145156 } )
157+ // Skipping primary params => pageSize, pageNumber, searchKey, sortBy, sortOrder
158+ setItemInLocalStorageIfKeyExists ( localStorageKey , JSON . stringify ( getParsedSearchParams ( searchParams ) ) )
146159 // Not replacing the params as it is being done by _resetPageNumber
147160 _resetPageNumber ( )
148161 }
149162
163+ useEffect ( ( ) => {
164+ // if we have search string, set secondary params in local storage accordingly
165+ if ( location . search ) {
166+ localStorage . setItem ( localStorageKey , JSON . stringify ( parsedParams ) )
167+ return
168+ }
169+ const localStorageValue = localStorage . getItem ( localStorageKey )
170+ if ( localStorageValue ) {
171+ updateSearchParams ( JSON . parse ( localStorageValue ) )
172+ }
173+ } , [ ] )
174+
150175 return {
151176 pageSize,
152177 changePage,
0 commit comments