Skip to content

Commit 955c998

Browse files
persist pagination in search params
1 parent 75b451c commit 955c998

File tree

1 file changed

+45
-4
lines changed

1 file changed

+45
-4
lines changed

src/pages/users/Users.tsx

+45-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
33
import { Button } from '@/components/ui/button'
44
import { Page } from './api/usersApi.types'
@@ -11,6 +11,14 @@ import { UserDialog } from './components/user-dialog'
1111
import { useUserColumns } from '@/pages/users/hooks/useColumns'
1212
import { LoadingScreenMemo } from '@/components/app/loading-screen'
1313
import { usersApi } from '@/pages/users/api/usersApi.ts'
14+
import { useSearchParams } from 'react-router-dom'
15+
16+
type UsersSearchParams = {
17+
page: number
18+
size: number
19+
sort: string
20+
desc: boolean
21+
}
1422

1523
const buildPage = (pagination: PaginationState, sorting: SortingState): Page => {
1624
return new Page(pagination.pageIndex, pagination.pageSize, sorting[0].id, sorting[0].desc ? 'DESC' : 'ASC')
@@ -21,11 +29,26 @@ const toPayload = (data: Page): PayloadAction<{ page: number; pageSize: number;
2129
}
2230

2331
export const Users: React.FC = () => {
32+
const [searchParams, setSearchParams] = useSearchParams()
33+
const getSearchParams = (): UsersSearchParams => {
34+
return {
35+
page: (searchParams.get('page') && parseInt(searchParams.get('page')!)) || 0,
36+
size: (searchParams.get('size') && parseInt(searchParams.get('size')!)) || 5,
37+
sort: (searchParams.get('sort') && searchParams.get('sort')!) || '_id',
38+
desc: (searchParams.get('desc') && searchParams.get('desc')! === 'true') || false,
39+
}
40+
}
41+
2442
const [pagination, setPagination] = useState<PaginationState>({
25-
pageIndex: 0,
26-
pageSize: 5,
43+
pageIndex: getSearchParams().page,
44+
pageSize: getSearchParams().size,
2745
})
28-
const [sorting, setSorting] = React.useState<SortingState>([{ id: '_id', desc: false }])
46+
const [sorting, setSorting] = React.useState<SortingState>([
47+
{
48+
id: getSearchParams().sort,
49+
desc: getSearchParams().desc,
50+
},
51+
])
2952

3053
const { roles } = useRolesGraphql()
3154
const users = usersApi.useGetAllUsersQuery(toPayload(buildPage(pagination, sorting)))
@@ -34,6 +57,24 @@ export const Users: React.FC = () => {
3457
const { t } = useTranslation(['main'])
3558
const columns = useUserColumns()
3659

60+
useEffect(() => {
61+
const params = getSearchParams()
62+
setPagination({ pageIndex: params.page, pageSize: params.size })
63+
setSorting([{ id: params.sort, desc: params.desc }])
64+
}, [searchParams])
65+
66+
useEffect(() => {
67+
const params: UsersSearchParams = {
68+
page: pagination.pageIndex,
69+
size: pagination.pageSize,
70+
sort: sorting[0].id,
71+
desc: sorting[0].desc,
72+
}
73+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
74+
// @ts-expect-error
75+
setSearchParams(params)
76+
}, [pagination, sorting])
77+
3778
if (users.isLoading) {
3879
return <LoadingScreenMemo />
3980
}

0 commit comments

Comments
 (0)