import { useCallback, useEffect, useState, } from 'react'; import { Activity, AlertTriangle, BarChart3, Building2, FileCheck2, FileText, FileSpreadsheet, FilePenLine, Gauge, Hash, ImageIcon, ListChecks, Layers3, MessageSquare, Phone, RefreshCw, TrendingUp, RadioTower, ReceiptText, ClipboardList, Send, ScanSearch, Settings, Shield, ShieldOff, ShieldCheck, Users, UserX, } from 'lucide-react'; import { adminApi } from '@/api/adminApi'; import { getLastUserActivityAt, readSession, type LoginSession } from '@/api/session'; import { AppShell } from '@/layouts/AppShell'; import { PortalSessionBoundary } from '@/layouts/PortalSessionBoundary'; const EMPTY_PENDING_AUDITS = { enterpriseCertifications: 0, smsAudits: 0, templates: 0, signatures: 0, drainageInfos: 0 }; export function AdminLayout() { return {(session) => }; } function AdminAuthenticatedLayout({ session }: { session: LoginSession }) { const [pendingAudits, setPendingAudits] = useState(EMPTY_PENDING_AUDITS); const [sessionLocked, setSessionLocked] = useState(Boolean(session.locked)); const loadPendingAuditCount = useCallback(() => { const currentSession = readSession('admin'); if (!currentSession || currentSession.locked || Date.now() - getLastUserActivityAt() >= currentSession.idleTimeoutSeconds * 1000) { return; } // This runs globally and on a timer, so it must not fan out through the full dashboard aggregation. adminApi.getPendingAudits() .then((counts) => { setPendingAudits(counts); }) .catch(() => { setPendingAudits(EMPTY_PENDING_AUDITS); }); }, []); useEffect(() => { if (session.portal !== 'admin' || sessionLocked) { return; } loadPendingAuditCount(); const timer = window.setInterval(loadPendingAuditCount, 30000); const onFocus = () => loadPendingAuditCount(); const onAuditRefresh = () => loadPendingAuditCount(); window.addEventListener('focus', onFocus); window.addEventListener('cmpp-audit-count-refresh', onAuditRefresh); return () => { window.clearInterval(timer); window.removeEventListener('focus', onFocus); window.removeEventListener('cmpp-audit-count-refresh', onAuditRefresh); }; }, [loadPendingAuditCount, session.portal, sessionLocked]); return ( ); }