import { useState, useEffect, useRef } from 'react'; import { Server } from '../types'; import ping from './utils/jsping.js'; interface ServerWidgetProps { config: { serverWidget: { enabled: boolean; pingFrequency: number; servers: Server[]; }; }; } const getStatusColor = (status: string) => { switch (status) { case 'online': return 'bg-green-500'; case 'offline': return 'bg-red-500'; default: return 'bg-gray-500'; } }; const ServerWidget: React.FC = ({ config }) => { const [serverStatus, setServerStatus] = useState>({}); const serversRef = useRef(config.serverWidget.servers); serversRef.current = config.serverWidget.servers; const serversSignature = config.serverWidget.servers .map(s => `${s.id}:${s.address}`) .join('|'); const serverCount = config.serverWidget.servers.length; useEffect(() => { if (!config.serverWidget.enabled) return; const pingServers = () => { const pending: Record = {}; for (const s of serversRef.current) pending[s.id] = 'pending'; setServerStatus(prev => ({ ...prev, ...pending })); serversRef.current.forEach((server) => { ping(server.address) .then(() => { setServerStatus(prev => prev[server.id] === 'online' ? prev : { ...prev, [server.id]: 'online' } ); }) .catch(() => { setServerStatus(prev => prev[server.id] === 'offline' ? prev : { ...prev, [server.id]: 'offline' } ); }); }); }; pingServers(); const interval = setInterval(pingServers, config.serverWidget.pingFrequency * 1000); return () => clearInterval(interval); }, [ config.serverWidget.enabled, config.serverWidget.pingFrequency, serversSignature, serverCount, ]); if (!config.serverWidget.enabled) { return null; } return (
{config.serverWidget.servers.map((server) => (
{server.name}
))}
); }; export default ServerWidget;