import React, { useState, useEffect } from 'react' import { DateTime } from 'luxon' import { IConsumptionDataManager, IDataload, IChartData, ChartData, TimeStep, ITimePeriod, } from 'services/dataConsumptionContracts' import { defineTimePeriod } from 'services/dateChartService' import { FluidType } from 'enum/fluid.enum' import BarChart from 'components/ContentComponents/Charts/BarChart' interface FluidChartSlideProps { index: number fluidTypes: FluidType[] timeStep: TimeStep multiFluid: boolean referenceDate: DateTime selectedDate: DateTime showCompare: boolean width: number height: number challengePeriod: ITimePeriod | null handleClickData: ( dataload: IDataload, compareDataload: IDataload | null ) => void consumptionDataManager: IConsumptionDataManager } const FluidChartSlide: React.FC<FluidChartSlideProps> = ({ index, fluidTypes, timeStep, multiFluid, referenceDate, selectedDate, showCompare, width, height, challengePeriod, handleClickData, consumptionDataManager, }: FluidChartSlideProps) => { const [chartData, setChartData] = useState<IChartData>(new ChartData([])) const [isLoaded, setIsLoaded] = useState<boolean>(false) useEffect(() => { let subscribed = true async function loadData() { const [timePeriod, compareTimePeriod] = await Promise.all([ defineTimePeriod(referenceDate, timeStep, index), defineTimePeriod(referenceDate, timeStep, index + 1), ]) const graphData = await consumptionDataManager.getGraphData( timePeriod, timeStep, fluidTypes, compareTimePeriod ) if (subscribed && graphData && graphData.actualData.length > 0) { setChartData(graphData) setIsLoaded(true) } } setIsLoaded(false) loadData() return () => { subscribed = false } }, [timeStep, fluidTypes]) return ( <div className="fs-slide"> {!isLoaded ? null : ( <BarChart chartData={chartData} fluidTypes={fluidTypes} timeStep={timeStep} multiFluid={multiFluid} selectedDate={selectedDate} showCompare={showCompare} handleClickData={handleClickData} height={height} width={width} challengePeriod={challengePeriod} /> )} </div> ) } export default FluidChartSlide