import { useQuery } from "@tanstack/react-query"; import { UptimeData, Service } from "@/types/service.types"; import { uptimeService } from "@/services/uptimeService"; import { format, parseISO } from "date-fns"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { useTheme } from "@/contexts/ThemeContext"; import { Check, X, AlertTriangle, Pause } from "lucide-react"; interface ServiceUptimeHistoryProps { serviceId: string; serviceType: string; // Add service type to determine collection startDate?: Date; endDate?: Date; } export function ServiceUptimeHistory({ serviceId, serviceType, startDate = new Date(Date.now() - 24 * 60 * 60 * 1000), endDate = new Date() }: ServiceUptimeHistoryProps) { const { theme } = useTheme(); const { data: uptimeHistory, isLoading, error } = useQuery({ queryKey: ['uptimeHistory', serviceId, serviceType, startDate?.toISOString(), endDate?.toISOString()], queryFn: () => { console.log(`ServiceUptimeHistory: Fetching for service ${serviceId} of type ${serviceType}`); return uptimeService.getUptimeHistory(serviceId, 200, startDate, endDate, serviceType); }, enabled: !!serviceId && !!serviceType, refetchInterval: 5000, // Refresh UI every 5 seconds }); if (isLoading) { return (

Loading uptime history...

); } if (error) { return (

Error loading uptime history.

); } if (!uptimeHistory || uptimeHistory.length === 0) { return (

No uptime history available for the selected time period.

); } // Function to get appropriate status badge styling const getStatusBadge = (status: string) => { switch(status) { case 'up': return { variant: 'default' as const, className: 'bg-emerald-800 text-white hover:bg-emerald-700', icon: }; case 'warning': return { variant: 'outline' as const, className: 'bg-yellow-800/80 text-yellow-300 border-yellow-700 hover:bg-yellow-800', icon: }; case 'paused': return { variant: 'outline' as const, className: 'bg-gray-800/50 text-gray-400 border-gray-700 hover:bg-gray-800', icon: }; default: return { variant: 'destructive' as const, className: '', icon: }; } }; return (
Time Status Response Time {uptimeHistory.map((record) => { const statusBadge = getStatusBadge(record.status); const isResponseTimeHigh = record.responseTime >= 1000; return ( {format(parseISO(record.timestamp), 'yyyy-MM-dd HH:mm:ss')} {statusBadge.icon} {record.status === 'up' ? 'Up' : record.status === 'down' ? 'Down' : record.status === 'warning' ? 'Warning' : 'Paused'}
{record.responseTime > 0 ? ( <> {record.responseTime}ms {isResponseTimeHigh && ( )} ) : 'N/A'}
); })}
); }