mirror of
https://wget.la/https://github.com/leookun/cursor-byok
synced 2026-10-06 13:44:21 +08:00
39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import { BarChart, LineChart } from "echarts/charts";
|
|
import { GridComponent, LegendComponent, MarkLineComponent, TooltipComponent } from "echarts/components";
|
|
import { getInstanceByDom, init, use, type EChartsCoreOption } from "echarts/core";
|
|
import { CanvasRenderer } from "echarts/renderers";
|
|
import { useEffect, useRef, type MouseEventHandler } from "react";
|
|
import styles from "./EChart.module.scss";
|
|
|
|
use([BarChart, LineChart, GridComponent, LegendComponent, MarkLineComponent, TooltipComponent, CanvasRenderer]);
|
|
|
|
type EChartProps = {
|
|
option: EChartsCoreOption;
|
|
className?: string;
|
|
onMouseEnter?: MouseEventHandler<HTMLDivElement>;
|
|
onMouseLeave?: MouseEventHandler<HTMLDivElement>;
|
|
};
|
|
|
|
export function EChart({ option, className = styles.root, onMouseEnter, onMouseLeave }: EChartProps) {
|
|
const element = useRef<HTMLDivElement>(null);
|
|
|
|
useEffect(() => {
|
|
const node = element.current;
|
|
if (!node) return;
|
|
const chart = init(node, undefined, { renderer: "canvas" });
|
|
const observer = new ResizeObserver(() => chart.resize());
|
|
observer.observe(node);
|
|
return () => {
|
|
observer.disconnect();
|
|
chart.dispose();
|
|
};
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
const node = element.current;
|
|
if (node) getInstanceByDom(node)?.setOption(option, { notMerge: true });
|
|
}, [option]);
|
|
|
|
return <div ref={element} className={className} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} />;
|
|
}
|