import React, { useEffect, useState, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { Plug, Box, CircleCheck, CircleX, Loader2, ChevronDown, } from 'lucide-react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { ApiRespPluginSystemStatus, ApiRespBoxStatus, } from '@/app/infra/entities/api'; import { httpClient } from '@/app/infra/http/HttpClient'; function StatusDot({ ok }: { ok: boolean | null }) { if (ok === null) return ; return ok ? ( ) : ( ); } interface SystemStatusCardProps { refreshKey?: number; } export default function SystemStatusCard({ refreshKey, }: SystemStatusCardProps) { const { t } = useTranslation(); const [pluginStatus, setPluginStatus] = useState(null); const [boxStatus, setBoxStatus] = useState(null); const [loading, setLoading] = useState(true); const fetchStatus = useCallback(async (showLoading = false) => { if (showLoading) setLoading(true); try { const [plugin, box] = await Promise.all([ httpClient.getPluginSystemStatus().catch(() => null), httpClient.getBoxStatus().catch(() => null), ]); setPluginStatus(plugin); setBoxStatus(box); } finally { if (showLoading) setLoading(false); } }, []); useEffect(() => { // refreshKey changes when the user clicks "Refresh Data" fetchStatus(refreshKey === undefined); const interval = setInterval(() => fetchStatus(false), 30_000); return () => clearInterval(interval); // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetchStatus, refreshKey]); const pluginOk = pluginStatus ? pluginStatus.is_enable && pluginStatus.is_connected : null; const boxOk = boxStatus ? boxStatus.available : null; if (loading) { return ( {t('monitoring.systemStatus')}
); } return ( { if (open) fetchStatus(false); }} > {t('monitoring.systemStatus')}
{t('monitoring.pluginRuntime')}
{t('monitoring.boxRuntime')}
{/* Plugin Runtime */}
{t('monitoring.pluginRuntime')}
{pluginOk ? ( ) : ( )} {pluginOk ? t('monitoring.connected') : pluginStatus && !pluginStatus.is_enable ? t('monitoring.disabled') : t('monitoring.disconnected')}
{pluginStatus && !pluginStatus.is_enable && (

{t('monitoring.pluginDisabled')}

)} {pluginStatus && !pluginOk && pluginStatus.is_enable && pluginStatus.plugin_connector_error && pluginStatus.plugin_connector_error !== 'ok' && (

{pluginStatus.plugin_connector_error}

)}
{/* Box Runtime */}
{t('monitoring.boxRuntime')}
{boxOk ? ( ) : ( )} {boxOk ? t('monitoring.connected') : t('monitoring.disconnected')}
{boxStatus && !boxOk && boxStatus.connector_error && (

{boxStatus.connector_error}

)} {boxStatus && (
{boxStatus.backend && (

{t('monitoring.boxBackend')}:{' '} {boxStatus.backend.name}

)}

{t('monitoring.boxProfile')}:{' '} {boxStatus.profile}

{boxOk && boxStatus.active_sessions !== undefined && (

{t('monitoring.boxSandboxes')}:{' '} {boxStatus.active_sessions}

)}
)}
); }