import type { Chart, ChartData, ChartDataset, ChartOptions } from 'chart.js'; import { keys, values } from 'ramda'; import type { FC } from 'react'; import { memo, useState } from 'react'; import { Doughnut } from 'react-chartjs-2'; import { renderPieChartLabel } from '../../utils/helpers/charts'; import { isDarkThemeEnabled, PRIMARY_DARK_COLOR, PRIMARY_LIGHT_COLOR } from '../../utils/theme'; import type { Stats } from '../types'; import { DoughnutChartLegend } from './DoughnutChartLegend'; interface DoughnutChartProps { stats: Stats; } const generateChartDatasets = (data: number[]): ChartDataset[] => [ { data, backgroundColor: [ '#97BBCD', '#F7464A', '#46BFBD', '#FDB45C', '#949FB1', '#57A773', '#414066', '#08B2E3', '#B6C454', '#DCDCDC', '#463730', ], borderColor: isDarkThemeEnabled() ? PRIMARY_DARK_COLOR : PRIMARY_LIGHT_COLOR, borderWidth: 2, }, ]; const generateChartData = (labels: string[], data: number[]): ChartData => ({ labels, datasets: generateChartDatasets(data), }); export const DoughnutChart: FC = memo(({ stats }) => { const [chartRef, setChartRef] = useState(); // Cannot use useRef here const labels = keys(stats); const data = values(stats); const options: ChartOptions = { plugins: { legend: { display: false }, tooltip: { intersect: true, callbacks: { label: renderPieChartLabel }, }, }, }; const chartData = generateChartData(labels, data); return (
{ setChartRef(element ?? undefined); }} />
{chartRef && }
); });