Refactor server error handling in Servers component to improve UI clarity

This commit is contained in:
2025-10-05 16:38:56 +08:00
parent 86cfb82158
commit a957004142
2 changed files with 45 additions and 40 deletions

View File

@@ -78,45 +78,59 @@ export function ServerProvider({ children }: { children: ReactNode }) {
}
const data = await response.json()
const results: ServerData[] = serverList.map((server, index) => {
const a2sData = data.results?.[index]
if (a2sData) {
return {
...server,
a2sData,
status: 'online' as const
// Update servers state with new data
setServers(prevServers => {
const results: ServerData[] = serverList.map((server, index) => {
const a2sData = data.results?.[index]
if (a2sData) {
return {
...server,
a2sData,
status: 'online' as const
}
} else {
// If no data for this server but we have previous data, keep the previous data
const prevServer = prevServers.find(s => s.ip === server.ip && s.port === server.port)
if (prevServer?.a2sData) {
return prevServer // Keep previous successful data
}
return {
...server,
status: 'offline' as const,
error: 'No response from server'
}
}
} else {
return {
...server,
status: 'offline' as const,
error: 'No response from server'
}
}
})
return results
})
// Only update if we got successful data
setServers(results)
setLoading(false)
setLastUpdated(Date.now())
setHasInitialData(true)
} catch (error) {
console.error('Failed to fetch server data:', error)
// If we have initial data, don't update the servers state
// This prevents showing errors to users when polling fails
if (!hasInitialData) {
// Only set offline servers if this is the first attempt
const offlineServers: ServerData[] = serverList.map(server => ({
...server,
status: 'offline' as const,
error: error instanceof Error ? error.message : 'Unknown error'
}))
setServers(offlineServers)
setLoading(false)
}
// Don't update lastUpdated on error to keep showing previous timestamp
// If we already have data from a previous successful fetch, keep using it
// Only show error state if this is the very first fetch attempt
setServers(prevServers => {
if (prevServers.length > 0 && hasInitialData) {
// Keep previous data on polling errors
return prevServers
} else {
// First fetch failed, show offline state
const offlineServers: ServerData[] = serverList.map(server => ({
...server,
status: 'offline' as const,
error: error instanceof Error ? error.message : 'Unknown error'
}))
return offlineServers
}
})
setLoading(false)
// Don't update lastUpdated on error to keep showing previous successful fetch time
}
}
@@ -129,7 +143,7 @@ export function ServerProvider({ children }: { children: ReactNode }) {
}, 2000) // Poll every 2 seconds
return () => clearInterval(interval)
}, [])
}, []) // Empty dependency array is intentional - we want this to run once
return (
<ServerContext.Provider value={{ servers, loading, lastUpdated, hasInitialData }}>

View File

@@ -307,15 +307,6 @@ function Servers() {
{server.category}
</span>
</div>
{server.error && (
<p style={{
fontSize: '0.9rem',
color: '#ef4444',
marginBottom: '1rem'
}}>
Error: {server.error}
</p>
)}
</div>
{/* Join Button */}