Skip to content

Commit e8c9f63

Browse files
committed
feat: add onYearsAvailable prop to MonthlyChart and handle available years in EnergyChart
1 parent 5e0229f commit e8c9f63

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

web_viewer/fe_src/src/components/BarCharts/MonthlyChart.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import BarChart from "./BarChart";
1717

1818
interface MonthlyChartProps {
1919
year?: number;
20+
onYearsAvailable?: (years: number[]) => void;
2021
}
2122

2223
const MonthlyChart = forwardRef((props: MonthlyChartProps, ref: ForwardedRef<IFetchChart>) => {
@@ -74,6 +75,8 @@ const MonthlyChart = forwardRef((props: MonthlyChartProps, ref: ForwardedRef<IFe
7475
];
7576
}, [chartData, t]);
7677

78+
const firstYearsReported = useRef(false);
79+
7780
const fetchChart = useCallback(async () => {
7881
if (isFetchingRef.current) return;
7982
isFetchingRef.current = true;
@@ -84,13 +87,38 @@ const MonthlyChart = forwardRef((props: MonthlyChartProps, ref: ForwardedRef<IFe
8487
const res = await fetch(url);
8588
const json = await res.json();
8689
setChartData(json && json.chart ? json.chart : json || []);
90+
// report available years to parent once on first successful fetch
91+
if (
92+
!firstYearsReported.current &&
93+
json &&
94+
Array.isArray(json.years) &&
95+
json.years.length
96+
) {
97+
try {
98+
const yearsNums = json.years
99+
.map((y: unknown) => Number(y))
100+
.filter(Boolean);
101+
if (
102+
yearsNums.length &&
103+
typeof props.onYearsAvailable === "function"
104+
) {
105+
props.onYearsAvailable(
106+
yearsNums.sort((a: number, b: number) => b - a),
107+
);
108+
firstYearsReported.current = true;
109+
}
110+
} catch {
111+
// ignore parsing errors
112+
}
113+
}
87114
} catch {
88115
// swallow, component will show empty chart
89116
setChartData([]);
90117
} finally {
91118
isFetchingRef.current = false;
92119
setIsLoading(false);
93120
}
121+
// eslint-disable-next-line react-hooks/exhaustive-deps
94122
}, [year]);
95123

96124
useImperativeHandle(ref, (): IFetchChart => ({ fetchChart }));

web_viewer/fe_src/src/components/EnergyChart.tsx

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,31 +62,17 @@ function EnergyChart({ className }: IClassNameProps) {
6262
return () => document.removeEventListener('visibilitychange', handleVisibilityChange);
6363
}, []);
6464

65-
// Fetch available years from backend for Month/Year selects
66-
useEffect(() => {
67-
let mounted = true;
68-
const fetchYears = async () => {
69-
try {
70-
const res = await fetch(`${import.meta.env.VITE_API_BASE_URL}/monthly-chart`);
71-
const json = await res.json();
72-
if (!mounted) return;
73-
if (json && Array.isArray(json.years) && json.years.length) {
74-
// ensure numbers and sorted desc
75-
const ys = json.years.map((y: unknown) => Number(y)).filter(Boolean).sort((a: number, b: number) => b - a);
76-
setAvailableYears(ys);
77-
// if selectedYear not in list, set to first available
78-
if (!ys.includes(selectedYear)) {
79-
setSelectedYear(ys[0]);
80-
}
81-
}
82-
} catch {
83-
// ignore and keep fallback years
65+
const handleYearsAvailable = (yrs: number[]) => {
66+
try {
67+
const ys = yrs.map((y: unknown) => Number(y)).filter(Boolean).sort((a: number, b: number) => b - a);
68+
if (ys.length) {
69+
setAvailableYears(ys);
70+
if (!ys.includes(selectedYear)) setSelectedYear(ys[0]);
8471
}
85-
};
86-
fetchYears();
87-
return () => { mounted = false; };
88-
// eslint-disable-next-line react-hooks/exhaustive-deps
89-
}, []);
72+
} catch {
73+
// ignore
74+
}
75+
};
9076

9177
// Month select handler
9278
const handleYearChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
@@ -201,7 +187,7 @@ function EnergyChart({ className }: IClassNameProps) {
201187
)}
202188
{energyChartType === EnergyChartType.Monthly && (
203189
<Suspense fallback={<Loading />}>
204-
<MonthlyChart ref={fetchChartRef} year={selectedYear} />
190+
<MonthlyChart ref={fetchChartRef} year={selectedYear} onYearsAvailable={handleYearsAvailable} />
205191
</Suspense>
206192
)}
207193
{energyChartType === EnergyChartType.Yearly && (

0 commit comments

Comments
 (0)