2026-05-23 09:18:04 -05:00

338 lines
9.3 KiB
JavaScript

(function () {
const BankApp = (window.BankApp = window.BankApp || {});
const store = BankApp.store;
let noticeTimer = null;
function normalizeAmount(value) {
const amount = Math.floor(Number(value || 0));
return Number.isFinite(amount) ? amount : 0;
}
function showNotice(type, text) {
store.setNotice({ type, text });
if (noticeTimer) {
clearTimeout(noticeTimer);
}
noticeTimer = setTimeout(() => {
store.setNotice({ text: "", type: "" });
noticeTimer = null;
}, 3200);
}
function closeBank() {
const bridge = BankApp.bridge;
if (bridge && typeof bridge.requestClose === "function") {
const sent = bridge.requestClose();
if (sent) {
return true;
}
}
showNotice("error", "Bank bridge is unavailable.");
return false;
}
function refreshBank() {
const bridge = BankApp.bridge;
if (bridge && typeof bridge.requestRefresh === "function") {
const sent = bridge.requestRefresh();
if (sent) {
return true;
}
}
showNotice("error", "Bank refresh bridge is unavailable.");
return false;
}
function requestDeposit(amountValue) {
const amount = normalizeAmount(amountValue);
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestDeposit !== "function") {
showNotice("error", "Deposit bridge is unavailable.");
return false;
}
store.startAction("deposit");
const sent = bridge.requestDeposit({ amount });
if (!sent) {
store.finishAction();
showNotice("error", "Deposit bridge is unavailable.");
return false;
}
return true;
}
function requestWithdraw(amountValue) {
const amount = normalizeAmount(amountValue);
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestWithdraw !== "function") {
showNotice("error", "Withdraw bridge is unavailable.");
return false;
}
store.startAction("withdraw");
const sent = bridge.requestWithdraw({ amount });
if (!sent) {
store.finishAction();
showNotice("error", "Withdraw bridge is unavailable.");
return false;
}
return true;
}
function requestTransfer(targetUid, amountValue) {
const amount = normalizeAmount(amountValue);
const targetId = String(targetUid || "").trim();
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestTransfer !== "function") {
showNotice("error", "Transfer bridge is unavailable.");
return false;
}
store.startAction("transfer");
const sent = bridge.requestTransfer({
amount,
from: "bank",
target: targetId,
});
if (!sent) {
store.finishAction();
showNotice("error", "Transfer bridge is unavailable.");
return false;
}
return true;
}
function requestDepositEarnings(amountValue) {
const amount = normalizeAmount(amountValue);
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestDepositEarnings !== "function") {
showNotice("error", "Earnings bridge is unavailable.");
return false;
}
store.startAction("depositearnings");
const sent = bridge.requestDepositEarnings({ amount });
if (!sent) {
store.finishAction();
showNotice("error", "Earnings bridge is unavailable.");
return false;
}
return true;
}
function requestRepayCreditLine(amountValue) {
const amount = normalizeAmount(amountValue);
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestRepayCreditLine !== "function") {
showNotice("error", "Credit repayment bridge is unavailable.");
return false;
}
store.startAction("repaycreditline");
const sent = bridge.requestRepayCreditLine({ amount });
if (!sent) {
store.finishAction();
showNotice("error", "Credit repayment bridge is unavailable.");
return false;
}
return true;
}
function normalizePin(value) {
return String(value || "")
.replace(/\D/g, "")
.slice(0, 4);
}
function requestChangePin(currentPinValue, newPinValue, confirmPinValue) {
const currentPin = normalizePin(currentPinValue);
const newPin = normalizePin(newPinValue);
const confirmPin = normalizePin(confirmPinValue);
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestChangePin !== "function") {
showNotice("error", "PIN change bridge is unavailable.");
return false;
}
if (currentPin.length !== 4) {
showNotice("error", "Enter your current four-digit PIN.");
return false;
}
if (newPin.length !== 4) {
showNotice("error", "Choose a new four-digit PIN.");
return false;
}
if (newPin !== confirmPin) {
showNotice("error", "New PIN confirmation does not match.");
return false;
}
if (currentPin === newPin) {
showNotice(
"error",
"Choose a different PIN from your current PIN.",
);
return false;
}
store.startAction("changepin");
const sent = bridge.requestChangePin({ currentPin, newPin });
if (!sent) {
store.finishAction();
showNotice("error", "PIN change bridge is unavailable.");
return false;
}
return true;
}
function appendPinDigit(digit) {
const nextDigit = String(digit || "").trim();
if (!nextDigit) {
return;
}
const currentPin = String(store.getEnteredPin() || "");
if (currentPin.length >= 4) {
return;
}
store.setEnteredPin(currentPin + nextDigit);
}
function backspacePin() {
const currentPin = String(store.getEnteredPin() || "");
store.setEnteredPin(currentPin.slice(0, -1));
}
function clearPin() {
store.setEnteredPin("");
}
function submitPin() {
const enteredPin = String(store.getEnteredPin() || "");
const bridge = BankApp.bridge;
if (!bridge || typeof bridge.requestSubmitPin !== "function") {
showNotice("error", "PIN bridge is unavailable.");
return false;
}
store.startAction("pin");
const sent = bridge.requestSubmitPin({ pin: enteredPin });
if (!sent) {
store.finishAction();
showNotice("error", "PIN bridge is unavailable.");
return false;
}
clearPin();
return true;
}
function selectAtmView(view) {
const nextView = String(view || "").trim();
if (!nextView) {
return false;
}
if (nextView === "pin") {
store.resetAtm();
return true;
}
store.setCustomAmount("");
store.setAtmView(nextView);
return true;
}
function appendCustomAmountDigit(digit) {
const nextDigit = String(digit || "").trim();
if (!nextDigit) {
return;
}
const currentValue = String(store.getCustomAmount() || "");
if (currentValue.length >= 7) {
return;
}
store.setCustomAmount(currentValue + nextDigit);
}
function backspaceCustomAmount() {
const currentValue = String(store.getCustomAmount() || "");
store.setCustomAmount(currentValue.slice(0, -1));
}
function clearCustomAmount() {
store.setCustomAmount("");
}
function submitCustomAmount(kind) {
const amount = normalizeAmount(store.getCustomAmount());
const nextKind = String(kind || "")
.trim()
.toLowerCase();
if (amount <= 0) {
showNotice("error", "Enter a valid transaction amount.");
return false;
}
const success =
nextKind === "deposit"
? requestDeposit(amount)
: requestWithdraw(amount);
if (success) {
store.setCustomAmount("");
}
return success;
}
function requestAtmAmount(kind, amount) {
const nextKind = String(kind || "")
.trim()
.toLowerCase();
const success =
nextKind === "deposit"
? requestDeposit(amount)
: requestWithdraw(amount);
return success;
}
BankApp.actions = {
appendCustomAmountDigit,
appendPinDigit,
backspaceCustomAmount,
backspacePin,
clearCustomAmount,
clearPin,
closeBank,
refreshBank,
requestAtmAmount,
requestChangePin,
requestDeposit,
requestDepositEarnings,
requestRepayCreditLine,
requestTransfer,
requestWithdraw,
selectAtmView,
showNotice,
submitCustomAmount,
submitPin,
};
})();