Skip to content

Commit 9c88372

Browse files
committed
fix(pagination): Clean the pagination hook
1 parent cccd1e2 commit 9c88372

File tree

1 file changed

+23
-31
lines changed

1 file changed

+23
-31
lines changed

packages/module/src/Hooks/pagination.ts

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)