'use client'; import type { CSSProperties } from 'react'; import { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts'; import type { TodayChartBucket } from '@/types/today'; import { TodayChartFrame } from '@/components/today/TodayChartFrame'; import { TODAY_CHART_COLORS, TODAY_CHART_TOOLTIP_STYLE, } from '@/components/today/chart-theme'; interface TodayDonutChartProps { data: TodayChartBucket[]; labelForCode: (code: string) => string; colorForCode?: (code: string, index: number) => string; swatchStyleForCode?: (code: string, index: number) => CSSProperties; variant?: 'donut' | 'pie'; sideLegend?: boolean; } export function TodayDonutChart({ data, labelForCode, colorForCode, swatchStyleForCode, variant = 'donut', sideLegend = false, }: TodayDonutChartProps) { const chartData = data.map((item) => ({ ...item, displayLabel: labelForCode(item.code), })); const resolveColor = (code: string, index: number) => colorForCode?.(code, index) ?? TODAY_CHART_COLORS[index % TODAY_CHART_COLORS.length]; const resolveSwatchStyle = (code: string, index: number): CSSProperties => swatchStyleForCode?.(code, index) ?? { backgroundColor: resolveColor(code, index), borderColor: 'rgba(0, 0, 0, 0.18)', }; const innerRadius = variant === 'pie' ? 0 : 62; const outerRadius = sideLegend ? 100 : 92; const chart = ( {chartData.map((entry, index) => ( ))} { const row = item?.payload as TodayChartBucket | undefined; return [value, row ? labelForCode(row.code) : '']; }} /> ); if (!sideLegend) { return chart; } const rowClass = 'flex h-4 items-center text-xs leading-none'; const legendInset = 'px-12'; return (
{chartData.map((entry, index) => ( ))}
{chartData.map((entry) => ( {entry.displayLabel} ))}
{chartData.map((entry) => ( {entry.count} ))}
{chartData.map((entry, index) => ( ))} { const row = item?.payload as TodayChartBucket | undefined; return [value, row ? labelForCode(row.code) : '']; }} />
); }