import React, { useMemo, useRef, useEffect, useState } from "react"; import { RegionalDistributionPoint } from "../../../models/RegionalDistribution"; import { WIDTH, HEIGHT, MARGIN, colorForRegion } from "./circulardiagram.utils"; import * as d3 from 'd3'; export type HoverPoint = { regionName: string, collectedVolume: number; }; type Props = { raw: RegionalDistributionPoint[]; }; export const CircularDiagramChart: React.FC = ({ raw, }) => { const [hover, setHover] = useState(null); const innerW = WIDTH - MARGIN.left - MARGIN.right; const innerH = HEIGHT - MARGIN.top - MARGIN.bottom; const radius = Math.min(innerW, innerH) / 2; const pieData = useMemo(() => { const pieGenerator = d3.pie() .value((d) => d.collectedVolume) .sort(null); return pieGenerator(raw); }, [raw]); const arcGenerator = d3.arc>() .innerRadius(radius * 0.6) .outerRadius(radius); return (
{pieData.map((slice, i) => { const [x, y] = arcGenerator.centroid(slice); return ( setHover(slice.data)} onMouseLeave={() => setHover(null)} stroke="#fff" strokeWidth="2" style={{ opacity: hover === null || hover.regionName === slice.data.regionName ? 1 : 0.6, transition: 'opacity 0.2s', cursor: 'pointer' }} /> ); })} {hover && ( {hover.regionName} {hover.collectedVolume.toLocaleString()} )}
); };