import React, { useState, useEffect } from 'react'; import { RefreshCw, Download, Filter } from 'lucide-react'; import DataTable from '../components/DataTable'; import { paymentsAPI } from '../services/api'; const Transactions = () => { const [payments, setPayments] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [filter, setFilter] = useState('all'); const [refreshing, setRefreshing] = useState(false); useEffect(() => { fetchPayments(); }, []); const fetchPayments = async () => { try { setLoading(true); setError(''); const response = await paymentsAPI.getPayments(); setPayments(response.data || []); } catch (err) { setError('Failed to fetch transactions'); console.error('Transactions fetch error:', err); } finally { setLoading(false); } }; const handleRefresh = async () => { setRefreshing(true); await fetchPayments(); setRefreshing(false); }; const handleFilter = (status) => { setFilter(status); }; const filteredPayments = payments.filter(payment => { if (filter === 'all') return true; return payment.status === filter; }); const getStatusBadge = (status) => { const statusClasses = { success: 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300', failed: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300', pending: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300', }; return ( {status} ); }; const formatCurrency = (amount, currency = 'USD') => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: currency, }).format(amount); }; const formatDate = (dateString) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const exportToCSV = () => { const csvContent = [ ['ID', 'User', 'Amount', 'Status', 'Date', 'Currency'], ...filteredPayments.map(payment => [ payment.id, payment.user, payment.amount, payment.status, formatDate(payment.date), payment.currency ]) ].map(row => row.join(',')).join('\n'); const blob = new Blob([csvContent], { type: 'text/csv' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `transactions-${new Date().toISOString().split('T')[0]}.csv`; a.click(); window.URL.revokeObjectURL(url); }; const columns = [ { key: 'id', header: 'Transaction ID', render: (value) => ( {value} ) }, { key: 'user', header: 'User', render: (value) => (
{value.charAt(0).toUpperCase()}
{value}
) }, { key: 'amount', header: 'Amount', render: (value, row) => ( {formatCurrency(value, row.currency)} ) }, { key: 'status', header: 'Status', render: (value) => getStatusBadge(value) }, { key: 'date', header: 'Date', render: (value) => ( {formatDate(value)} ) } ]; return (

Transactions

View and manage all payment transactions

{/* Filters */}
Filter by status:
{[ { key: 'all', label: 'All', count: payments.length }, { key: 'success', label: 'Success', count: payments.filter(p => p.status === 'success').length }, { key: 'pending', label: 'Pending', count: payments.filter(p => p.status === 'pending').length }, { key: 'failed', label: 'Failed', count: payments.filter(p => p.status === 'failed').length }, ].map(({ key, label, count }) => ( ))}
{/* Error State */} {error && (

{error}

)} {/* Transactions Table */} {/* Summary Stats */}

Total Transactions

{filteredPayments.length}

Total Amount

{formatCurrency( filteredPayments.reduce((sum, payment) => sum + payment.amount, 0) )}

Success Rate

{filteredPayments.length > 0 ? ((filteredPayments.filter(p => p.status === 'success').length / filteredPayments.length) * 100).toFixed(1) : 0}%

); }; export default Transactions;