@@ -23,62 +23,54 @@ export const useDataViewPagination = ({
2323 setSearchParams,
2424} : UseDataViewPaginationProps ) => {
2525 const [ state , setState ] = useState ( {
26- page : searchParams ?. get ( 'page' ) !== null
27- ? parseInt ( searchParams ?. get ( 'page' ) || `${ page } ` )
28- : page ,
29- perPage : searchParams ?. get ( 'perPage' ) !== null
30- ? parseInt ( searchParams ?. get ( 'perPage' ) || `${ perPage } ` )
31- : perPage ,
26+ page : parseInt ( searchParams ?. get ( 'page' ) || `${ page } ` ) ,
27+ perPage : parseInt ( searchParams ?. get ( 'perPage' ) || `${ perPage } ` ) ,
3228 } ) ;
3329
34- useEffect ( ( ) => {
30+ const updateSearchParams = ( page : number , perPage : number ) => {
3531 if ( searchParams && setSearchParams ) {
3632 const params = new URLSearchParams ( searchParams ) ;
37- let updated = false ;
38-
39- if ( ! params . has ( 'page' ) ) {
40- params . set ( 'page' , `${ page } ` ) ;
41- updated = true ;
42- }
33+ params . set ( 'page' , `${ page } ` ) ;
34+ params . set ( 'perPage' , `${ perPage } ` ) ;
35+ setSearchParams ( params ) ;
36+ }
37+ } ;
4338
44- if ( ! params . has ( 'perPage' ) ) {
45- params . set ( 'perPage' , `${ perPage } ` ) ;
46- updated = true ;
47- }
39+ useEffect ( ( ) => {
40+ // make sure search params are loaded or set if not present on mount
41+ updateSearchParams ( state . page , state . perPage ) ;
42+ // eslint-disable-next-line react-hooks/exhaustive-deps
43+ } , [ ] ) ;
4844
49- updated && setSearchParams ( params ) ;
45+ useEffect ( ( ) => {
46+ // listen on URL params changes
47+ const currentPage = parseInt ( searchParams ?. get ( 'page' ) || `${ state . page } ` ) ;
48+ const currentPerPage = parseInt ( searchParams ?. get ( 'perPage' ) || `${ state . perPage } ` ) ;
49+ if ( currentPage !== state . page || currentPerPage !== state . perPage ) {
50+ setState ( { page : currentPage , perPage : currentPerPage } ) ;
5051 }
5152 // eslint-disable-next-line react-hooks/exhaustive-deps
52- } , [ ] ) ;
53+ } , [ searchParams ] ) ;
5354
5455 const onPerPageSelect = (
5556 _event : React . MouseEvent | React . KeyboardEvent | MouseEvent | undefined ,
5657 newPerPage : number
5758 ) => {
58- if ( searchParams && setSearchParams ) {
59- const params = new URLSearchParams ( searchParams ) ;
60- params . set ( 'perPage' , newPerPage . toString ( ) ) ;
61- params . set ( 'page' , '1' ) ;
62- setSearchParams ( params ) ;
63- }
59+ updateSearchParams ( 1 , newPerPage ) ;
6460 setState ( { perPage : newPerPage , page : 1 } ) ;
6561 } ;
6662
6763 const onSetPage = (
6864 _event : React . MouseEvent | React . KeyboardEvent | MouseEvent | undefined ,
6965 newPage : number
7066 ) => {
71- if ( searchParams && setSearchParams ) {
72- const params = new URLSearchParams ( searchParams ) ;
73- params . set ( 'page' , newPage . toString ( ) ) ;
74- setSearchParams ( params ) ;
75- }
67+ updateSearchParams ( newPage , state . perPage ) ;
7668 setState ( prev => ( { ...prev , page : newPage } ) ) ;
7769 } ;
7870
7971 return {
8072 ...state ,
8173 onPerPageSelect,
82- onSetPage
74+ onSetPage,
8375 } ;
8476} ;
0 commit comments