@@ -27,32 +27,71 @@ const OpportunityList = forwardRef(function OpportunityList(props, ref) {
2727 ...other
2828 } = props ;
2929
30- const [ page , setPage ] = useState ( p ?. page ) ;
31- const [ params , setParams ] = useState ( {
32- type : itemsType ,
33- limit : itemsPerPage ,
34- } ) ;
35- const listRef = useRef ( null ) ;
3630 const router = useRouter ( ) ;
3731 const { query } = router ;
38- const { page : initialPage } = query ;
32+ const { page : initialPage , ... queryParams } = query ;
3933
40- useEffect ( ( ) => {
34+ const [ page , setPage ] = useState ( ( ) => {
4135 if ( initialPage ) {
4236 const parsed = parseInt ( initialPage , 10 ) ;
43- if ( parsed !== page ) {
37+ if ( ! Number . isNaN ( parsed ) ) {
38+ return parsed ;
39+ }
40+ }
41+ return p ?. page ?? 1 ;
42+ } ) ;
43+
44+ const [ params , setParams ] = useState ( ( ) => ( {
45+ type : itemsType ,
46+ limit : itemsPerPage ,
47+ // Parse query params to restore filter state
48+ ...Object . entries ( queryParams ) . reduce ( ( acc , [ key , value ] ) => {
49+ if ( typeof value === "string" && value . includes ( "," ) ) {
50+ acc [ key ] = value . split ( "," ) ;
51+ } else if ( value ) {
52+ acc [ key ] = value ;
53+ }
54+ return acc ;
55+ } , { } ) ,
56+ } ) ) ;
57+
58+ const listRef = useRef ( null ) ;
59+
60+ // Sync page and params with URL query changes
61+ useEffect ( ( ) => {
62+ const { page : queryPage , ...currentQueryParams } = query ;
63+
64+ // Sync page from URL
65+ if ( queryPage ) {
66+ const parsed = parseInt ( queryPage , 10 ) ;
67+ if ( ! Number . isNaN ( parsed ) && parsed !== page ) {
4468 setPage ( parsed ) ;
4569 }
4670 }
71+
72+ // Sync params from URL
73+ const newParams = {
74+ type : itemsType ,
75+ limit : itemsPerPage ,
76+ ...Object . entries ( currentQueryParams ) . reduce ( ( acc , [ key , value ] ) => {
77+ if ( typeof value === "string" && value . includes ( "," ) ) {
78+ acc [ key ] = value . split ( "," ) ;
79+ } else if ( value ) {
80+ acc [ key ] = value ;
81+ }
82+ return acc ;
83+ } , { } ) ,
84+ } ;
85+ setParams ( newParams ) ;
4786 // eslint-disable-next-line react-hooks/exhaustive-deps
48- } , [ initialPage ] ) ;
87+ } , [ ] ) ;
4988
5089 const { items = [ ] , pagination = p } = useOpportunities (
5190 page ,
5291 params ,
5392 initialItems ,
5493 p ?. count ,
55- true ,
94+ ! hasFilters && ! hasPagination ,
5695 apiEndpoint ,
5796 ) ;
5897
@@ -81,23 +120,23 @@ const OpportunityList = forwardRef(function OpportunityList(props, ref) {
81120 function handleApplyFilters ( filterParams ) {
82121 setParams ( ( prev ) => ( { ...prev , ...filterParams } ) ) ;
83122 setPage ( 1 ) ;
84- const urlParams = new URLSearchParams ( router . query ) ;
123+ const searchParams = new URLSearchParams ( window . location . search ) ;
85124 Object . entries ( filterParams ) . forEach ( ( [ key , value ] ) => {
86- if ( Array . isArray ( value ) ) {
87- urlParams . set ( key , value . join ( "," ) ) ;
125+ if ( Array . isArray ( value ) && value . length > 0 ) {
126+ searchParams . set ( key , value . join ( "," ) ) ;
127+ } else if ( value ) {
128+ searchParams . set ( key , value ) ;
88129 } else {
89- urlParams . set ( key , value ) ;
130+ searchParams . delete ( key ) ;
90131 }
91132 } ) ;
92- urlParams . delete ( "page" ) ;
93- router . push (
94- {
95- pathname : router . pathname ,
96- query : urlParams . toString ( ) ,
97- } ,
98- undefined ,
99- { shallow : true , scroll : false } ,
100- ) ;
133+ searchParams . delete ( "page" ) ;
134+ const queryString = searchParams . toString ( ) ;
135+ let urlPath = window . location . pathname ;
136+ if ( queryString ) {
137+ urlPath = `${ urlPath } ?${ queryString } ` ;
138+ }
139+ router . push ( urlPath , undefined , { shallow : true , scroll : false } ) ;
101140 }
102141
103142 return (
0 commit comments