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

Track quality trends, decision mix, and defect patterns across saved inspections.

Use this page to spot recurring defects, monitor severity changes, and review how inspection results move over time.

{loading ? (
Loading analytics...
) : error ? (
{error}
) : ( <>

Trend Over Time

Defect volume per inspection

Decision Mix

PASS, REVIEW, and FAIL distribution

{decisionData.map((entry, index) => ( ))}

Severity Totals

Minor, moderate, and critical volume

{severityData.map((entry, index) => ( ))}

Defect Types

Most frequent defect categories

{defectData.map((entry, index) => ( ))}

Capture Sources

Which input modes are being used

{sourceData.length ? ( sourceData.map((entry, index) => (

{entry.name}

{entry.value}

)) ) : (
Source analytics will appear once reports are available.
)}

Monitoring Notes

Practical guidance for better inspection quality

Keep the steel surface centered with a top-down view for more stable live monitoring.
Use uploaded images for detailed review and save live logging for confirmed production checks.
Enable deep AI analysis only when you need slower recommendation text beyond the core inspection result.
)}
) }