'use client' import React, { useState, useEffect } from 'react' import { useAuth } from '@/contexts/AuthContext' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Alert, AlertDescription } from '@/components/ui/alert' import { History, RefreshCw, ArrowUpCircle, ArrowDownCircle, ChevronLeft, ChevronRight, Filter, } from 'lucide-react' import { formatCurrency } from '@/lib/balance-service' interface Transaction { _id: string transactionId: string type: 'debit' | 'credit' amount: number service: string serviceId?: string description?: string status: 'pending' | 'completed' | 'failed' previousBalance: number newBalance: number createdAt: string updatedAt: string } interface TransactionHistoryProps { className?: string showFilters?: boolean maxHeight?: string } export function TransactionHistory({ className = '', showFilters = true, maxHeight = '400px', }: TransactionHistoryProps) { const { user } = useAuth() const [transactions, setTransactions] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [page, setPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [typeFilter, setTypeFilter] = useState<'all' | 'debit' | 'credit'>('all') const [serviceFilter, setServiceFilter] = useState('all') const fetchTransactions = async (pageNum: number = 1, reset: boolean = false) => { if (!user) return setLoading(true) setError(null) try { const params = new URLSearchParams({ page: pageNum.toString(), limit: '10', type: typeFilter, }) if (serviceFilter && serviceFilter !== 'all') { params.append('service', serviceFilter) } const response = await fetch(`/api/transactions?${params}`, { credentials: 'include', }) const data = await response.json() if (!response.ok) { throw new Error(data.error?.message || 'Failed to fetch transactions') } if (data.success) { if (reset) { setTransactions(data.data.transactions) } else { setTransactions((prev) => [...prev, ...data.data.transactions]) } setTotalPages(data.data.pagination.totalPages) setPage(pageNum) } else { throw new Error(data.error?.message || 'Failed to fetch transactions') } } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Failed to fetch transactions' setError(errorMessage) } finally { setLoading(false) } } useEffect(() => { fetchTransactions(1, true) }, [user, typeFilter, serviceFilter]) const handleRefresh = () => { setPage(1) fetchTransactions(1, true) } const handleLoadMore = () => { if (page < totalPages) { fetchTransactions(page + 1, false) } } const getTransactionIcon = (type: string) => { return type === 'credit' ? ( ) : ( ) } const getStatusBadge = (status: string) => { const variants = { completed: 'default', pending: 'secondary', failed: 'destructive', } as const return ( {status} ) } const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-IN', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }) } if (!user) { return null } return (
Transaction History
{showFilters && (
)} {error && ( {error} )}
{transactions.length === 0 && !loading ? (

No transactions found

Your transaction history will appear here

) : ( transactions.map((transaction) => (
{getTransactionIcon(transaction.type)}
{transaction.description || transaction.service}
{formatDate(transaction.createdAt)}
{transaction.serviceId && (
ID: {transaction.serviceId}
)}
{transaction.type === 'credit' ? '+' : '-'} {formatCurrency(transaction.amount)}
{/*
Balance: {formatCurrency(transaction.newBalance)}
*/}
{getStatusBadge(transaction.status)}
)) )} {loading && (

Loading transactions...

)} {page < totalPages && !loading && (
)}
) }