338 lines
9.3 KiB
JavaScript
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,
|
|
};
|
|
})();
|