import React, { useMemo } from 'react'; import { Balance, Operation, OperationType } from '../types'; interface BalanceCardProps { balance: Balance; operations: Operation[]; isSelected: boolean; onClick: () => void; onEdit: (balance: Balance) => void; onDelete: (balanceId: string) => void; } const BalanceCard: React.FC = ({ balance, operations, isSelected, onClick, onEdit, onDelete }) => { const { totalIncome, totalExpenses, currentBalance } = useMemo(() => { const totalIncome = operations .filter(op => op.type === OperationType.INCOME) .reduce((sum, op) => sum + op.amount, 0); const totalExpenses = operations .filter(op => op.type === OperationType.EXPENSE) .reduce((sum, op) => sum + op.amount, 0); const currentBalance = balance.initialAmount + totalIncome - totalExpenses; return { totalIncome, totalExpenses, currentBalance }; }, [balance, operations]); const formatCurrency = (amount: number) => { return new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' }).format(amount); }; const [openMenu, setOpenMenu] = React.useState(false); const menuRef = React.useRef(null); const [menuPosition, setMenuPosition] = React.useState<{ top: number; left: number } | null>(null); React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setOpenMenu(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const toggleMenu = (e: React.MouseEvent) => { e.stopPropagation(); if (openMenu) { setOpenMenu(false); return; } const rect = e.currentTarget.getBoundingClientRect(); setMenuPosition({ top: rect.bottom, left: rect.right - 128, }); setOpenMenu(true); }; return (

{balance.name}

{formatCurrency(currentBalance)}

Income

{formatCurrency(totalIncome)}

Expenses

{formatCurrency(totalExpenses)}

{openMenu && menuPosition && (
e.stopPropagation()} >
)}
); }; export default BalanceCard;