249 lines
8.3 KiB
JavaScript
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;
|