import { CartesianGrid, Legend, Line, LineChart, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart, ResponsiveContainer, XAxis, YAxis, } from "recharts"; import { useAverages, useGrades, type User } from "~/lib/api"; import { ChartContainer, ChartTooltip, ChartTooltipContent } from "../ui/chart"; import { Award } from "lucide-react"; import { getSubjectColor, getSubjectEmoji } from "~/lib/utils"; import { useEffect, useState } from "react"; import { Tabs, TabsList, tabsStyle, TabsTrigger } from "../ui/tabs"; const periods = [ { id: "YEAR", label: "Cette année", }, { id: "TRIMESTER", label: "Ce trimestre", }, { id: "MONTH", label: "Ce mois", }, ]; export default function GradesPage({ user }: { user: User }) { const [period, setPeriod] = useState(periods[0].id); const { grades, subjects, isLoading, isError } = useGrades(period); const { subjectAverages, globalAverage, isLoading: loading, isError: error, } = useAverages(period); const [hiddenSubjects, setHiddenSubjects] = useState([]); const toggleSubjectVisibility = (subject: string) => { setHiddenSubjects((prev) => prev.includes(subject) ? prev.filter((s) => s !== subject) : [...prev, subject] ); }; const [min, setMin] = useState(0); const [max, setMax] = useState(20); useEffect(() => { if (grades.length > 0) { const filteredGrades = grades.map((o) => Object.entries(o) .filter(([key, value]) => { return !hiddenSubjects.includes(key) && !isNaN(parseFloat(value)); }) .map(([_, v]) => parseFloat(v)) .filter(Boolean) ); setMin(getMin(filteredGrades)); setMax(getMax(filteredGrades)); } }, [grades, hiddenSubjects]); return (
{/* Tabs */} {periods.map((period) => ( {period.label} ))} {isNaN(globalAverage) ? (
Aucune note disponible pour cette période.
) : isLoading || loading ? (
Chargement...
) : isError || error ? (
Une erreur est survenue lors de la récupération des données.
) : ( <> {/* Global average */}
Moyenne générale
{globalAverage} / 20
{/* Charts - Mobile First Layout */}
{/* Grade Trends */}

Votre progression

Suivez vos notes au fil du temps

} /> { if (e.dataKey) { toggleSubjectVisibility(e.dataKey as string); } }} /> {subjects.map((subject, index) => ( ))}
{/* Radar chart */}

Vos points forts

Visualisez vos performances par matière

} />
)}
); } function getMin(grades: number[][]) { return Math.max( Math.round( Math.min(...grades.map((g) => Math.min(...g)).filter(Boolean)) - 1 ), 0 ); } function getMax(grades: number[][]) { return Math.min( Math.round( Math.max(...grades.map((g) => Math.max(...g)).filter(Boolean)) + 1 ), 20 ); }