Skip to content

Commit 642eab6

Browse files
committed
fix(nodes): remove unused totalNodes prop and enhance loading state management in NodesList
1 parent 62d6ada commit 642eab6

File tree

2 files changed

+14
-19
lines changed

2 files changed

+14
-19
lines changed

dashboard/src/components/nodes/node-filters.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,11 @@ export const NodeFilters = ({ filters, onFilterChange, refetch, isFetching }: No
104104
interface NodePaginationControlsProps {
105105
currentPage: number
106106
totalPages: number
107-
totalNodes: number
108107
isLoading: boolean
109108
onPageChange: (page: number) => void
110109
}
111110

112-
export const NodePaginationControls = ({ currentPage, totalPages, totalNodes, isLoading, onPageChange }: NodePaginationControlsProps) => {
111+
export const NodePaginationControls = ({ currentPage, totalPages, isLoading, onPageChange }: NodePaginationControlsProps) => {
113112
const dir = useDirDetection()
114113

115114
const getPaginationRange = (currentPage: number, totalPages: number) => {

dashboard/src/components/nodes/nodes-list.tsx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)