feat: migrate dashboard live logs to Server-Sent Events (SSE)

This commit is contained in:
2026-04-08 00:30:31 -04:00
parent 6e19848723
commit c544964f57
3 changed files with 124 additions and 4 deletions

View File

@@ -47,9 +47,43 @@ const Dashboard: React.FC<DashboardProps> = ({ searchQuery }) => {
};
useEffect(() => {
// Initial fetch to populate UI immediately
fetchData();
const interval = setInterval(fetchData, 5000); // Live update every 5s
return () => clearInterval(interval);
// Setup SSE connection
const token = localStorage.getItem('token');
const baseUrl = 'http://localhost:8000/api/v1'; // Or extract from api.defaults.baseURL
let url = `${baseUrl}/stream?token=${token}`;
if (searchQuery) {
url += `&search=${encodeURIComponent(searchQuery)}`;
}
const eventSource = new EventSource(url);
eventSource.onmessage = (event) => {
try {
const payload = JSON.parse(event.data);
if (payload.type === 'logs') {
setLogs(prev => {
const newLogs = payload.data;
// Prepend new logs, keep up to 100 in UI to prevent infinite DOM growth
return [...newLogs, ...prev].slice(0, 100);
});
} else if (payload.type === 'stats') {
setStats(payload.data);
}
} catch (err) {
console.error('Failed to parse SSE payload', err);
}
};
eventSource.onerror = (err) => {
console.error('SSE connection error, attempting to reconnect...', err);
};
return () => {
eventSource.close();
};
}, [searchQuery]);
if (loading && !stats) return <div className="loader">INITIALIZING SENSORS...</div>;