import { CartesianGrid, Legend, Line, LineChart, XAxis, YAxis } from "recharts"; import { ChartContainer, ChartTooltip, ChartTooltipContent } from "../ui/chart"; import { getSubjectEmoji, getSubjectColor } from "~/lib/utils"; import type { PeriodResult, User } from "~/lib/api"; import { useEffect, useState } from "react"; export default function AverageChart({ averages, subjects, user, }: { averages: PeriodResult[]; subjects: string[]; user: User; }) { 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 (averages.length > 0) { const filteredGrades = averages.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)); } }, [averages, hiddenSubjects]); return ( } /> { 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 ); }