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) => (
View and manage all payment transactions
{error}
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}%