// Fleet Dashboard — App Shell (Acme Bank branding) function FleetApp() { const [activeView, setActiveView] = React.useState('placement'); const [syncTick, setSyncTick] = React.useState(0); const [fleetState, setFleetState] = React.useState(null); const [fetchError, setFetchError] = React.useState(false); const [isLive, setIsLive] = React.useState(false); // Poll /api/fleet-state every 5 seconds React.useEffect(() => { let cancelled = false; async function fetchState() { try { const res = await fetch('/api/fleet-state'); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data = await res.json(); if (cancelled) return; if (data.live) { setIsLive(true); setFleetState(data); setFetchError(false); } else { setIsLive(false); setFleetState(null); } } catch (e) { if (!cancelled) setFetchError(true); } } fetchState(); const iv = setInterval(fetchState, 5000); return () => { cancelled = true; clearInterval(iv); }; }, []); React.useEffect(() => { const iv = setInterval(() => setSyncTick(t => t + 1), 2000); return () => clearInterval(iv); }, []); const syncSecs = (syncTick % 5) * 2 || 2; // Resolve data: live data wins, otherwise fall back to hardcoded globals const clusters = (fleetState && fleetState.clusters) || CLUSTERS; const placement = (fleetState && fleetState.placement) || PLACEMENT; const upgrade = (fleetState && fleetState.upgrade) || UPGRADE; const fleetStats = (fleetState && fleetState.fleetStats) || FLEET_STATS; const activityFeed = (fleetState && fleetState.activityFeed) || ACTIVITY_FEED; const fleetHub = (fleetState && fleetState.fleetHub) || FLEET_HUB; const NAV_ITEMS = [ { key: 'overview', label: 'Overview' }, { key: 'placement', label: 'Placement' }, { key: 'upgrade', label: 'Upgrade Run' }, ]; const liveLabel = isLive ? 'Fleet API · Live' : `Fleet API · ${syncSecs}s ago`; return (
{/* Header */}
{/* Brand mark */}
acmebank
{/* Divider */}
{/* Section label */} Fleet Dashboard {/* Nav tabs */} {NAV_ITEMS.map(({ key, label }) => { const on = activeView === key; return (
setActiveView(key)} style={{ padding: '0 14px', height: 56, display: 'flex', alignItems: 'center', fontSize: 14, fontWeight: on ? 600 : 500, color: on ? FC.primary : FC.chromeMuted, borderBottom: on ? `2px solid ${FC.primary}` : '2px solid transparent', cursor: 'pointer', fontFamily: FC.font, }}> {label}
); })}
{/* Live indicator */}
{fetchError ? 'Fleet API · Offline' : liveLabel}
{/* User avatar */}
RK
Ravi Kumar
Platform Engineer
{/* Active View */}
{activeView === 'overview' && } {activeView === 'placement' && } {activeView === 'upgrade' && }
{/* Status Bar */}
); } Object.assign(window, { FleetApp });