import React, { useState, useEffect, useCallback } from 'react'; import { apiService } from './services/api'; import { formatNumber, getRiskLevel, formatTime, getDeviceInfo, getProgressBarStyle } from './utils/formatters'; import HelpModal from './components/HelpModal'; import RiskCard from './components/RiskCard'; import EvidenceCard from './components/EvidenceCard'; import DeviceTrustCard from './components/DeviceTrustCard'; import HeuristicsCard from './components/HeuristicsCard'; import MlModelCard from './components/MlModelCard'; import MachinesCard from './components/MachinesCard'; import RiskHistoryCard from './components/RiskHistoryCard'; import Controls from './components/Controls'; function App() { const [data, setData] = useState({ riskAssessment: null, riskHistory: [], modelMeta: null, trustedDevices: [], machines: [], }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showHelp, setShowHelp] = useState(false); const [lastUpdate, setLastUpdate] = useState(null); // Fetch all data const fetchAllData = useCallback(async () => { try { setError(null); const [riskAssessment, riskHistory, modelMeta, trustedDevices, machines] = await Promise.all([ apiService.getRiskAssessment('demo-machine').catch(() => null), apiService.getRiskHistory('demo-machine', 20).catch(() => []), apiService.getModelMeta().catch(() => null), apiService.getTrustedDevices().catch(() => []), apiService.getMachines().catch(() => []), ]); setData({ riskAssessment, riskHistory, modelMeta, trustedDevices, machines, }); setLastUpdate(new Date()); } catch (err) { setError(err.message); console.error('Failed to fetch data:', err); } }, []); // Auto-refresh every 2 seconds useEffect(() => { fetchAllData(); const interval = setInterval(fetchAllData, 2000); return () => clearInterval(interval); }, [fetchAllData]); // Handle demo actions const handleSeedDemo = async () => { setLoading(true); try { await apiService.seedDemo(); await fetchAllData(); // Refresh data after seeding } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleClearDemo = async () => { setLoading(true); try { await apiService.clearDemo(); await fetchAllData(); // Refresh data after clearing } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleEvictStale = async () => { setLoading(true); try { await apiService.evictStale(); await fetchAllData(); // Refresh data after evicting } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleRefreshModel = async () => { setLoading(true); try { await fetchAllData(); // Refresh all data including model info } catch (err) { setError(err.message); } finally { setLoading(false); } }; if (error) { return (

⚠️ Error

{error}

); } return (
setShowHelp(true)} /> setShowHelp(true)} /> setShowHelp(true)} /> setShowHelp(true)} /> setShowHelp(true)} loading={loading} /> setShowHelp(true)} /> setShowHelp(true)} /> setShowHelp(true)} /> {lastUpdate && (
Last updated: {formatTime(lastUpdate)}
)} setShowHelp(false)} />
); } export default App;