import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Server, CheckCircle, XCircle, AlertTriangle, Pause, Clock } from 'lucide-react'; import { StatusPageComponentRecord } from '@/types/statusPageComponents.types'; import { Service, UptimeData } from '@/types/service.types'; import { UptimeHistoryRenderer } from './UptimeHistoryRenderer'; import { format } from 'date-fns'; interface ComponentsStatusSectionProps { components: StatusPageComponentRecord[]; services: Service[]; uptimeData: Record; } export const ComponentsStatusSection = ({ components, services, uptimeData }: ComponentsStatusSectionProps) => { const getServiceForComponent = (component: StatusPageComponentRecord) => { return services.find(service => service.id === component.service_id); }; const getComponentStatus = (component: StatusPageComponentRecord) => { const service = getServiceForComponent(component); return service?.status || 'unknown'; }; const getUptimePercentage = (serviceId: string) => { const history = uptimeData[serviceId] || []; if (history.length === 0) return 100; const upCount = history.filter(record => record.status === 'up').length; return Math.round((upCount / history.length) * 100 * 100) / 100; }; const getStatusIcon = (status: string) => { switch (status) { case 'up': return ; case 'down': return ; case 'warning': return ; case 'paused': return ; default: return ; } }; const getStatusBadge = (status: string) => { switch (status) { case 'up': return ( Operational ); case 'down': return ( Down ); case 'warning': return ( Degraded ); case 'paused': return ( Maintenance ); default: return ( Unknown ); } }; const getStatusDotColor = (status: string) => { switch (status) { case 'up': return 'bg-green-500'; case 'down': return 'bg-red-500'; case 'warning': return 'bg-yellow-500'; default: return 'bg-gray-500'; } }; if (components.length === 0) { return ( System Components
{[ { name: 'API Services', description: 'Core API endpoints and services', status: 'up' }, { name: 'Database', description: 'Primary database systems', status: 'up' }, { name: 'Authentication', description: 'User authentication services', status: 'up' }, { name: 'File Storage', description: 'Media and file hosting', status: 'up' } ].map((component, index) => (
{getStatusIcon(component.status)}

{component.name}

{component.description}

99.9% uptime 100ms response
{getStatusBadge(component.status)}
))}
); } return ( System Components

Real-time status of all monitored components

{components .sort((a, b) => a.display_order - b.display_order) .map((component) => { const service = getServiceForComponent(component); const status = getComponentStatus(component); const uptime = service?.id ? getUptimePercentage(component.service_id) : 100; return (
{getStatusIcon(status)}

{component.name}

{service?.responseTime && service.responseTime > 0 && (
{service.responseTime}ms
)}
{component.description && (

{component.description}

)}
{uptime}% uptime (90 days)
{service?.lastChecked && ( Last checked: {format(new Date(service.lastChecked), 'HH:mm:ss')} )}
{getStatusBadge(status)}
{component.service_id && (
90-day uptime history
)}
); })}
); };