import React, { useEffect, useState } from 'react'; import { api } from '../../utils/api'; import type { Transaction } from '../../types'; import { Card } from '../ui/Card'; import { Button } from '../ui/Button'; import { Loading } from '../ui/Loading'; import { FiSearch, FiFilter, FiEye } from 'react-icons/fi'; export const TransactionList: React.FC = () => { const [transactions, setTransactions] = useState([]); const [filteredTransactions, setFilteredTransactions] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [statusFilter, setStatusFilter] = useState('all'); const [selectedTransaction, setSelectedTransaction] = useState(null); useEffect(() => { const fetchTransactions = async () => { try { const data = await api.getTransactions(); setTransactions(data); setFilteredTransactions(data); } catch (error) { console.error('Failed to fetch transactions:', error); } finally { setLoading(false); } }; fetchTransactions(); }, []); useEffect(() => { let filtered = transactions; if (searchTerm) { filtered = filtered.filter( (t) => t.recipient.toLowerCase().includes(searchTerm.toLowerCase()) || t.id.toLowerCase().includes(searchTerm.toLowerCase()) || t.recipientEmail?.toLowerCase().includes(searchTerm.toLowerCase()) ); } if (statusFilter !== 'all') { filtered = filtered.filter((t) => t.status === statusFilter); } setFilteredTransactions(filtered); }, [searchTerm, statusFilter, transactions]); const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', }).format(amount); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const getStatusColor = (status: Transaction['status']) => { switch (status) { case 'approved': return 'bg-green-100 text-green-800'; case 'rejected': return 'bg-red-100 text-red-800'; case 'suspicious': return 'bg-yellow-100 text-yellow-800'; default: return 'bg-blue-100 text-blue-800'; } }; const handleStatusUpdate = async (id: string, status: Transaction['status']) => { try { await api.updateTransactionStatus(id, status); const updated = await api.getTransactions(); setTransactions(updated); } catch (error) { console.error('Failed to update transaction:', error); } }; if (loading) { return ; } return (

Transactions

View and manage all transactions

{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-500" />
{/* Transaction Table */}
{filteredTransactions.map((transaction) => ( ))}
ID Recipient Amount Type Status Date Actions
{transaction.id.slice(0, 8)}...
{transaction.recipient}
{transaction.recipientEmail && (
{transaction.recipientEmail}
)}
{formatCurrency(transaction.amount)}
{transaction.accountType} {transaction.status} {formatDate(transaction.createdAt)}
{transaction.status === 'pending' && ( <> )}
{filteredTransactions.length === 0 && (

No transactions found

)}
{/* Transaction Detail Modal */} {selectedTransaction && (

Transaction Details

Transaction ID

{selectedTransaction.id}

Amount

{formatCurrency(selectedTransaction.amount)}

Status

{selectedTransaction.status}

Recipient

{selectedTransaction.recipient}

{selectedTransaction.recipientEmail && (

{selectedTransaction.recipientEmail}

)}

Account Type

{selectedTransaction.accountType}

{selectedTransaction.description && (

Description

{selectedTransaction.description}

)}

Created At

{formatDate(selectedTransaction.createdAt)}

{selectedTransaction.rejectionReason && (

Rejection Reason

{selectedTransaction.rejectionReason}

)}
{selectedTransaction.status === 'pending' && ( <> )}
)}
); };