@@ -16,55 +16,151 @@ const reduceFilters = (query) => (prev, curr: string) => {
1616const useUiHelpers = ( ) => {
1717 const route = useRoute ( ) ;
1818 const router = useRouter ( ) ;
19- const { query } = route . value ;
19+ let { query } = route . value ;
2020
21- const getFiltersDataFromUrl = ( onlyFilters ) => Object . keys ( query )
22- . filter ( ( f ) => ( onlyFilters ? ! nonFilters . has ( f ) : nonFilters . has ( f ) ) )
23- // eslint-disable-next-line unicorn/prefer-object-from-entries
24- . reduce ( reduceFilters ( query ) , { } ) ;
21+ const resolveQuery = ( ) => {
22+ if ( typeof window !== 'undefined' ) {
23+ query = router . resolve ( ( window . location . pathname + window . location . search ) . slice ( 1 ) ) . route . query ;
24+ }
2525
26- const getFacetsFromURL = ( ) => ( {
27- filters : getFiltersDataFromUrl ( true ) ,
28- itemsPerPage : Number . parseInt ( query . itemsPerPage as string , 10 ) || 10 ,
29- page : Number . parseInt ( query . page as string , 10 ) || 1 ,
30- sort : query . sort as string || '' ,
31- term : query . term as string ,
32- } ) ;
26+ return query ;
27+ } ;
28+
29+ const getFiltersDataFromUrl = ( onlyFilters = false ) => {
30+ const currentQuery = resolveQuery ( ) ;
31+ return Object . keys ( currentQuery )
32+ . filter ( ( f ) => ( onlyFilters ? ! nonFilters . has ( f ) : f ) )
33+ // eslint-disable-next-line unicorn/prefer-object-from-entries
34+ . reduce ( reduceFilters ( currentQuery ) , { } ) ;
35+ } ;
36+
37+ const getFacetsFromURL = ( ) => {
38+ const currentQuery = resolveQuery ( ) ;
39+
40+ return {
41+ filters : getFiltersDataFromUrl ( true ) ,
42+ itemsPerPage : Number . parseInt ( currentQuery . itemsPerPage as string , 10 ) || 10 ,
43+ page : Number . parseInt ( currentQuery . page as string , 10 ) || 1 ,
44+ sort : currentQuery . sort as string || '' ,
45+ term : currentQuery . term as string ,
46+ } ;
47+ } ;
3348
3449 const changeSearchTerm = ( term : string ) => term ;
3550
36- const getSearchTermFromUrl = ( ) => ( {
37- page : Number . parseInt ( query . page as string , 10 ) || 1 ,
38- sort : query . sort || '' ,
39- filters : getFiltersDataFromUrl ( true ) ,
40- itemsPerPage : Number . parseInt ( query . itemsPerPage as string , 10 ) || 10 ,
41- term : query . term ,
42- } ) ;
51+ const getSearchTermFromUrl = ( ) => {
52+ const currentQuery = resolveQuery ( ) ;
53+
54+ return {
55+ page : Number . parseInt ( currentQuery . page as string , 10 ) || 1 ,
56+ sort : currentQuery . sort || '' ,
57+ filters : getFiltersDataFromUrl ( true ) ,
58+ itemsPerPage : Number . parseInt ( currentQuery . itemsPerPage as string , 10 ) || 10 ,
59+ term : currentQuery . term ,
60+ } ;
61+ } ;
4362
4463 const getCatLink = ( category : Category ) : string => `/c/${ category . url_path } ${ category . url_suffix || '' } ` ;
4564
4665 const getAgnosticCatLink = ( category : CategoryTreeInterface ) : string => `/c${ category . slug } ` ;
4766
48- const changeSorting = async ( sort : string ) => {
49- await router . push ( { query : { ...query , sort } } ) ;
67+ /**
68+ * Force push for a backward compatibility in other places, should be removed
69+ *
70+ * @param sort
71+ * @param forcePush
72+ */
73+ const changeSorting = async ( sort : string , forcePush = true ) => {
74+ if ( forcePush ) {
75+ await router . push ( { query : { ...query , sort } } ) ;
76+ } else {
77+ const routeData = router . resolve ( {
78+ query : {
79+ ...getFiltersDataFromUrl ( ) ,
80+ sort,
81+ } ,
82+ } ) ;
83+ window . history . pushState (
84+ { } ,
85+ null ,
86+ routeData . href ,
87+ ) ;
88+ }
5089 } ;
5190
52- const changeFilters = async ( filters : any ) => {
53- await router . push ( {
54- query : {
55- ...getFiltersDataFromUrl ( false ) ,
56- ...filters ,
57- } ,
58- } ) ;
91+ /**
92+ * Force push for a backward compatibility in other places, should be removed
93+ *
94+ * @param filters
95+ * @param forcePush
96+ */
97+ const changeFilters = async ( filters : any , forcePush = true ) => {
98+ if ( forcePush ) {
99+ await router . push ( {
100+ query : {
101+ ...getFiltersDataFromUrl ( false ) ,
102+ ...filters ,
103+ } ,
104+ } ) ;
105+ } else {
106+ const routeData = router . resolve ( {
107+ query : {
108+ ...getFiltersDataFromUrl ( ) ,
109+ ...filters ,
110+ } ,
111+ } ) ;
112+ window . history . pushState (
113+ { } ,
114+ null ,
115+ routeData . href ,
116+ ) ;
117+ }
59118 } ;
60119
61- const changeItemsPerPage = async ( itemsPerPage : number ) => {
62- await router . push ( {
63- query : {
64- ...getFiltersDataFromUrl ( false ) ,
65- itemsPerPage,
66- } ,
67- } ) ;
120+ const clearFilters = async ( forcePush = true ) => {
121+ if ( forcePush ) {
122+ await router . push ( {
123+ query : { } ,
124+ } ) ;
125+ } else {
126+ const routeData = router . resolve ( {
127+ query : { } ,
128+ } ) ;
129+ window . history . pushState (
130+ { } ,
131+ null ,
132+ routeData . href ,
133+ ) ;
134+ }
135+ } ;
136+
137+ /**
138+ * Force push for a backward compatibility in other places, should be removed
139+ *
140+ * @param itemsPerPage
141+ * @param forcePush
142+ */
143+ const changeItemsPerPage = async ( itemsPerPage : number , forcePush = true ) => {
144+ if ( forcePush ) {
145+ await router . push ( {
146+ query : {
147+ ...getFiltersDataFromUrl ( false ) ,
148+ itemsPerPage,
149+ } ,
150+ } ) ;
151+ } else {
152+ const routeData = router . resolve ( {
153+ query : {
154+ ...getFiltersDataFromUrl ( ) ,
155+ itemsPerPage,
156+ } ,
157+ } ) ;
158+ window . history . pushState (
159+ { } ,
160+ null ,
161+ routeData . href ,
162+ ) ;
163+ }
68164 } ;
69165
70166 const setTermForUrl = async ( term : string ) => {
@@ -87,6 +183,7 @@ const useUiHelpers = () => {
87183 changeSorting,
88184 changeFilters,
89185 changeItemsPerPage,
186+ clearFilters,
90187 setTermForUrl,
91188 isFacetColor,
92189 isFacetCheckbox,
0 commit comments