@@ -4,7 +4,7 @@ import { useGetAdmins, useRemoveAllUsers } from '@/service/api'
44import { DataTable } from './data-table'
55import { setupColumns } from './columns'
66import { Filters } from './filters'
7- import { useEffect , useState } from 'react'
7+ import { useEffect , useState , useRef } from 'react'
88import { PaginationControls } from './filters.tsx'
99import { AlertDialog , AlertDialogAction , AlertDialogCancel , AlertDialogContent , AlertDialogDescription , AlertDialogFooter , AlertDialogHeader , AlertDialogTitle } from '@/components/ui/alert-dialog'
1010import { cn } from '@/lib/utils'
@@ -22,11 +22,11 @@ interface AdminFilters {
2222}
2323
2424interface AdminsTableProps {
25- data : AdminDetails [ ]
2625 onEdit : ( admin : AdminDetails ) => void
2726 onDelete : ( admin : AdminDetails ) => void
2827 onToggleStatus : ( admin : AdminDetails , checked : boolean ) => void
2928 onResetUsage : ( adminUsername : string ) => void
29+ onTotalAdminsChange ?: ( counts : { total : number ; active : number ; disabled : number } | null ) => void
3030}
3131
3232const DeleteAlertDialog = ( { admin, isOpen, onClose, onConfirm } : { admin : AdminDetails ; isOpen : boolean ; onClose : ( ) => void ; onConfirm : ( ) => void } ) => {
@@ -127,11 +127,13 @@ const RemoveAllUsersConfirmationDialog = ({ adminUsername, isOpen, onClose, onCo
127127 )
128128}
129129
130- export default function AdminsTable ( { onEdit, onDelete, onToggleStatus, onResetUsage } : AdminsTableProps ) {
130+ export default function AdminsTable ( { onEdit, onDelete, onToggleStatus, onResetUsage, onTotalAdminsChange } : AdminsTableProps ) {
131131 const { t } = useTranslation ( )
132132 const [ currentPage , setCurrentPage ] = useState ( 0 )
133133 const [ itemsPerPage , setItemsPerPage ] = useState ( getAdminsPerPageLimitSize ( ) )
134134 const [ isChangingPage , setIsChangingPage ] = useState ( false )
135+ const isFirstLoadRef = useRef ( true )
136+ const isAutoRefreshingRef = useRef ( false )
135137 const [ filters , setFilters ] = useState < AdminFilters > ( {
136138 limit : itemsPerPage ,
137139 offset : 0 ,
@@ -145,8 +147,30 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
145147 const [ adminToReset , setAdminToReset ] = useState < string | null > ( null )
146148 const [ adminToRemoveAllUsers , setAdminToRemoveAllUsers ] = useState < string | null > ( null )
147149
148- const { data : totalAdmins } = useGetAdmins ( )
149- const { data : adminsData , refetch, isLoading, isFetching } = useGetAdmins ( filters )
150+ const { data : adminsResponse , isLoading, isFetching } = useGetAdmins ( filters , {
151+ query : {
152+ staleTime : 0 ,
153+ gcTime : 0 ,
154+ retry : 1 ,
155+ } ,
156+ } )
157+
158+ const adminsData = adminsResponse ?. admins || [ ]
159+
160+ // Expose counts to parent component for statistics
161+ useEffect ( ( ) => {
162+ if ( onTotalAdminsChange ) {
163+ if ( adminsResponse ) {
164+ onTotalAdminsChange ( {
165+ total : adminsResponse . total ,
166+ active : adminsResponse . active ,
167+ disabled : adminsResponse . disabled ,
168+ } )
169+ } else {
170+ onTotalAdminsChange ( null )
171+ }
172+ }
173+ } , [ adminsResponse , onTotalAdminsChange ] )
150174 const removeAllUsersMutation = useRemoveAllUsers ( )
151175
152176 // Update filters when pagination changes
@@ -158,6 +182,18 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
158182 } ) )
159183 } , [ currentPage , itemsPerPage ] )
160184
185+ useEffect ( ( ) => {
186+ if ( adminsData && isFirstLoadRef . current ) {
187+ isFirstLoadRef . current = false
188+ }
189+ } , [ adminsData ] )
190+
191+ useEffect ( ( ) => {
192+ if ( ! isFetching && isAutoRefreshingRef . current ) {
193+ isAutoRefreshingRef . current = false
194+ }
195+ } , [ isFetching ] )
196+
161197 // When filters change (e.g., search), reset page if needed
162198 const handleFilterChange = ( newFilters : Partial < AdminFilters > ) => {
163199 setFilters ( prev => {
@@ -247,40 +283,20 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
247283 }
248284 }
249285
250- const handlePageChange = async ( newPage : number ) => {
286+ const handlePageChange = ( newPage : number ) => {
251287 if ( newPage === currentPage || isChangingPage ) return
252288
253289 setIsChangingPage ( true )
254290 setCurrentPage ( newPage )
255-
256- try {
257- // Immediate refetch without delay
258- await refetch ( )
259- } finally {
260- // Minimal delay for instant response
261- setTimeout ( ( ) => {
262- setIsChangingPage ( false )
263- } , 50 )
264- }
291+ setIsChangingPage ( false )
265292 }
266293
267- const handleItemsPerPageChange = async ( value : number ) => {
294+ const handleItemsPerPageChange = ( value : number ) => {
268295 setIsChangingPage ( true )
269296 setItemsPerPage ( value )
270297 setCurrentPage ( 0 ) // Reset to first page when items per page changes
271-
272- // Save to localStorage
273298 setAdminsPerPageLimitSize ( value . toString ( ) )
274-
275- try {
276- // Immediate refetch without delay
277- await refetch ( )
278- } finally {
279- // Minimal delay for instant response
280- setTimeout ( ( ) => {
281- setIsChangingPage ( false )
282- } , 50 )
283- }
299+ setIsChangingPage ( false )
284300 }
285301
286302 const handleSort = ( column : string ) => {
@@ -312,6 +328,9 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
312328 onRemoveAllUsers : handleRemoveAllUsersClick ,
313329 } )
314330
331+ const showLoadingSpinner = isLoading && isFirstLoadRef . current
332+ const isPageLoading = isChangingPage
333+
315334 return (
316335 < div >
317336 < Filters filters = { filters } onFilterChange = { handleFilterChange } />
@@ -324,15 +343,15 @@ export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetU
324343 onResetUsage = { handleResetUsersUsageClick }
325344 onRemoveAllUsers = { handleRemoveAllUsersClick }
326345 setStatusToggleDialogOpen = { setStatusToggleDialogOpen }
327- isLoading = { isLoading }
328- isFetching = { isFetching }
346+ isLoading = { showLoadingSpinner }
347+ isFetching = { isFetching && ! isFirstLoadRef . current && ! isAutoRefreshingRef . current }
329348 />
330349 < PaginationControls
331350 currentPage = { currentPage }
332- totalPages = { Math . ceil ( ( totalAdmins ?. length || 0 ) / itemsPerPage ) }
351+ totalPages = { Math . ceil ( ( adminsResponse ?. total || 0 ) / itemsPerPage ) }
333352 itemsPerPage = { itemsPerPage }
334- totalItems = { adminsData ?. length || 0 }
335- isLoading = { isLoading || isFetching }
353+ totalItems = { adminsResponse ?. total || 0 }
354+ isLoading = { isPageLoading }
336355 onPageChange = { handlePageChange }
337356 onItemsPerPageChange = { handleItemsPerPageChange }
338357 />
0 commit comments