2025-11-26 18:33:09 -06:00

249 lines
8.3 KiB
JavaScript

/**
* Banking Interface
* Handles transfers, deposits, withdrawals, and account management
*/
// Mock data
const mockData = {
accounts: {
cash: { name: "Cash", balance: 2500, type: "Physical Currency" },
bank: { name: "Bank Account", balance: 45750, type: "Savings • Protected" },
org: { name: "Organization", balance: 125000, type: "Shared • View Only", readOnly: true }
},
transactions: [
{ type: "deposit", amount: 5000, desc: "From Cash", time: "2 hours ago" },
{ type: "withdrawal", amount: -1200, desc: "To Cash", time: "5 hours ago" },
{ type: "transfer", amount: -500, desc: "To Player #1234", time: "1 day ago" },
{ type: "deposit", amount: 10000, desc: "Mission Reward", time: "2 days ago" },
{ type: "transfer", amount: 2000, desc: "From Player #5678", time: "3 days ago" }
]
};
// State
let selectedAccount = 'cash';
// Initialize
function initBank() {
console.log('Banking interface initializing...');
setupEventHandlers();
updateBalances();
console.log('Banking interface initialized');
}
// Event Handlers
function setupEventHandlers() {
// Close button
const closeBtn = document.querySelector('.close-btn');
if (closeBtn) {
closeBtn.addEventListener('click', () => {
console.log('Closing bank...');
sendEvent('bank::close', {});
});
}
// Account card selection
const accountCards = document.querySelectorAll('.account-card');
accountCards.forEach(card => {
card.addEventListener('click', () => {
accountCards.forEach(c => c.classList.remove('active'));
card.classList.add('active');
selectedAccount = card.dataset.account;
console.log('Selected account:', selectedAccount);
});
});
// Transfer form
const transferBtn = document.getElementById('transferBtn');
const transferFrom = document.getElementById('transferFrom');
const transferTo = document.getElementById('transferTo');
const transferAmount = document.getElementById('transferAmount');
const playerId = document.getElementById('playerId');
const playerIdGroup = document.getElementById('playerIdGroup');
// Show/hide player ID field
if (transferTo) {
transferTo.addEventListener('change', () => {
if (transferTo.value === 'player') {
playerIdGroup.style.display = 'flex';
} else {
playerIdGroup.style.display = 'none';
}
});
}
// Transfer button
if (transferBtn) {
transferBtn.addEventListener('click', () => {
const from = transferFrom.value;
const to = transferTo.value;
const amount = parseFloat(transferAmount.value);
if (!amount || amount <= 0) {
alert('Please enter a valid amount');
return;
}
if (from === to) {
alert('Source and destination must be different');
return;
}
const fromAccount = mockData.accounts[from];
if (amount > fromAccount.balance) {
alert('Insufficient funds');
return;
}
if (to === 'player' && !playerId.value) {
alert('Please enter a player ID');
return;
}
const transferData = {
from: from,
to: to,
amount: amount,
playerId: to === 'player' ? playerId.value : null
};
console.log('Transfer request:', transferData);
sendEvent('bank::transfer', transferData);
// Clear form
transferAmount.value = '';
if (to === 'player') playerId.value = '';
});
}
// Quick action buttons
const quickActionBtns = document.querySelectorAll('.quick-action-btn');
quickActionBtns.forEach(btn => {
btn.addEventListener('click', () => {
const action = btn.dataset.action;
console.log('Quick action:', action);
switch (action) {
case 'deposit':
const cashBalance = mockData.accounts.cash.balance;
if (cashBalance <= 0) {
alert('No cash to deposit');
return;
}
sendEvent('bank::deposit', { amount: cashBalance });
break;
case 'withdraw':
const amount = prompt('Enter amount to withdraw:');
if (amount && parseFloat(amount) > 0) {
sendEvent('bank::withdraw', { amount: parseFloat(amount) });
}
break;
case 'statement':
sendEvent('bank::statement', {});
break;
}
});
});
// Transaction items
const transactionItems = document.querySelectorAll('.transaction-item');
transactionItems.forEach((item, index) => {
item.addEventListener('click', () => {
console.log('Transaction clicked:', mockData.transactions[index]);
sendEvent('bank::transaction::view', { transaction: mockData.transactions[index] });
});
});
}
// Update balances
function updateBalances() {
const balanceElements = document.querySelectorAll('.balance-amount');
balanceElements[0].textContent = `$${mockData.accounts.cash.balance.toLocaleString()}`;
balanceElements[1].textContent = `$${mockData.accounts.bank.balance.toLocaleString()}`;
balanceElements[2].textContent = `$${mockData.accounts.org.balance.toLocaleString()}`;
// Update form options
const transferFrom = document.getElementById('transferFrom');
const transferTo = document.getElementById('transferTo');
if (transferFrom) {
transferFrom.innerHTML = `
<option value="cash">Cash ($${mockData.accounts.cash.balance.toLocaleString()})</option>
<option value="bank" selected>Bank Account ($${mockData.accounts.bank.balance.toLocaleString()})</option>
`;
}
}
// Update bank data
function updateBankData(data) {
if (data.accounts) {
Object.assign(mockData.accounts, data.accounts);
updateBalances();
}
if (data.transactions) {
// Update transaction list
mockData.transactions = data.transactions;
// Re-render transaction list
renderTransactions();
}
}
// Render transactions
function renderTransactions() {
const transactionList = document.querySelector('.transaction-list');
if (!transactionList) return;
transactionList.innerHTML = '';
mockData.transactions.forEach((transaction, index) => {
const item = document.createElement('div');
item.className = 'transaction-item';
const isPositive = transaction.amount > 0;
const amountClass = isPositive ? 'positive' : 'negative';
const displayAmount = isPositive ? `+$${transaction.amount.toLocaleString()}` : `-$${Math.abs(transaction.amount).toLocaleString()}`;
item.innerHTML = `
<div class="transaction-header">
<span class="transaction-type ${transaction.type}">${transaction.type}</span>
<span class="transaction-amount ${amountClass}">${displayAmount}</span>
</div>
<div class="transaction-details">
<span class="transaction-desc">${transaction.desc}</span>
<span class="transaction-time">${transaction.time}</span>
</div>
`;
item.addEventListener('click', () => {
console.log('Transaction clicked:', transaction);
sendEvent('bank::transaction::view', { transaction: transaction });
});
transactionList.appendChild(item);
});
}
// Send event to Arma
function sendEvent(event, data) {
if (typeof A3API !== 'undefined') {
A3API.SendAlert(JSON.stringify({
event: event,
data: data
}));
} else {
console.log('Event:', event, 'Data:', data);
}
}
// Auto-initialize
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initBank);
} else {
initBank();
}
// Expose functions globally
window.updateBankData = updateBankData;