@@ -29,7 +29,7 @@ import Table from '@components/Table'; // Table component
2929import Pagination from '@components/Pagination' ; // Pagination component
3030import RequestStatusBadge from '@components/admin/RequestStatusBadge' ; //Status badge component
3131import { useQuery } from '@tools/hooks/graphql' ; //Apollo client
32- import { useEffect , useState } from 'react' ; // React
32+ import { useEffect , useRef , useState , useMemo } from 'react' ; // React
3333import {
3434 ApplicationRow ,
3535 GetApplicationsRequest ,
@@ -46,27 +46,42 @@ import EmptyMessage from '@components/EmptyMessage';
4646
4747interface RouterQuery {
4848 tab ?: string ;
49+ page ?: number ;
4950}
5051
51- export const getTabIndex = ( routerQuery : RouterQuery ) : number => {
52- if ( routerQuery === undefined || routerQuery . tab === undefined ) {
53- return 1 ;
52+ export const getTabPageIndex = ( routerQuery : RouterQuery ) : [ number , number ] => {
53+ if (
54+ routerQuery === undefined ||
55+ routerQuery . tab === undefined ||
56+ routerQuery . page === undefined
57+ ) {
58+ return [ 1 , 0 ] ;
5459 }
60+
5561 const tabName = routerQuery . tab ;
62+ let tabIndex = 1 ;
63+
5664 switch ( tabName ) {
5765 case 'ALL' :
58- return 0 ;
66+ tabIndex = 0 ;
67+ break ;
5968 case 'PENDING' :
60- return 1 ;
69+ tabIndex = 1 ;
70+ break ;
6171 case 'IN_PROGRESS' :
62- return 2 ;
72+ tabIndex = 2 ;
73+ break ;
6374 case 'COMPLETED' :
64- return 3 ;
75+ tabIndex = 3 ;
76+ break ;
6577 case 'REJECTED' :
66- return 4 ;
78+ tabIndex = 4 ;
79+ break ;
6780 default :
68- return 1 ;
81+ tabIndex = 1 ;
6982 }
83+
84+ return [ tabIndex , Number ( routerQuery . page ) ] ;
7085} ;
7186
7287const tabIndexToStatus : { [ key : number ] : ApplicationStatus | 'ALL' } = {
@@ -174,23 +189,37 @@ const Requests: NextPage = () => {
174189 // This will avoid firing a query for each key the user presses
175190 const debouncedSearchFilter = useDebounce < string > ( searchFilter , 500 ) ;
176191
192+ const filters = useMemo (
193+ ( ) => ( {
194+ statusFilter,
195+ permitTypeFilter,
196+ requestTypeFilter,
197+ searchFilter,
198+ sortOrder,
199+ } ) ,
200+ [ statusFilter , permitTypeFilter , requestTypeFilter , searchFilter , sortOrder ]
201+ ) ;
202+
203+ const debouncedFilters = useDebounce ( filters , 500 ) ;
204+
177205 // Data & pagination
178206 const [ requestsData , setRequestsData ] = useState < Array < ApplicationRow > > ( [ ] ) ;
179207 const [ pageNumber , setPageNumber ] = useState ( 0 ) ;
180208 const [ recordsCount , setRecordsCount ] = useState ( 0 ) ;
181209
182210 // Tabs
183211 const [ tabIndex , setTabIndex ] = useState ( 0 ) ;
184- const getTabFromRoute = ( ) : number => {
185- const index = getTabIndex ( routerQuery ) ;
212+ const getTabPageFromRoute = ( ) => {
213+ const [ index , page ] = getTabPageIndex ( routerQuery ) ;
186214 setTabIndex ( index ) ;
215+ setPageNumber ( page ) ;
187216 return index ;
188217 } ;
189218
190219 const handleTabChange = ( ) => {
191220 const status = tabIndexToStatus [ tabIndex ] ;
192221 setStatusFilter ( status === 'ALL' ? null : status ) ;
193- router . push ( { query : { tab : status } } ) ;
222+ router . push ( { query : { tab : status , page : pageNumber } } ) ;
194223 } ;
195224
196225 // Make query to applications resolver
@@ -239,9 +268,11 @@ const Requests: NextPage = () => {
239268 }
240269 ) ;
241270
271+ const firstRender = useRef ( true ) ;
272+
242273 // Determine the active tab on page load based on the route
243274 useEffect ( ( ) => {
244- getTabFromRoute ( ) ;
275+ getTabPageFromRoute ( ) ;
245276 } , [ ] ) ;
246277
247278 useEffect ( ( ) => {
@@ -251,9 +282,13 @@ const Requests: NextPage = () => {
251282
252283 // Set page number to 0 after every filter or sort change
253284 useEffect ( ( ) => {
285+ if ( firstRender . current ) {
286+ firstRender . current = false ;
287+ return ; // Skip resetting on first mount to allow resetting state
288+ }
254289 setPageNumber ( 0 ) ;
255290 refetch ( ) ;
256- } , [ statusFilter , permitTypeFilter , requestTypeFilter , debouncedSearchFilter , sortOrder ] ) ;
291+ } , debouncedFilters ) ;
257292
258293 return (
259294 < Layout >
@@ -291,6 +326,7 @@ const Requests: NextPage = () => {
291326 index = { tabIndex }
292327 onChange = { index => {
293328 setTabIndex ( index ) ;
329+ setPageNumber ( 0 ) ;
294330 } }
295331 >
296332 < TabList paddingX = "24px" defaultIndex = { 1 } >
@@ -423,7 +459,9 @@ const Requests: NextPage = () => {
423459 initialSort = { sortOrder }
424460 onChangeSortOrder = { setSortOrder }
425461 onRowClick = { ( { id } ) =>
426- router . push ( `/admin/request/${ id } ?origin=${ tabIndexToStatus [ tabIndex ] } ` )
462+ router . push (
463+ `/admin/request/${ id } ?tab=${ tabIndexToStatus [ tabIndex ] } &page=${ pageNumber } `
464+ )
427465 }
428466 />
429467 < Flex justifyContent = "flex-end" >
0 commit comments