Files
lara-bermite/resources/js/components/rainfall/RainFallEcharts.tsx
2025-10-08 11:35:48 +02:00

120 lines
3.2 KiB
TypeScript

import React, {FC, useEffect, useRef, useState} from "react"
import {rainfallGraphData} from "../../types"
import {init, getInstanceByDom} from 'echarts'
import type {ECharts } from "echarts"
const RainFallEcharts: FC<RainFallEchartsProps> = ({width, height, data, loading}) => {
// https://dev.to/manufac/using-apache-echarts-with-react-and-typescript-353k
const chartRef = useRef<HTMLDivElement>(null)
const [option, setOption] = useState({
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
label: {
show: true,
},
xAxis: [
{
type: 'category',
data: data.map(d => d.label),
axisTick: {
alignWithLabel: true
}
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: 'Pluviométrie',
type: 'bar',
color: ['steelblue'],
barWidth: '80%',
data: data.map(d => d.value)
}
]
})
useEffect(() => {
let chart: ECharts | undefined
if (chartRef.current !== null) {
chart = init(chartRef.current)
}
function resizeChart() {
chart?.resize()
}
window.addEventListener("resize", resizeChart)
return () => {
chart?.dispose()
window.removeEventListener("resize", resizeChart)
}
}, [])
useEffect(() => {
if (chartRef.current !== null) {
const chart = getInstanceByDom(chartRef.current)
chart?.setOption(option)
}
}, [option, data])
useEffect(() => {
setOption({...option,
xAxis: [
{
type: 'category',
data: data.map(d => d.label),
axisTick: {
alignWithLabel: true
}
}
],
series: [
{
name: 'Pluviométrie',
type: 'bar',
color: ['steelblue'],
barWidth: '80%',
data: data.map(d => d.value)
}
]
})
}, [data])
useEffect(() => {
if (chartRef.current !== null) {
const chart = getInstanceByDom(chartRef.current)
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
loading === true ? chart?.showLoading() : chart?.hideLoading()
}
}, [loading])
return <div className="relative">
<div ref={chartRef} style={{width: "100%", height}} />
<div id="tooltip" className="absolute left-10 top-3 rounded border p-2" style={{opacity: 0}}></div>
</div>
}
export default RainFallEcharts
interface RainFallEchartsProps {
width: number,
height: number,
data: rainfallGraphData[],
loading: boolean,
}