/** * Simple Pie Chart Component * Lightweight pie/donut chart for displaying proportions */ import React from "react"; import { __ } from "../../lib/i18n"; interface PieData { label: string; value: number; color: string; } interface SimplePieChartProps { data: PieData[]; title: string; size?: number; showLegend?: boolean; donut?: boolean; } /** * Simple Pie Chart Component */ export const SimplePieChart: React.FC = ({ data, title, size = 200, showLegend = true, donut = false, }) => { if (!data || data.length === 0) { return (
{__("No data available", "yatra")}
); } const total = data.reduce((sum, item) => sum + item.value, 0); if (total <= 0) { return (
{__("No data available", "yatra")}
); } const center = size / 2; const radius = donut ? size / 3 : size / 2 - 10; const innerRadius = donut ? size / 4 : 0; let currentAngle = -90; // Start from top const paths = data.map((item) => { const percentage = (item.value / total) * 100; const angle = (item.value / total) * 360; const startAngle = currentAngle; const endAngle = currentAngle + angle; // Calculate arc path const startX = center + radius * Math.cos((startAngle * Math.PI) / 180); const startY = center + radius * Math.sin((startAngle * Math.PI) / 180); const endX = center + radius * Math.cos((endAngle * Math.PI) / 180); const endY = center + radius * Math.sin((endAngle * Math.PI) / 180); const largeArcFlag = angle > 180 ? 1 : 0; let pathData = ""; if (donut && innerRadius > 0) { // Donut chart const innerStartX = center + innerRadius * Math.cos((startAngle * Math.PI) / 180); const innerStartY = center + innerRadius * Math.sin((startAngle * Math.PI) / 180); const innerEndX = center + innerRadius * Math.cos((endAngle * Math.PI) / 180); const innerEndY = center + innerRadius * Math.sin((endAngle * Math.PI) / 180); pathData = `M ${startX} ${startY} A ${radius} ${radius} 0 ${largeArcFlag} 1 ${endX} ${endY} L ${innerEndX} ${innerEndY} A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${innerStartX} ${innerStartY} Z`; } else { // Regular pie chart pathData = `M ${center} ${center} L ${startX} ${startY} A ${radius} ${radius} 0 ${largeArcFlag} 1 ${endX} ${endY} Z`; } currentAngle += angle; return { path: pathData, color: item.color, label: item.label, value: item.value, percentage: percentage.toFixed(1), }; }); return (
{title && (

{title}

)}
{paths.map((path, index) => ( {`${path.label}: ${path.value} (${path.percentage}%)`} ))} {showLegend && (
{paths.map((path, index) => (
{path.label} {path.percentage}%
))}
)}
); }; export default SimplePieChart;