import React, { useEffect, useState } from 'react'; import axios from 'axios'; import { formatLocalTime } from './utils/timeUtils'; import './Status.css'; function Status() { const [resources, setResources] = useState([]); const [incidents, setIncidents] = useState([]); const [maintenanceWindows, setMaintenanceWindows] = useState([]); const [loading, setLoading] = useState(true); const [autoRefresh, setAutoRefresh] = useState(true); const [lastUpdated, setLastUpdated] = useState(new Date()); useEffect(() => { loadStatusData(); if (!autoRefresh) return; const interval = setInterval(loadStatusData, 15000); return () => clearInterval(interval); }, [autoRefresh]); const loadStatusData = async () => { try { const statusRes = await axios.get('/api/status-page'); setResources(statusRes.data.resources || []); setIncidents(statusRes.data.incidents || []); setMaintenanceWindows(statusRes.data.maintenanceWindows || []); setLastUpdated(new Date()); } catch (error) { // Status load error handled } finally { setLoading(false); } }; const formatDuration = (ms) => { const seconds = Math.floor(ms / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); const days = Math.floor(hours / 24); if (days > 0) return `${days}d ${hours % 24}h`; if (hours > 0) return `${hours}h ${minutes % 60}m`; if (minutes > 0) return `${minutes}m`; return `${seconds}s`; }; const getResourceStatus = (resourceId) => { const activeIncident = incidents.find( (inc) => inc.resource_id === resourceId && !inc.resolved_at ); return activeIncident ? 'down' : 'up'; }; const upCount = resources.filter((r) => getResourceStatus(r.id) === 'up').length; const downCount = resources.filter((r) => getResourceStatus(r.id) === 'down').length; if (loading) { return
Loading status...
Real-time monitoring status
Last updated: {formatLocalTime(lastUpdated)}
Active Incident
Started: {formatLocalTime(activeIncident.started_at)}
{activeIncident.description && ({activeIncident.description}
)}Duration: {formatDuration(new Date() - new Date(activeIncident.started_at))}
Scheduled Maintenance
{formatLocalTime( maintenanceWindows.find( (m) => m.resource_id === resource.id && new Date() >= new Date(m.start_time) && new Date() <= new Date(m.end_time) )?.start_time )}
✓ All systems operational
| Service | Start Time | End Time | Reason |
|---|---|---|---|
| {resources.find((r) => r.id === maint.resource_id)?.name || 'Unknown'} | {formatLocalTime(maint.start_time)} | {formatLocalTime(maint.end_time)} | {maint.reason || '-'} |
| Service | Started | Duration | Description |
|---|---|---|---|
| {resources.find((r) => r.id === incident.resource_id)?.name || 'Unknown'} | {formatLocalTime(incident.started_at)} | {formatDuration(new Date() - new Date(incident.started_at))} | {incident.description || '-'} |