@@ -33,6 +33,7 @@ export default function NodesList() {
3333 const wasFetchingRef = useRef ( false )
3434 const isFirstLoadRef = useRef ( true )
3535 const previousTotalPagesRef = useRef ( 0 )
36+ const isAutoRefreshingRef = useRef ( false )
3637 const modifyNodeMutation = useModifyNode ( )
3738 const [ allNodes , setAllNodes ] = useState < NodeResponse [ ] > ( [ ] )
3839 const [ localSearchTerm , setLocalSearchTerm ] = useState < string > ( '' )
@@ -68,31 +69,33 @@ export default function NodesList() {
6869 } ,
6970 } )
7071
71- // Check if we should use local search (only one page of nodes)
7272 const totalNodesFromResponse = nodesResponse ?. total || 0
7373 const shouldUseLocalSearch = totalNodesFromResponse > 0 && totalNodesFromResponse <= NODES_PER_PAGE && ! filters . search
7474
7575 useEffect ( ( ) => {
7676 if ( nodesResponse && isFirstLoadRef . current ) {
7777 isFirstLoadRef . current = false
7878 }
79- // Store all nodes when fetched without search/pagination and there's only one page
8079 if ( nodesResponse && shouldUseLocalSearch && ! filters . search && filters . offset === 0 ) {
8180 setAllNodes ( nodesResponse . nodes || [ ] )
8281 }
8382 } , [ nodesResponse , shouldUseLocalSearch , filters . search , filters . offset ] )
8483
8584 useEffect ( ( ) => {
86- // Track when fetching starts
87- if ( isFetching ) {
88- wasFetchingRef . current = true
85+ if ( isFetching && ! isChangingPage && ! isFirstLoadRef . current && nodesResponse ) {
86+ isAutoRefreshingRef . current = true
8987 }
90- // Only reset isChangingPage when fetching completes (was fetching, now not fetching)
9188 if ( ! isFetching && wasFetchingRef . current && isChangingPage ) {
9289 setIsChangingPage ( false )
9390 wasFetchingRef . current = false
9491 }
95- } , [ isFetching , isChangingPage ] )
92+ if ( isFetching ) {
93+ wasFetchingRef . current = true
94+ }
95+ if ( ! isFetching && isAutoRefreshingRef . current ) {
96+ isAutoRefreshingRef . current = false
97+ }
98+ } , [ isFetching , isChangingPage , nodesResponse ] )
9699
97100 useEffect ( ( ) => {
98101 const handleOpenDialog = ( ) => setIsDialogOpen ( true )
@@ -104,9 +107,8 @@ export default function NodesList() {
104107 const searchValue = newFilters . search !== undefined ? newFilters . search : filters . search
105108 setLocalSearchTerm ( searchValue || '' )
106109
107- // If using local search, don't update API filters
108110 if ( shouldUseLocalSearch && searchValue ) {
109- setCurrentPage ( 0 ) // Reset to first page when searching locally
111+ setCurrentPage ( 0 )
110112 return
111113 }
112114
@@ -189,7 +191,6 @@ export default function NodesList() {
189191 }
190192 }
191193
192- // Filter nodes locally when using local search
193194 const filteredNodes = useMemo ( ( ) => {
194195 if ( shouldUseLocalSearch && localSearchTerm && allNodes . length > 0 ) {
195196 const searchLower = localSearchTerm . toLowerCase ( )
@@ -202,7 +203,6 @@ export default function NodesList() {
202203 return nodesResponse ?. nodes || [ ]
203204 } , [ shouldUseLocalSearch , localSearchTerm , allNodes , nodesResponse ?. nodes ] )
204205
205- // Calculate pagination for local search
206206 const paginatedNodes = useMemo ( ( ) => {
207207 if ( shouldUseLocalSearch && localSearchTerm ) {
208208 const start = currentPage * NODES_PER_PAGE
@@ -213,26 +213,23 @@ export default function NodesList() {
213213 } , [ shouldUseLocalSearch , localSearchTerm , filteredNodes , currentPage ] )
214214
215215 const nodesData = paginatedNodes
216- // Calculate total nodes - use filtered count for local search, otherwise use API response
217216 const totalNodes = shouldUseLocalSearch && localSearchTerm
218217 ? filteredNodes . length
219218 : ( nodesResponse ?. total || 0 )
220219 const showLoadingSpinner = isLoading && isFirstLoadRef . current
221- const isPageLoading = isChangingPage || ( isFetching && ! isFirstLoadRef . current && ! shouldUseLocalSearch )
220+ const isBackgroundRefetch = isFetching && ! isChangingPage && ! isFirstLoadRef . current && ! ! nodesResponse
221+ const isPageLoading = isChangingPage || ( isFetching && ! isFirstLoadRef . current && ! shouldUseLocalSearch && ! isBackgroundRefetch )
222222 const showPageLoadingSkeletons = isPageLoading && ! showLoadingSpinner
223223
224224 const calculatedTotalPages = Math . ceil ( totalNodes / NODES_PER_PAGE )
225- // Preserve totalPages during loading to prevent pagination from disappearing
226225 const totalPages = calculatedTotalPages > 0 ? calculatedTotalPages : ( isPageLoading ? previousTotalPagesRef . current : 0 )
227226
228- // Update previous total pages when we have valid data
229227 useEffect ( ( ) => {
230228 if ( calculatedTotalPages > 0 ) {
231229 previousTotalPagesRef . current = calculatedTotalPages
232230 }
233231 } , [ calculatedTotalPages ] )
234232
235- // Navigate to last available page if current page becomes invalid (e.g., after deleting all nodes on current page)
236233 useEffect ( ( ) => {
237234 if ( calculatedTotalPages > 0 && currentPage >= calculatedTotalPages ) {
238235 const lastPage = calculatedTotalPages - 1
@@ -327,7 +324,6 @@ export default function NodesList() {
327324 < NodePaginationControls
328325 currentPage = { currentPage }
329326 totalPages = { totalPages }
330- totalNodes = { totalNodes }
331327 isLoading = { isPageLoading }
332328 onPageChange = { handlePageChange }
333329 />
0 commit comments