import { useEffect, useState } from 'react' import { useConfigStore } from '../stores/configStore' type ConnectionState = 'connected' | 'connecting' | 'disconnected' | 'error' interface ConnectionStatusProps { showDetails?: boolean } export function ConnectionStatus({ showDetails = false }: ConnectionStatusProps) { const { config } = useConfigStore() const [status, setStatus] = useState('connecting') const [latency, setLatency] = useState(null) useEffect(() => { const checkConnection = async () => { if (!config?.server_url) { setStatus('disconnected') return } try { const start = performance.now() const response = await fetch(`${config.server_url}/api/v1/health`, { signal: AbortSignal.timeout(5000), }) const elapsed = Math.round(performance.now() - start) if (response.ok) { setStatus('connected') setLatency(elapsed) } else { setStatus('error') setLatency(null) } } catch { setStatus('disconnected') setLatency(null) } } checkConnection() const interval = setInterval(checkConnection, 30000) return () => clearInterval(interval) }, [config?.server_url]) const statusConfig = { connected: { color: 'bg-green-500', text: '已连接', icon: '🟢', }, connecting: { color: 'bg-yellow-500 animate-pulse', text: '连接中', icon: '🟡', }, disconnected: { color: 'bg-red-500', text: '未连接', icon: '🔴', }, error: { color: 'bg-orange-500', text: '连接异常', icon: '🟠', }, } const { color, text, icon } = statusConfig[status] if (!showDetails) { return (
{text}
) } return (
{icon}

{config?.server_name || 'FunMC'}

{config?.server_url}

{text}

{latency !== null && (

{latency}ms

)}
) }