'use client' import { useState } from 'react' import { LineChart, Line, XAxis, YAxis, Tooltip, Legend, ResponsiveContainer, CartesianGrid } from 'recharts' import { getTimeSeries, type TimeSeriesData } from '../../services/temporal.services' import { TAX_TYPES, YEARS, COLORS } from '../../constants' import ErrorDiv from '../molecules/ErrorDiv' import Loader from '../molecules/Loader' interface TemporalProps { regions: string[] } export default function Temporal({ regions }: TemporalProps) { // Selected tax type filter (tfpb, tfpnb, th, cfe) const [taxType, setTaxType] = useState('tfpb') // Start year for the time range const [startYear, setStartYear] = useState(2019) // End year for the time range const [endYear, setEndYear] = useState(2022) // Time series data grouped by region { region: [{year, avg_rate}] } const [data, setData] = useState(null) // API request loading state const [loading, setLoading] = useState(false) // API error message const [error, setError] = useState(null) // Regions currently selected for display (initialized from SSR props) const [selectedRegions, setSelectedRegions] = useState(regions) // Toggles a region on/off in the selection const toggleRegion = (region: string) => { setSelectedRegions(prev => (prev.includes(region) ? prev.filter(r => r !== region) : [...prev, region])) } // Fetches time series data from API for all regions with selected tax type and year range const handleSubmit = async () => { setLoading(true) setError(null) try { const result = await getTimeSeries([], taxType, startYear, endYear) setData(result) } catch (e) { setData(null) setError(e instanceof Error ? e.message : 'Une erreur est survenue') } finally { setLoading(false) } } // Regions present in API response that are also selected by the user const visibleRegions = data ? Object.keys(data).filter(r => selectedRegions.includes(r)) : [] // Pivoted data for Recharts: [{year, Bretagne: 1.2, Normandie: 1.5, ...}] const chartData = data ? YEARS.filter(y => y >= startYear && y <= endYear).map(year => { const point: Record = { year } for (const region of visibleRegions) { const entry = data[region]?.find(e => e.year === year) if (entry) point[region] = parseFloat(entry.avg_rate) } return point }) : [] return (

Taux d'imposition moyen par region

{regions.length > 0 && (
{regions.map(region => ( ))}
)} {loading && } {error && } {!loading && !error && chartData.length > 0 && ( `${v}%`} /> { if (!payload || payload.length === 0) return null return (

{label}

{[...payload].sort((a, b) => Number(b.value) - Number(a.value)).map(item => (

{item.name} : {item.value}%

))}
) }} wrapperStyle={{ zIndex: 10, pointerEvents: 'auto' }} /> {visibleRegions.map(region => ( ))}
)}
) }