/**
* Wallet Page Logic - Aadhaar Pro
*/
let currentUserInfo = null;
document.addEventListener('DOMContentLoaded', () => {
initWalletPage();
});
function initWalletPage() {
loadBalance();
setupAmountPresets();
setupModalFlow();
setupPaymentForm();
loadTopupRequests();
}
/**
* Fetch and update user balance
*/
async function loadBalance() {
try {
const res = await fetch('/api/user/info');
const data = await res.json();
currentUserInfo = data;
// Update hero amount
const heroBalance = document.getElementById('user-balance-hero');
if (heroBalance) heroBalance.innerText = data.balance.toFixed(2);
// Update sidebar pill if it exists
const sidebarPill = document.getElementById('wallet-balance');
if (sidebarPill) sidebarPill.innerText = data.balance.toFixed(2);
} catch (err) {
console.error('Error loading wallet balance:', err);
}
}
/**
* Amount Preset Buttons functionality
*/
function setupAmountPresets() {
const buttons = document.querySelectorAll('.btn-preset');
const amountInput = document.getElementById('init-amount');
buttons.forEach(btn => {
btn.addEventListener('click', () => {
const amount = btn.getAttribute('data-amount');
if (amountInput) amountInput.value = amount;
});
});
}
/**
* Setup Modal Open/Close Logic
*/
function setupModalFlow() {
const proceedBtn = document.getElementById('btn-proceed-topup');
const modal = document.getElementById('topup-payment-modal');
const closeBtn = document.getElementById('close-topup-modal');
if (!proceedBtn || !modal) return;
proceedBtn.addEventListener('click', () => {
const initAmount = document.getElementById('init-amount').value;
const amount = parseFloat(initAmount);
if (isNaN(amount) || amount < 10) {
alert('Please enter a valid amount (Minimum ₹10).');
return;
}
// Set amount in the modal
document.getElementById('pay-amount').value = amount;
document.getElementById('modal-display-amount').innerText = `₹${amount}`;
// Update QR Code dynamically
const upiId = '9219361344@ybl';
const qrImg = document.getElementById('payment-qr-img');
qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=upi://pay?pa=${upiId}&am=${amount}&tn=WalletTopup`;
// Show Modal
modal.style.display = 'flex';
});
if (closeBtn) {
closeBtn.addEventListener('click', () => {
modal.style.display = 'none';
});
}
}
/**
* Custom Toast Notification
*/
function showToast(type, title, message) {
const container = document.getElementById('toast-container');
if (!container) return;
const toast = document.createElement('div');
toast.className = `toast-message ${type}`;
let iconClass = 'fa-solid fa-circle-info';
if (type === 'success') iconClass = 'fa-solid fa-circle-check';
if (type === 'error') iconClass = 'fa-solid fa-circle-exclamation';
toast.innerHTML = `
`;
container.appendChild(toast);
// Remove toast after 5 seconds
setTimeout(() => {
toast.classList.add('fade-out');
setTimeout(() => toast.remove(), 400); // Wait for animation
}, 5000);
}
/**
* Setup Payment Form Submission
*/
function setupPaymentForm() {
const form = document.getElementById('payment-form');
if (!form) return;
form.addEventListener('submit', async (e) => {
e.preventDefault();
const amount = document.getElementById('pay-amount').value;
const utr = document.getElementById('pay-utr').value;
const fileInput = document.getElementById('pay-screenshot');
const file = fileInput ? fileInput.files[0] : null;
const submitBtn = document.getElementById('btn-submit-topup');
if (!utr || utr.length < 12) {
alert('Please enter a valid 12-digit UTR number.');
return;
}
submitBtn.disabled = true;
submitBtn.innerHTML = ' Submitting...';
// Prepare FormData for multipart upload
const formData = new FormData();
formData.append('amount', amount);
formData.append('utr', utr);
formData.append('screenshot', file);
try {
const res = await fetch('/api/wallet/topup', {
method: 'POST',
body: formData
});
const data = await res.json();
if (data.success) {
// Close modal
document.getElementById('topup-payment-modal').style.display = 'none';
// Show rich toast message
const userName = currentUserInfo ? currentUserInfo.name : 'User';
const toastMsg = `
Retailer: ${userName}
Added: ₹${amount}
UTR: ${utr}
Pending verification.
`;
showToast('success', 'Top-up Request Submitted', toastMsg);
// Reset form and initial input
form.reset();
document.getElementById('init-amount').value = '';
// Refresh the top-up requests list
loadTopupRequests();
} else {
showToast('error', 'Submission Failed', data.error);
}
} catch (err) {
console.error('Error submitting top-up:', err);
showToast('error', 'Network Error', 'Failed to connect to the server.');
} finally {
submitBtn.disabled = false;
submitBtn.innerHTML = ' Submit Request';
}
});
}
/**
* Load and display user's top-up requests
*/
async function loadTopupRequests() {
try {
const res = await fetch('/api/wallet/history');
const requests = await res.json();
const requestsList = document.getElementById('topup-requests-list');
const emptyState = document.getElementById('empty-requests');
if (!requestsList) return;
// Clear existing content except empty state
requestsList.innerHTML = '';
if (requests.length === 0) {
if (emptyState) {
requestsList.appendChild(emptyState);
}
return;
}
// Hide empty state if it exists
if (emptyState) {
emptyState.style.display = 'none';
}
// Add requests to the list
requests.forEach(request => {
const requestItem = createRequestElement(request);
requestsList.appendChild(requestItem);
});
} catch (err) {
console.error('Error loading top-up requests:', err);
}
}
/**
* Create HTML element for a top-up request
*/
function createRequestElement(request) {
const item = document.createElement('div');
item.className = 'request-item';
const statusClass = `status-${request.status}`;
const statusIcon = getStatusIcon(request.status);
const formattedDate = new Date(request.date).toLocaleString('en-IN', {
day: '2-digit',
month: 'short',
year: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
item.innerHTML = `
₹${request.amount.toFixed(2)}
UTR: ${request.utr}
${formattedDate}
${request.status.charAt(0).toUpperCase() + request.status.slice(1)}
`;
return item;
}
/**
* Get appropriate icon for request status
*/
function getStatusIcon(status) {
switch (status) {
case 'pending': return 'fa-solid fa-clock';
case 'approved': return 'fa-solid fa-check-circle';
case 'rejected': return 'fa-solid fa-times-circle';
default: return 'fa-solid fa-question-circle';
}
}