const { useState: useStatusState, useEffect: useStatusEffect } = React; function SystemStatusBanner({ connected, onOpenDialog }) { const [report, setReport] = useStatusState(null); const [unavailable, setUnavailable] = useStatusState(false); const [requestError, setRequestError] = useStatusState(window._helpdeskRequestError || null); const [expanded, setExpanded] = useStatusState(false); const [checking, setChecking] = useStatusState(false); useStatusEffect(() => { let stopped = false; let busy = false; async function check() { if (busy) return; busy = true; setChecking(true); try { const fresh = await window.apiFetch("GET", "/api/system/status", undefined, false, 10000); if (!stopped) { setReport(fresh); setUnavailable(false); } } catch { if (!stopped) setUnavailable(true); } finally { busy = false; if (!stopped) setChecking(false); } } const onError = event => { setRequestError(event.detail); setExpanded(true); }; const onRecovered = () => setRequestError(null); check(); const timer = setInterval(check, 30000); window.addEventListener("helpdesk:api-error", onError); window.addEventListener("helpdesk:api-recovered", onRecovered); window.addEventListener("helpdesk:status-refresh", check); return () => { stopped = true; clearInterval(timer); window.removeEventListener("helpdesk:api-error", onError); window.removeEventListener("helpdesk:api-recovered", onRecovered); window.removeEventListener("helpdesk:status-refresh", check); }; }, []); const issues = [...(report?.issues || [])]; const notices = report?.notices || []; if (unavailable) issues.unshift({ id: "status-api", severity: "error", message: "Связь с сервером потеряна. Данные о проблемах могут быть устаревшими." }); if (!connected) issues.unshift({ id: "connection", severity: "warn", message: "Нет связи для новых сообщений. Переподключаемся; диалоги могут быть устаревшими." }); if (requestError) issues.unshift({ id: "request", severity: "error", message: requestError }); const hasErrors = issues.some(issue => issue.severity === "error"); const color = hasErrors ? "text-[rgb(var(--hd-danger-text))] bg-[#ef4444]/10 border-[#ef4444]/30" : "text-[rgb(var(--hd-amber-label))] bg-[#f59e0b]/10 border-[#f59e0b]/30"; const checkedAt = report?.checkedAt ? new Date(report.checkedAt).toLocaleTimeString("ru-RU") : null; if (!issues.length) return
{issues[0].message}
} {expanded &&