import React, { useState, useEffect } from 'react'; import { useService } from '../../../core/di/ServiceContainer'; import { IWalletService } from '../services/interfaces/IWalletService'; import { UserWallet, WalletTransaction, TransactionType, TransactionStatus, WalletBalanceSummary } from '../types/wallet.types'; interface WalletBalanceProps { userId?: string; className?: string; showTransactions?: boolean; } export const WalletBalance: React.FC = ({ userId = 'current-user', className = '', showTransactions = true }) => { const walletService = useService('wallet-service'); const [wallet, setWallet] = useState(null); const [transactions, setTransactions] = useState([]); const [balanceSummary, setBalanceSummary] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showAllTransactions, setShowAllTransactions] = useState(false); useEffect(() => { if (walletService) { loadWalletData(); } }, [userId, walletService]); const loadWalletData = async () => { try { setLoading(true); setError(null); if (!walletService) { throw new Error('Wallet service is not available'); } // Load or create wallet let userWallet = await walletService.getWalletByUserId(userId); if (!userWallet) { userWallet = await walletService.createWallet({ userId, currency: 'IDR' }); } // Load balance summary const summary = await walletService.getWalletBalance(userId); // Load recent transactions const recentTransactions = await walletService.getTransactionHistory( userId, 1, // page showAllTransactions ? 50 : 10 // limit ); setWallet(userWallet); setBalanceSummary(summary); setTransactions(recentTransactions.transactions); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load wallet data'); } finally { setLoading(false); } }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR' }).format(amount); }; const getTransactionTypeLabel = (type: TransactionType) => { const labels = { [TransactionType.CREDIT]: 'Kredit', [TransactionType.DEBIT]: 'Debit' }; return labels[type] || type; }; const getTransactionIcon = (type: TransactionType) => { const icons = { [TransactionType.CREDIT]: '💰', [TransactionType.DEBIT]: '💸' }; return icons[type] || '💳'; }; const getStatusBadge = (status: TransactionStatus) => { const statusConfig = { [TransactionStatus.PENDING]: { label: 'Menunggu', className: 'bg-yellow-100 text-yellow-800' }, [TransactionStatus.COMPLETED]: { label: 'Selesai', className: 'bg-green-100 text-green-800' }, [TransactionStatus.FAILED]: { label: 'Gagal', className: 'bg-red-100 text-red-800' }, [TransactionStatus.CANCELLED]: { label: 'Dibatalkan', className: 'bg-gray-100 text-gray-800' } }; const config = statusConfig[status]; return ( {config.label} ); }; const isPositiveTransaction = (type: TransactionType) => { return type === TransactionType.CREDIT; }; if (loading) { return (
{showTransactions && (
{[1, 2, 3].map(i => (
))}
)}
); } if (error) { return (

Error

{error}

); } return (
{/* Header */}

Wallet Saya

{!wallet?.isActive && ( 🔒 Dibekukan )}
{/* Balance Card */} {wallet && balanceSummary && (

Saldo Tersedia

{formatCurrency(balanceSummary.availableBalance)}

Wallet ID

{wallet.id.substring(0, 8)}...

Total Balance

{formatCurrency(balanceSummary.totalBalance)}

Pending

{formatCurrency(balanceSummary.pendingCredits)}

)} {/* Quick Stats */} {balanceSummary && (
📈

Kredit Pending

{formatCurrency(balanceSummary.pendingCredits)}

📉

Debit Pending

{formatCurrency(balanceSummary.pendingDebits)}

🔄

Total Transaksi

{transactions.length}

Mata Uang

{balanceSummary.currency}

)} {/* Transactions */} {showTransactions && (

Riwayat Transaksi

{transactions.length > 10 && ( )}
{transactions.length === 0 ? (
💳

Belum ada transaksi

Transaksi akan muncul di sini

) : (
{transactions.map((transaction) => (
{getTransactionIcon(transaction.type)}

{getTransactionTypeLabel(transaction.type)}

{transaction.description}

{transaction.createdAt.toLocaleString('id-ID')}

{isPositiveTransaction(transaction.type) ? '+' : '-'} {formatCurrency(Math.abs(transaction.amount))}

{getStatusBadge(transaction.status)}
))}
)}
)} {/* Action Buttons */}
); };