import { useEffect, useState } from "react" import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, Pie, PieChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from "recharts" import MetricCard from "../components/MetricCard" import { fetchAnalyticsSummary } from "../lib/api" import { formatShortTime, titleCase } from "../lib/formatters" const CHART_COLORS = ["#38bdf8", "#f59e0b", "#f43f5e", "#22c55e", "#94a3b8", "#a855f7"] export default function Analytics() { const [analytics, setAnalytics] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState("") useEffect(() => { let active = true fetchAnalyticsSummary(120) .then((payload) => { if (active) { setAnalytics(payload) } }) .catch((requestError) => { if (active) { setError(requestError.message) } }) .finally(() => { if (active) { setLoading(false) } }) return () => { active = false } }, []) const decisionData = analytics ? Object.entries(analytics.decision_breakdown).map(([name, value]) => ({ name, value })) : [] const severityData = analytics ? Object.entries(analytics.severity_totals).map(([name, value]) => ({ name, value })) : [] const sourceData = analytics ? Object.entries(analytics.source_breakdown).map(([name, value]) => ({ name: titleCase(name), value })) : [] const defectData = analytics ? Object.entries(analytics.defect_breakdown) .map(([name, value]) => ({ name: titleCase(name), value })) .sort((left, right) => right.value - left.value) .slice(0, 6) : [] const timeline = analytics ? analytics.timeline.map((entry) => ({ ...entry, label: formatShortTime(entry.timestamp), })) : [] return (
Analytics Page
Use this page to spot recurring defects, monitor severity changes, and review how inspection results move over time.
Trend Over Time
Decision Mix
Severity Totals
Defect Types
Capture Sources
{entry.name}
{entry.value}
Monitoring Notes