import { useState, useEffect } from 'react'; import type { ServiceStatus } from './types'; import { ProviderStatusCheckerFactory } from './provider-factory'; export default function ServiceStatusTab() { const [serviceStatuses, setServiceStatuses] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const checkAllProviders = async () => { try { setLoading(true); setError(null); const providers = ProviderStatusCheckerFactory.getProviderNames(); const statuses: ServiceStatus[] = []; for (const provider of providers) { try { const checker = ProviderStatusCheckerFactory.getChecker(provider); const result = await checker.checkStatus(); statuses.push({ provider, ...result, lastChecked: new Date().toISOString(), }); } catch (err) { console.error(`Error checking ${provider} status:`, err); statuses.push({ provider, status: 'degraded', message: 'Unable to check service status', incidents: ['Error checking service status'], lastChecked: new Date().toISOString(), }); } } setServiceStatuses(statuses); } catch (err) { console.error('Error checking provider statuses:', err); setError('Failed to check service statuses'); } finally { setLoading(false); } }; checkAllProviders(); // Set up periodic checks every 5 minutes const interval = setInterval(checkAllProviders, 5 * 60 * 1000); return () => clearInterval(interval); }, []); const getStatusColor = (status: ServiceStatus['status']) => { switch (status) { case 'operational': return 'text-green-500 dark:text-green-400'; case 'degraded': return 'text-yellow-500 dark:text-yellow-400'; case 'down': return 'text-red-500 dark:text-red-400'; default: return 'text-gray-500 dark:text-gray-400'; } }; const getStatusIcon = (status: ServiceStatus['status']) => { switch (status) { case 'operational': return 'i-ph:check-circle'; case 'degraded': return 'i-ph:warning'; case 'down': return 'i-ph:x-circle'; default: return 'i-ph:question'; } }; if (loading) { return (
); } if (error) { return (

{error}

); } return (
{serviceStatuses.map((service) => (

{service.provider}

{service.status}

{service.message}

{service.incidents && service.incidents.length > 0 && (

Recent Incidents:

    {service.incidents.map((incident, index) => (
  • {incident}
  • ))}
)}
Last checked: {new Date(service.lastChecked).toLocaleString()}
))}
); }