import { useState, useRef, useCallback } from "react"; import { useTranslation } from "react-i18next"; import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip } from "recharts"; import { Eye } from "lucide-react"; import type { CategoryBreakdownItem } from "../../shared/types"; import { ChartPatternDefs, getPatternFill, PatternSwatch } from "../../utils/chartPatterns"; import ChartContextMenu from "../shared/ChartContextMenu"; interface CategoryPieChartProps { data: CategoryBreakdownItem[]; hiddenCategories: Set; onToggleHidden: (categoryName: string) => void; onShowAll: () => void; onViewDetails: (item: CategoryBreakdownItem) => void; } export default function CategoryPieChart({ data, hiddenCategories, onToggleHidden, onShowAll, onViewDetails, }: CategoryPieChartProps) { const { t } = useTranslation(); const hoveredRef = useRef(null); const [contextMenu, setContextMenu] = useState<{ x: number; y: number; item: CategoryBreakdownItem } | null>(null); const visibleData = data.filter((d) => !hiddenCategories.has(d.category_name)); const total = visibleData.reduce((sum, d) => sum + d.total, 0); const handleContextMenu = useCallback((e: React.MouseEvent) => { if (!hoveredRef.current) return; e.preventDefault(); setContextMenu({ x: e.clientX, y: e.clientY, item: hoveredRef.current }); }, []); if (data.length === 0) { return (

{t("dashboard.expensesByCategory")}

{t("dashboard.noData")}

); } return (

{t("dashboard.expensesByCategory")}

{hiddenCategories.size > 0 && (
{t("charts.hiddenCategories")}: {Array.from(hiddenCategories).map((name) => ( ))}
)}
({ color: item.category_color, index }))} /> {visibleData.map((item, index) => ( { hoveredRef.current = item; }} onMouseLeave={() => { hoveredRef.current = null; }} cursor="context-menu" /> ))} new Intl.NumberFormat("en-CA", { style: "currency", currency: "CAD" }).format(Number(value)) } contentStyle={{ backgroundColor: "var(--card)", border: "1px solid var(--border)", borderRadius: "8px", color: "var(--foreground)", }} labelStyle={{ color: "var(--foreground)" }} itemStyle={{ color: "var(--foreground)" }} />
{data.map((item, index) => { const isHidden = hiddenCategories.has(item.category_name); return ( ); })}
{contextMenu && ( onToggleHidden(contextMenu.item.category_name)} onViewDetails={() => onViewDetails(contextMenu.item)} onClose={() => setContextMenu(null)} /> )}
); }