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