"use client" import { useState, useEffect } from "react" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Loader2, CheckCircle2, AlertTriangle, XCircle, Activity } from "lucide-react" interface HealthDetail { status: string reason?: string [key: string]: any } interface HealthDetails { overall: string summary: string details: { [category: string]: HealthDetail | { [key: string]: HealthDetail } } timestamp: string } interface HealthStatusModalProps { open: boolean onOpenChange: (open: boolean) => void getApiUrl: (path: string) => string } export function HealthStatusModal({ open, onOpenChange, getApiUrl }: HealthStatusModalProps) { const [loading, setLoading] = useState(true) const [healthData, setHealthData] = useState(null) const [error, setError] = useState(null) useEffect(() => { if (open) { fetchHealthDetails() } }, [open]) const fetchHealthDetails = async () => { setLoading(true) setError(null) try { const response = await fetch(getApiUrl("/api/health/details")) if (!response.ok) { throw new Error("Failed to fetch health details") } const data = await response.json() console.log("[v0] Health data received:", data) setHealthData(data) } catch (err) { console.error("[v0] Error fetching health data:", err) setError(err instanceof Error ? err.message : "Unknown error") } finally { setLoading(false) } } const getHealthStats = () => { if (!healthData?.details) { return { total: 0, healthy: 0, warnings: 0, critical: 0 } } let healthy = 0 let warnings = 0 let critical = 0 let total = 0 const countStatus = (detail: any) => { if (detail && typeof detail === "object" && detail.status) { total++ const status = detail.status.toUpperCase() if (status === "OK") healthy++ else if (status === "WARNING") warnings++ else if (status === "CRITICAL") critical++ } } Object.values(healthData.details).forEach((categoryData) => { if (categoryData && typeof categoryData === "object") { if ("status" in categoryData) { countStatus(categoryData) } else { Object.values(categoryData).forEach(countStatus) } } }) return { total, healthy, warnings, critical } } const getGroupedChecks = () => { if (!healthData?.details) return {} const grouped: { [key: string]: Array<{ name: string; status: string; reason?: string; details?: any }> } = {} Object.entries(healthData.details).forEach(([category, categoryData]) => { if (!categoryData || typeof categoryData !== "object") return const categoryName = category.charAt(0).toUpperCase() + category.slice(1) grouped[categoryName] = [] if ("status" in categoryData) { grouped[categoryName].push({ name: categoryName, status: categoryData.status, reason: categoryData.reason, details: categoryData, }) } else { Object.entries(categoryData).forEach(([subKey, subData]: [string, any]) => { if (subData && typeof subData === "object" && "status" in subData) { grouped[categoryName].push({ name: subKey, status: subData.status, reason: subData.reason, details: subData, }) } }) } }) return grouped } const getStatusIcon = (status: string) => { const statusUpper = status?.toUpperCase() switch (statusUpper) { case "OK": return case "WARNING": return case "CRITICAL": return default: return } } const getStatusBadge = (status: string) => { const statusUpper = status?.toUpperCase() switch (statusUpper) { case "OK": return Healthy case "WARNING": return Warning case "CRITICAL": return Critical default: return Unknown } } const stats = getHealthStats() const groupedChecks = getGroupedChecks() return ( System Health Status Detailed health checks for all system components {loading && (
)} {error && (

Error loading health status

{error}

)} {healthData && !loading && (
{/* Overall Status Summary */} Overall Status {getStatusBadge(healthData.overall)} {healthData.summary &&

{healthData.summary}

}
{stats.total}
Total Checks
{stats.healthy}
Healthy
{stats.warnings}
Warnings
{stats.critical}
Critical
{/* Grouped Health Checks */} {Object.entries(groupedChecks).map(([category, checks]) => ( {category}
{checks.map((check, index) => (
{getStatusIcon(check.status)}

{check.name}

{check.status}
{check.reason &&

{check.reason}

} {check.details && (
{Object.entries(check.details).map(([key, value]) => { if (key === "status" || key === "reason" || typeof value === "object") return null return (
{key}: {String(value)}
) })}
)}
))}
))} {healthData.timestamp && (
Last updated: {new Date(healthData.timestamp).toLocaleString()}
)}
)}
) }