import React, { useState, useEffect, useCallback } from 'react'; import apiClient from '../api/apiClient'; import { HealthStatus } from '../types/types'; interface PingLabServerProps { autoCheckInterval?: number; // 自动检查间隔时间(毫秒),默认为30秒 showLatency?: boolean; // 是否显示延迟时间 } const PingLabServer: React.FC = ({ autoCheckInterval = 30000, showLatency = true, }) => { const [status, setStatus] = useState(null); const [isChecking, setIsChecking] = useState(false); const [lastChecked, setLastChecked] = useState(null); // 检查服务器状态 const checkServerStatus = useCallback(async () => { setIsChecking(true); try { const result = await apiClient.checkHealth(); if (result.data) { setStatus(result.data); } else { setStatus({ status: 'offline', message: result.error || '未知错误', }); } } catch (error) { setStatus({ status: 'offline', message: error instanceof Error ? error.message : '检查失败', }); } finally { setIsChecking(false); setLastChecked(new Date()); } }, []); // 手动检查 const handleManualCheck = () => { checkServerStatus(); }; // 自动定时检查 useEffect(() => { // 初始检查 checkServerStatus(); // 设置定时器 const intervalId = setInterval(checkServerStatus, autoCheckInterval); // 清理定时器 return () => clearInterval(intervalId); }, [checkServerStatus, autoCheckInterval]); // 格式化上次检查时间 const getFormattedLastChecked = () => { if (!lastChecked) return '尚未检查'; // 格式化为 HH:MM:SS return lastChecked.toLocaleTimeString(); }; return (

服务器状态

{status?.status === 'online' ? '在线' : status?.status === 'offline' ? '离线' : '未知'}
{status?.message && (
{status.message}
)} {showLatency && status?.latency && (
延迟: {status.latency}ms
)}
上次检查: {getFormattedLastChecked()}
); }; export default PingLabServer;