Newer
Older
Nathan Marye
a validé
"use client";
import React, {useEffect, useState} from "react";
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faSpinner } from "@fortawesome/free-solid-svg-icons";
Nathan Marye
a validé
import constants from '../config.js';
Nathan Marye
a validé
import FetchService from "./help/fetch-service";
import Donut from "./components/donut-chart/donut.jsx";
import YearInput from "./components/donut-chart/year-input.jsx";
import DataForm from "./components/bar-chart/form";
import BarChart from "./components/bar-chart/chart";
import Timeseries from "./components/timeseries/timeseries.jsx";
Nathan Marye
a validé
export default function Page() {
const [donutValues, setDonutValues] = useState([]);
const [chartData, setChartData] = useState([]);
const [timeseries, setTimeseries] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [isLoadingDonut, setIsLoadingDonut] = useState(false);
const [isLoadingBarChart, setIsLoadingBarChart] = useState(false);
Nathan Marye
a validé
setIsLoadingBarChart(true);
const response = await FetchService.fetchBarChartData(formData);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
setIsLoadingBarChart(false);
const handleYearSubmit = async (year) => {
setIsLoadingDonut(true);
const response = await FetchService.getDonutContent(year);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
const data = await response.json();
setDonutValues(data);
setIsLoadingDonut(false);
}
const fetchData = async () => {
setIsLoading(true);
const formData = {
startDate: constants.initialBarChartFormData.startDate,
endDate: constants.initialBarChartFormData.endDate,
granularity: constants.initialBarChartFormData.granularity,
const year = constants.initialDonutChartYear.selectedYear;
const [timeseriesResponse, barChartResponse, donutChartResponse] = await Promise.all([
FetchService.getTimesSeries(),
FetchService.fetchBarChartData(formData),
FetchService.getDonutContent(year),
]);
if (!timeseriesResponse.ok || !barChartResponse.ok || !donutChartResponse.ok) {
throw new Error(`HTTP error!`);
}
setTimeseries(await timeseriesResponse.json());
setChartData(await barChartResponse.json());
setDonutValues(await donutChartResponse.json());
setIsLoading(false);
console.error('Error fetching data:', error);
fetchData();
Nathan Marye
a validé
return (
<>
<div className="card-container">
<div className="card">
<h3>L’évolution du prix de vente moyen du mètre carré </h3>
{isLoading? (
<FontAwesomeIcon className="spinner" icon={faSpinner} spin size="3x" />
): (
<Timeseries data={timeseries} />
)}
</div>
<div className="card">
<h3>Nombre des ventes par période</h3>
<DataForm onSubmit={handleFormSubmit}/>
{( isLoading || isLoadingBarChart )? (
<FontAwesomeIcon className="spinner" icon={faSpinner} spin size="3x" />
) : (
<BarChart data={chartData}/>
)}
<YearInput onDateChange={handleYearSubmit}/>
{(isLoading || isLoadingDonut)? (
<FontAwesomeIcon className="spinner" icon={faSpinner} spin size="3x" />
):(
<div className="donut-container">
<Donut data={donutValues} />
</div>
)}
Nathan Marye
a validé
}