1- import React , { useState } from 'react'
1+ import React , { useEffect , useState } from 'react'
22import { Card , CardContent , CardDescription , CardHeader , CardTitle } from '@/components/ui/card'
33import { Button } from '@/components/ui/button'
44import { Page } from './api/usersApi.types'
@@ -11,6 +11,14 @@ import { UserDialog } from './components/user-dialog'
1111import { useUserColumns } from '@/pages/users/hooks/useColumns'
1212import { LoadingScreenMemo } from '@/components/app/loading-screen'
1313import { 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
1523const 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
2331export 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