"use client"; import { useState } from "react"; import { Cell, Label, Pie, PieChart, Tooltip } from "recharts"; import { ChartConfig, ChartContainer } from "@/components/ui/chart/Chart"; import { ChartLegend } from "./shared/ChartLegend"; import { DonutDataPoint } from "./types"; interface DonutChartProps { data: DonutDataPoint[]; height?: number; innerRadius?: number; outerRadius?: number; showLegend?: boolean; centerLabel?: { value: string | number; label: string; }; } const CustomTooltip = ({ active, payload }: any) => { if (active && payload && payload.length) { const data = payload[0].payload; return (
{data.percentage}% {data.name}
{data.change !== undefined && (

{data.change > 0 ? "+" : ""} {data.change}% {" "} Since last scan

)}
); } return null; }; const CustomLegend = ({ payload }: any) => { const items = payload.map((entry: any) => ({ label: `${entry.value} (${entry.payload.percentage}%)`, color: entry.color, })); return ; }; export function DonutChart({ data, innerRadius = 80, outerRadius = 120, showLegend = true, centerLabel, }: DonutChartProps) { const [hoveredIndex, setHoveredIndex] = useState(null); const chartConfig = data.reduce( (config, item) => ({ ...config, [item.name]: { label: item.name, color: item.color, }, }), {} as ChartConfig, ); const chartData = data.map((item) => ({ name: item.name, value: item.value, fill: item.color, color: item.color, percentage: item.percentage, change: item.change, })); const legendPayload = chartData.map((entry) => ({ value: entry.name, color: entry.color, payload: { percentage: entry.percentage, }, })); return (
} /> {chartData.map((entry, index) => { const opacity = hoveredIndex === null ? 1 : hoveredIndex === index ? 1 : 0.5; return ( setHoveredIndex(index)} onMouseLeave={() => setHoveredIndex(null)} /> ); })} {centerLabel && ( {showLegend && }
); }