import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Tag, TrendingDown, Plus, Trash2, RotateCcw, History, X, DollarSign, MessageSquare, Calendar } from 'lucide-react'; import type { CategoryWithRemaining } from '../../services'; import { categoryService, expenseService } from '../../services'; import { useExpenses } from '../../hooks'; import { format } from '../../utils/format'; import { Button, Input } from '../ui'; interface CategoryCardProps { category: CategoryWithRemaining; familyId: number; onDelete: (categoryId: number) => void; onReset: (categoryId: number) => void; onUpdate: () => void; } export function CategoryCard({ category, familyId, onDelete, onReset, onUpdate }: CategoryCardProps) { const { t } = useTranslation(); const [showAddExpense, setShowAddExpense] = useState(false); const [showHistory, setShowHistory] = useState(false); const [expenseAmount, setExpenseAmount] = useState(''); const [expenseDescription, setExpenseDescription] = useState(''); const { expenses, loadExpenses, createExpense } = useExpenses(familyId, category.id); const handleAddExpense = async () => { if (!expenseAmount) return; try { await createExpense({ amount: parseFloat(expenseAmount), description: expenseDescription || undefined, }); setExpenseAmount(''); setExpenseDescription(''); setShowAddExpense(false); onUpdate(); } catch (error) { console.error(error); } }; const handleShowHistory = async () => { if (!showHistory) { await loadExpenses(); } setShowHistory(!showHistory); }; const progress = categoryService.calculateProgress(category.limit_amount, category.remaining_limit); const progressColor = categoryService.getProgressColor(progress); return (

{category.name}

{t('category.limit')}: {format.currency(category.limit_amount)}

{t('category.remaining')} {format.currency(category.remaining_limit)}
{showAddExpense && (

{t('expense.add')}

setExpenseAmount(e.target.value)} fullWidth /> setExpenseDescription(e.target.value)} fullWidth />
)} {showHistory && (

{t('expense.history')}

{expenses.length === 0 ? (

{t('expense.noHistory')}

) : (
{expenseService.sortByDate(expenses).map((expense) => (
{format.currency(expense.amount)}
{expense.description && (
{expense.description}
)}
{format.date(expense.created_at)}
))}
)}
)}
); }