"use client"; import { useState, useEffect } from "react"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Edit, Trash2, MoreHorizontal, Plus, Minus } from "lucide-react"; interface Transaction { id: string; description: string; amount: string; type: "income" | "expense"; date: string; categoryId?: string; accountId: string; merchant?: string; notes?: string; createdAt: string; updatedAt: string; } interface TransactionListProps { onTransactionUpdated?: () => void; } export function TransactionList({ onTransactionUpdated }: TransactionListProps) { const [transactions, setTransactions] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { fetchTransactions(); }, []); const fetchTransactions = async () => { try { setLoading(true); const response = await fetch("/api/transactions?limit=50"); if (response.ok) { const data = await response.json(); setTransactions(data.transactions || []); setError(null); } else { setError("Failed to fetch transactions"); } } catch (error) { console.error("Error fetching transactions:", error); setError("Error loading transactions"); } finally { setLoading(false); } }; const deleteTransaction = async (id: string) => { try { const response = await fetch(`/api/transactions/${id}`, { method: "DELETE", }); if (response.ok) { setTransactions(transactions.filter(t => t.id !== id)); onTransactionUpdated?.(); } else { console.error("Failed to delete transaction"); } } catch (error) { console.error("Error deleting transaction:", error); } }; const formatAmount = (amount: string, type: "income" | "expense") => { const num = parseFloat(amount); return `${type === "income" ? "+" : "-"}€${num.toFixed(2)}`; }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString("it-IT", { day: "2-digit", month: "short", year: "numeric", }); }; if (loading) { return ( Transactions
Loading transactions...
); } if (error) { return ( Transactions
{error}
); } return ( Recent Transactions Your latest income and expense transactions {transactions.length === 0 ? (

No transactions yet

Add your first transaction to get started

) : (
{transactions.map((transaction) => (
{transaction.type === "income" ? ( ) : ( )}

{transaction.description}

{formatDate(transaction.date)} {transaction.merchant && ` • ${transaction.merchant}`}

{formatAmount(transaction.amount, transaction.type)}

{transaction.type}
deleteTransaction(transaction.id)}> Delete
))}
)}
); }