/** * Controller Status Indicator * * Displays the health status of the sealed-secrets controller, * including reachability, response time, and version information. */ import { Icon } from '@iconify/react'; import { Box, Chip, Tooltip, Typography } from '@mui/material'; import React from 'react'; import { useControllerHealth } from '../hooks/useControllerHealth'; import { ControllerHealthSkeleton } from './LoadingSkeletons'; interface ControllerStatusProps { /** Whether to auto-refresh the status */ autoRefresh?: boolean; /** Refresh interval in milliseconds (default: 30000 = 30s) */ refreshIntervalMs?: number; /** Show detailed info (latency, version) */ showDetails?: boolean; } /** * Controller status indicator component */ export function ControllerStatus({ autoRefresh = false, refreshIntervalMs = 30000, showDetails = true, }: ControllerStatusProps) { const { health: status, loading } = useControllerHealth(autoRefresh, refreshIntervalMs); // Show skeleton while loading if (loading || !status) { return ; } // Build status message and icon let statusColor: 'success' | 'error' | 'warning' = 'error'; let statusIcon = 'mdi:alert-circle'; let statusLabel = 'Unreachable'; let tooltipText = status.error || 'Controller is unreachable'; if (status.healthy) { statusColor = 'success'; statusIcon = 'mdi:check-circle'; statusLabel = 'Healthy'; tooltipText = `Controller is healthy${status.version ? ` (${status.version})` : ''}`; } else if (status.reachable) { statusColor = 'warning'; statusIcon = 'mdi:alert'; statusLabel = 'Unhealthy'; tooltipText = status.error || 'Controller responded but is not healthy'; } return ( } label={statusLabel} color={statusColor} size="small" variant="outlined" /> {showDetails && status.healthy && ( <> {status.latencyMs !== undefined && ( {status.latencyMs}ms )} {status.version && ( v{status.version} )} )} ); }