// Analytics Page Component const AnalyticsPage = () => { const { Box, Typography, Card, CardContent, Button } = MaterialUI; // --- State for counts and refresh logic --- const [getCounts, setGetCounts] = React.useState({ GET: { sinceRestart: 0, pastHour: 0, past10min: 0 }, POST: { sinceRestart: 0, pastHour: 0, past10min: 0 }, OTHER: { sinceRestart: 0, pastHour: 0, past10min: 0 } }); const [lastUpdated, setLastUpdated] = React.useState(new Date().toLocaleTimeString()); const [uptimeMs, setUptimeMs] = React.useState(0); const uptimeRef = React.useRef(0); // Helper to map API keys to table keys function mapApiToTable(apiData) { return { GET: { sinceRestart: apiData.GET?.total ?? 0, pastHour: apiData.GET?.['1hr'] ?? 0, past10min: apiData.GET?.['10min'] ?? 0 }, POST: { sinceRestart: apiData.POST?.total ?? 0, pastHour: apiData.POST?.['1hr'] ?? 0, past10min: apiData.POST?.['10min'] ?? 0 }, OTHER: { sinceRestart: apiData.OTHER?.total ?? 0, pastHour: apiData.OTHER?.['1hr'] ?? 0, past10min: apiData.OTHER?.['10min'] ?? 0 } }; } // Fetch stats every 20s, but update uptime locally every second React.useEffect(() => { let uptimeInterval; async function fetchStats() { try { const res = await fetch('/data/analytics/stats'); if (!res.ok) throw new Error('Failed to fetch analytics stats'); const data = await res.json(); setGetCounts(mapApiToTable(data)); setUptimeMs(data.uptime_ms ?? 0); uptimeRef.current = data.uptime_ms ?? 0; setLastUpdated(new Date().toLocaleTimeString()); } catch (e) { // Optionally handle error } } fetchStats(); const statsInterval = setInterval(fetchStats, 20000); // 20 seconds // Local uptime increment every second uptimeInterval = setInterval(() => { setUptimeMs(prev => prev + 1000); }, 1000); return () => { clearInterval(statsInterval); clearInterval(uptimeInterval); }; }, []); // Helper to format uptime in d h m s function formatUptime(ms) { const sec = Math.floor(ms / 1000) % 60; const min = Math.floor(ms / 1000 / 60) % 60; const hr = Math.floor(ms / 1000 / 60 / 60) % 24; const day = Math.floor(ms / 1000 / 60 / 60 / 24); return `${day}d ${hr}h ${min}m ${sec}s`; } return ( Server Analytics Uptime {formatUptime(uptimeMs)} Requests
Restart Hour 10 Min
GET {getCounts.GET.sinceRestart} {getCounts.GET.pastHour} {getCounts.GET.past10min}
POST {getCounts.POST.sinceRestart} {getCounts.POST.pastHour} {getCounts.POST.past10min}
OTHER {getCounts.OTHER.sinceRestart} {getCounts.OTHER.pastHour} {getCounts.OTHER.past10min}
Last updated: {lastUpdated}
); }; // Make component available globally window.AnalyticsPage = AnalyticsPage;