import { useState, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import type { ServiceStatusDetail } from '../../types/service'; import { getAllStatusDetail } from '../../services/heartbeatService'; const STATUS_COLOR: Record = { UP: 'bg-green-500', DOWN: 'bg-red-500', UNKNOWN: 'bg-gray-400', }; const STATUS_TEXT: Record = { UP: 'Operational', DOWN: 'Down', UNKNOWN: 'Unknown', }; const getUptimeBarColor = (pct: number): string => { if (pct >= 99.9) return 'bg-green-500'; if (pct >= 99) return 'bg-green-400'; if (pct >= 95) return 'bg-yellow-400'; if (pct >= 90) return 'bg-orange-400'; return 'bg-red-500'; }; const formatDate = (dateStr: string): string => { const d = new Date(dateStr); return `${d.getMonth() + 1}/${d.getDate()}`; }; const ServiceStatusPage = () => { const navigate = useNavigate(); const [services, setServices] = useState([]); const [isLoading, setIsLoading] = useState(true); const [lastUpdated, setLastUpdated] = useState(''); const fetchData = useCallback(async () => { try { const res = await getAllStatusDetail(); if (res.success && res.data) { setServices(res.data); } setLastUpdated(new Date().toLocaleTimeString('ko-KR')); } catch { // silent } finally { setIsLoading(false); } }, []); useEffect(() => { fetchData(); const interval = setInterval(fetchData, 60000); return () => clearInterval(interval); }, [fetchData]); const allOperational = services.length > 0 && services.every((s) => s.currentStatus === 'UP'); if (isLoading) { return
로딩 중...
; } return (

Service Status

마지막 갱신: {lastUpdated}
{/* Overall Status Banner */}
{allOperational ? 'All Systems Operational' : 'Some Systems Down'}
{/* Service List */}
{services.map((svc) => (
{/* Service Header */}

navigate(`/monitoring/service-status/${svc.serviceId}`)} > {svc.serviceName}

{STATUS_TEXT[svc.currentStatus] || svc.currentStatus} {svc.lastResponseTime !== null && ( {svc.lastResponseTime}ms )}
90일 Uptime: {svc.uptimePercent90d.toFixed(2)}%
{/* 90-Day Uptime Bar */}
{svc.dailyUptime.length > 0 ? ( svc.dailyUptime.map((day, idx) => (
{formatDate(day.date)}: {day.uptimePercent.toFixed(1)}%
)) ) : (
)}
{svc.dailyUptime.length > 0 ? formatDate(svc.dailyUptime[0].date) : ''} Today
))} {services.length === 0 && (
등록된 서비스가 없습니다
)}
); }; export default ServiceStatusPage;