diff --git a/src/contexts/ServerContext.tsx b/src/contexts/ServerContext.tsx index 44dcf9c..2719fbb 100644 --- a/src/contexts/ServerContext.tsx +++ b/src/contexts/ServerContext.tsx @@ -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 ( diff --git a/src/pages/Servers.tsx b/src/pages/Servers.tsx index 63c9080..0c28bcc 100644 --- a/src/pages/Servers.tsx +++ b/src/pages/Servers.tsx @@ -307,15 +307,6 @@ function Servers() { {server.category} - {server.error && ( -

- Error: {server.error} -

- )} {/* Join Button */}