"use client"; import { useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { ChevronDown, ChevronUp } from "lucide-react"; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, Legend, } from "recharts"; import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "@/components/ui/collapsible"; interface MonthlyChartData { month: string; revenus: number; depenses: number; solde: number; } interface MonthlyChartProps { data: MonthlyChartData[]; formatCurrency: (amount: number) => string; collapsible?: boolean; defaultExpanded?: boolean; showDots?: boolean; } export function MonthlyChart({ data, formatCurrency, collapsible = false, defaultExpanded = true, showDots = true, }: MonthlyChartProps) { const [isExpanded, setIsExpanded] = useState(defaultExpanded); // Calculer l'intervalle dynamiquement selon le nombre de données const getXAxisInterval = () => { if (data.length <= 6) return 0; // Afficher tous les labels pour 6 mois ou moins if (data.length <= 12) return 1; // Afficher un label sur deux pour 7-12 mois return Math.floor(data.length / 12); // Pour plus de 12 mois, afficher environ 12 labels }; // Formater les labels de manière plus compacte const formatMonthLabel = (month: string) => { // Format: "janv. 24" -> "janv 24" (enlever le point) return month.replace('.', ''); }; const chartContent = ( <> {data.length > 0 ? (
6 ? 80 : 60 }}> 6 ? -45 : 0} textAnchor={data.length > 6 ? "end" : "middle"} height={data.length > 6 ? 80 : 60} interval={getXAxisInterval()} tickFormatter={formatMonthLabel} tick={{ fontSize: 11 }} /> { // Format compact pour les grandes valeurs if (Math.abs(v) >= 1000) { return `${(v / 1000).toFixed(1)}k€`; } return `${v.toFixed(0)}€`; }} tick={{ fill: "var(--muted-foreground)" }} /> formatCurrency(value)} labelFormatter={(label) => label} contentStyle={{ backgroundColor: "var(--card)", border: "1px solid var(--border)", borderRadius: "8px", }} />
) : (
Pas de données pour cette période
)} ); if (!collapsible) { return ( Revenus vs Dépenses par mois {chartContent} ); } return ( Revenus vs Dépenses par mois {chartContent} ); }