import { CartesianGrid, Legend, Line, LineChart, 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"; export default function GradesPage({ user }: { user: User }) { // TODO: Error handling, loading state const { grades, subjects, isLoading, isError } = useGrades("YEAR"); const { subjectAverages, globalAverage, isLoading: loading, isError: error, } = useAverages("YEAR"); 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 */} {/* Global average */}
Moyenne générale
{globalAverage} / 20
{/* Charts - Mobile First Layout */}
{/* Grade Trends */}

Votre progression

Suivez vos notes au fil du temps

{/* TODO: Custom domain */} } /> { if (e.dataKey) { toggleSubjectVisibility(e.dataKey as string); } }} /> {subjects.map((subject, index) => ( ))}
); } 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 ); }