1
- import React , { useState } from 'react'
1
+ import React , { useEffect , useState } from 'react'
2
2
import { Card , CardContent , CardDescription , CardHeader , CardTitle } from '@/components/ui/card'
3
3
import { Button } from '@/components/ui/button'
4
4
import { Page } from './api/usersApi.types'
@@ -11,6 +11,14 @@ import { UserDialog } from './components/user-dialog'
11
11
import { useUserColumns } from '@/pages/users/hooks/useColumns'
12
12
import { LoadingScreenMemo } from '@/components/app/loading-screen'
13
13
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
+ }
14
22
15
23
const buildPage = ( pagination : PaginationState , sorting : SortingState ) : Page => {
16
24
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;
21
29
}
22
30
23
31
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
+
24
42
const [ pagination , setPagination ] = useState < PaginationState > ( {
25
- pageIndex : 0 ,
26
- pageSize : 5 ,
43
+ pageIndex : getSearchParams ( ) . page ,
44
+ pageSize : getSearchParams ( ) . size ,
27
45
} )
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
+ ] )
29
52
30
53
const { roles } = useRolesGraphql ( )
31
54
const users = usersApi . useGetAllUsersQuery ( toPayload ( buildPage ( pagination , sorting ) ) )
@@ -34,6 +57,24 @@ export const Users: React.FC = () => {
34
57
const { t } = useTranslation ( [ 'main' ] )
35
58
const columns = useUserColumns ( )
36
59
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
+
37
78
if ( users . isLoading ) {
38
79
return < LoadingScreenMemo />
39
80
}
0 commit comments