import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Server } from 'lucide-react'; import { StatusPageComponentRecord } from '@/types/statusPageComponents.types'; import { Service, UptimeData } from '@/types/service.types'; import { UptimeHistoryRenderer } from './UptimeHistoryRenderer'; 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; }; if (components.length === 0) { return ( Services

Core Services

All core functionality

Operational

API Services

REST and GraphQL APIs

Operational

Database

Data storage and retrieval

Operational
); } return ( 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 (

{component.name}

{component.description && (

{component.description}

)} {service && (
Uptime: {uptime}% {service.responseTime > 0 && ( Response: {service.responseTime}ms )}
)}
{status === 'up' ? 'Operational' : status === 'down' ? 'Down' : status === 'paused' ? 'Paused' : 'Warning'}
{/* Individual component uptime history */} {component.service_id && ( )}
); })}
); };