Newer
Older
import React, { useEffect, useMemo, useState } from "react";
import { getRegionEvolution, RegionEvolutionParams, TaxType } from "../../../api/stats";
import { RegionEvolutionPoint } from "../../../models/RegionEvolution";
import { groupByRegion } from "./timeseries.utils";
import { TimeSeriesControls } from "./TimeSeriesControls";
import { TimeSeriesChart, HoverPoint } from "./TimeSeriesChart";
import { TimeSeriesDetails } from "./TimeSeriesDetails";
Matthias BIZET
a validé
import "./../../utils/Chart.css";
const USE_MOCK_DATA = false;
const TimeSeries: React.FC = () => {
const [raw, setRaw] = useState<RegionEvolutionPoint[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
// Filters
const [selectedTax, setSelectedTax] = useState<TaxType>("tfpb");
const [startYear, setStartYear] = useState<number>(2019);
const [endYear, setEndYear] = useState<number>(2022);
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const [selectedRegion, setSelectedRegion] = useState<string | null>(null);
useEffect(() => {
let cancelled = false;
async function load() {
try {
setLoading(true);
setError(null);
if (USE_MOCK_DATA) {
if (!cancelled) setRaw([]);
} else {
const params: RegionEvolutionParams = { tax: selectedTax, startYear, endYear };
const res = await getRegionEvolution(params);
if (!cancelled) setRaw(res.member);
}
} catch (e: any) {
if (!cancelled) setError(e.message ?? "Erreur API");
} finally {
if (!cancelled) setLoading(false);
}
}
load();
return () => {
cancelled = true;
};
}, [selectedTax, startYear, endYear]);
const series = useMemo(() => groupByRegion(raw), [raw]);
if (loading) return <p className="loading-message">Chargement…</p>;
if (error) return <p className="error-message">Erreur : {error}</p>;
if (raw.length === 0) return <p className="no-data-message">Aucune donnée.</p>;
Matthias BIZET
a validé
const detailsRegion = selectedRegion;
const regionDetails = detailsRegion ? series.get(detailsRegion) : null;
return (
Matthias BIZET
a validé
<div className="container">
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<TimeSeriesControls
selectedTax={selectedTax}
startYear={startYear}
endYear={endYear}
onTaxChange={(t) => {
setSelectedTax(t);
setSelectedRegion(null);
}}
onStartYearChange={(y) => setStartYear(y)}
onEndYearChange={(y) => setEndYear(y)}
/>
<div className="chart-and-details">
<TimeSeriesChart
raw={raw}
series={series}
selectedRegion={selectedRegion}
onSelectRegion={(region) => setSelectedRegion(region)}
/>
{regionDetails && detailsRegion && (
<TimeSeriesDetails
regionName={detailsRegion}
regionDetails={regionDetails}
showClose={!!selectedRegion}
onClose={() => setSelectedRegion(null)}
/>
)}
</div>
</div>
);
};
export default TimeSeries;