import { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend, } from "recharts"; import type { Account } from "../../types/api"; interface TransactionDistributionProps { accounts: Account[]; className?: string; } interface PieDataPoint { name: string; value: number; color: string; [key: string]: string | number; } interface TooltipProps { active?: boolean; payload?: Array<{ payload: PieDataPoint; }>; } export default function TransactionDistribution({ accounts, className, }: TransactionDistributionProps) { // Helper function to get bank name from institution_id const getBankName = (institutionId: string): string => { const bankMapping: Record = { REVOLUT_REVOLT21: "Revolut", NUBANK_NUPBBR25: "Nu Pagamentos", BANCOBPI_BBPIPTPL: "Banco BPI", // TODO: Add more bank mappings as needed }; return bankMapping[institutionId] || institutionId.split("_")[0]; }; // Helper function to create display name for account const getAccountDisplayName = (account: Account): string => { const bankName = getBankName(account.institution_id); const accountName = account.name || `Account ${account.id.split("-")[1]}`; return `${bankName} - ${accountName}`; }; // Create pie chart data from account balances const pieData: PieDataPoint[] = accounts.map((account, index) => { const primaryBalance = account.balances?.[0]?.amount || 0; const colors = ["#3B82F6", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"]; return { name: getAccountDisplayName(account), value: primaryBalance, color: colors[index % colors.length], }; }); const totalBalance = pieData.reduce((sum, item) => sum + item.value, 0); if (pieData.length === 0 || totalBalance === 0) { return (

Account Distribution

No account data available
); } const CustomTooltip = ({ active, payload }: TooltipProps) => { if (active && payload && payload.length) { const data = payload[0].payload; const percentage = ((data.value / totalBalance) * 100).toFixed(1); return (

{data.name}

Balance: €{data.value.toLocaleString()}

{percentage}% of total

); } return null; }; return (

Account Balance Distribution

{pieData.map((entry, index) => ( ))} } /> ( {value} )} />
{pieData.map((item, index) => (
{item.name}
€{item.value.toLocaleString()}
))}
); }