332 lines
10 KiB
JavaScript
332 lines
10 KiB
JavaScript
import { _ as policyIcon, a as bankIcon, b as giftIcon } from "../js/database-export-CGwyHyM--1776148658686.js";
|
|
import { _ as arrowIcon } from "../js/arrow-Cf0JWzXk-1776148658686.js";
|
|
import { _ as inviteIcon } from "../js/users-plus-BsDDiQEG-1776148658686.js";
|
|
|
|
const API_BASE_URL = "https://jvapi.haiyihy.com";
|
|
|
|
const labels = {
|
|
en: {
|
|
bd_center: "BD Center",
|
|
my_available_salary: "My available salary",
|
|
bd_salary_link: "BD salary",
|
|
bd_policy_link: "BD policy",
|
|
agency_list_link: "Agency list",
|
|
invite_become_agent: "Invite to become agent",
|
|
bank_cards_link: "Bank cards",
|
|
send_welcome_gift: "Send welcome gift",
|
|
failed_to_load_balance: "Failed to load balance. Please try again.",
|
|
failed_to_load_permission: "Failed to load permission. Please try again."
|
|
},
|
|
ar: {
|
|
bd_center: "BD Center",
|
|
my_available_salary: "My available salary",
|
|
bd_salary_link: "BD salary",
|
|
bd_policy_link: "BD policy",
|
|
agency_list_link: "Agency list",
|
|
invite_become_agent: "Invite to become agent",
|
|
bank_cards_link: "Bank cards",
|
|
send_welcome_gift: "Send welcome gift",
|
|
failed_to_load_balance: "Failed to load balance. Please try again.",
|
|
failed_to_load_permission: "Failed to load permission. Please try again."
|
|
},
|
|
tr: {
|
|
bd_center: "BD Center",
|
|
my_available_salary: "My available salary",
|
|
bd_salary_link: "BD salary",
|
|
bd_policy_link: "BD policy",
|
|
agency_list_link: "Agency list",
|
|
invite_become_agent: "Invite to become agent",
|
|
bank_cards_link: "Bank cards",
|
|
send_welcome_gift: "Send welcome gift",
|
|
failed_to_load_balance: "Failed to load balance. Please try again.",
|
|
failed_to_load_permission: "Failed to load permission. Please try again."
|
|
},
|
|
bn: {
|
|
bd_center: "BD Center",
|
|
my_available_salary: "My available salary",
|
|
bd_salary_link: "BD salary",
|
|
bd_policy_link: "BD policy",
|
|
agency_list_link: "Agency list",
|
|
invite_become_agent: "Invite to become agent",
|
|
bank_cards_link: "Bank cards",
|
|
send_welcome_gift: "Send welcome gift",
|
|
failed_to_load_balance: "Failed to load balance. Please try again.",
|
|
failed_to_load_permission: "Failed to load permission. Please try again."
|
|
}
|
|
};
|
|
|
|
let commonHeaders = {
|
|
authorization: "Bearer undefined",
|
|
"req-app-intel": "version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google",
|
|
"req-client": "Android",
|
|
"req-imei": "8fa54d728ab449e04f9292329ed44bda",
|
|
"req-lang": "id-ID",
|
|
"req-sys-origin": "origin=ATYOU;originChild=ATYOU",
|
|
"req-version": "V2",
|
|
"req-zone": "Asia/Shanghai"
|
|
};
|
|
|
|
const state = {
|
|
lang: resolveLanguage(),
|
|
balance: 0,
|
|
hasGiftPermission: false
|
|
};
|
|
|
|
function resolveLanguage() {
|
|
const params = new URLSearchParams(window.location.search);
|
|
const hashQuery = window.location.hash.includes("?") ? window.location.hash.split("?")[1] : "";
|
|
const hashParams = new URLSearchParams(hashQuery);
|
|
const lang = params.get("lang") || hashParams.get("lang") || navigator.language || "en";
|
|
|
|
if (lang.startsWith("ar")) return "ar";
|
|
if (lang.startsWith("tr")) return "tr";
|
|
if (lang.startsWith("bn")) return "bn";
|
|
return "en";
|
|
}
|
|
|
|
function t(key) {
|
|
return (labels[state.lang] && labels[state.lang][key]) || labels.en[key] || key;
|
|
}
|
|
|
|
function setLanguage() {
|
|
document.documentElement.lang = state.lang;
|
|
document.documentElement.dir = state.lang === "ar" ? "rtl" : "ltr";
|
|
document.querySelector("[data-action='language']").textContent = state.lang.toUpperCase();
|
|
document.querySelectorAll("[data-i18n]").forEach((node) => {
|
|
node.textContent = t(node.dataset.i18n);
|
|
});
|
|
}
|
|
|
|
function setIcons() {
|
|
const iconMap = {
|
|
policy: policyIcon,
|
|
bank: bankIcon,
|
|
gift: giftIcon,
|
|
arrow: arrowIcon,
|
|
invite: inviteIcon
|
|
};
|
|
|
|
document.querySelectorAll("[data-icon]").forEach((img) => {
|
|
img.src = iconMap[img.dataset.icon] || "";
|
|
});
|
|
}
|
|
|
|
function formatMoney(value) {
|
|
if (value === null || value === undefined || value === "") return "0";
|
|
const number = Number(value);
|
|
if (Number.isNaN(number)) return String(value);
|
|
return Number.isInteger(number) ? String(number) : number.toFixed(2);
|
|
}
|
|
|
|
function render() {
|
|
document.getElementById("availableBalance").textContent = `$${formatMoney(state.balance)}`;
|
|
document.querySelectorAll(".gift-permission").forEach((node) => {
|
|
node.hidden = !state.hasGiftPermission;
|
|
});
|
|
}
|
|
|
|
function showToast(message) {
|
|
const toast = document.getElementById("toast");
|
|
toast.textContent = message;
|
|
toast.hidden = false;
|
|
window.clearTimeout(showToast.timer);
|
|
showToast.timer = window.setTimeout(() => {
|
|
toast.hidden = true;
|
|
}, 2500);
|
|
}
|
|
|
|
function isMobileDevice() {
|
|
return /Android|iPad|iPhone|iPod/.test(navigator.userAgent);
|
|
}
|
|
|
|
function isAppEnvironment() {
|
|
return Boolean(window.app || window.webkit || window.FlutterPageControl);
|
|
}
|
|
|
|
function splitHeaderPairs(value) {
|
|
const result = {};
|
|
if (!value) return result;
|
|
value.split(";").forEach((item) => {
|
|
const index = item.indexOf("=");
|
|
if (index > -1) {
|
|
result[item.slice(0, index)] = item.slice(index + 1);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
|
|
function parseAccessOrigin(raw) {
|
|
const data = JSON.parse(raw);
|
|
const appIntel = splitHeaderPairs(data["Req-App-Intel"]);
|
|
const sysOrigin = splitHeaderPairs(data["Req-Sys-Origin"]);
|
|
|
|
return {
|
|
reqLang: data["Req-Lang"],
|
|
authorization: data.Authorization,
|
|
buildVersion: appIntel.build,
|
|
appVersion: appIntel.version,
|
|
appChannel: appIntel.channel,
|
|
reqImei: appIntel["Req-Imei"],
|
|
sysOrigin: sysOrigin.origin,
|
|
sysOriginChild: sysOrigin.child
|
|
};
|
|
}
|
|
|
|
function setHeadersFromApp(headers) {
|
|
const next = {};
|
|
if (headers.authorization) next.authorization = headers.authorization;
|
|
if (headers.reqLang) next["req-lang"] = headers.reqLang;
|
|
if (headers.appVersion || headers.buildVersion || headers.appChannel) {
|
|
const intel = [];
|
|
if (headers.appVersion) intel.push(`version=${headers.appVersion}`);
|
|
if (headers.buildVersion) intel.push(`build=${headers.buildVersion}`);
|
|
if (headers.appChannel) intel.push(`channel=${headers.appChannel}`);
|
|
next["req-app-intel"] = intel.join(";");
|
|
}
|
|
if (headers.reqImei) next["req-imei"] = headers.reqImei;
|
|
if (headers.sysOrigin) {
|
|
const origin = [`origin=${headers.sysOrigin}`];
|
|
if (headers.sysOriginChild) origin.push(`child=${headers.sysOriginChild}`);
|
|
next["req-sys-origin"] = origin.join(";");
|
|
}
|
|
commonHeaders = { ...commonHeaders, ...next };
|
|
}
|
|
|
|
function requestAccessOrigin() {
|
|
return new Promise((resolve) => {
|
|
window.renderData = resolve;
|
|
window.getIosAccessOriginParam = resolve;
|
|
|
|
if (!isAppEnvironment()) {
|
|
setHeadersFromApp({
|
|
authorization: "",
|
|
reqLang: state.lang,
|
|
appVersion: "1.0.0",
|
|
buildVersion: "1",
|
|
appChannel: "Web",
|
|
reqImei: "H5-STATIC",
|
|
sysOrigin: "LIKEI",
|
|
sysOriginChild: "LIKEI"
|
|
});
|
|
resolve(null);
|
|
return;
|
|
}
|
|
|
|
let attempt = 0;
|
|
const maxAttempts = 50;
|
|
const poll = () => {
|
|
attempt += 1;
|
|
if (window.app && typeof window.app.getAccessOrigin === "function") {
|
|
resolve(window.app.getAccessOrigin());
|
|
return;
|
|
}
|
|
if (attempt < maxAttempts) {
|
|
window.setTimeout(poll, 100);
|
|
return;
|
|
}
|
|
if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") {
|
|
window.FlutterApp.postMessage("requestAccessOrigin");
|
|
}
|
|
};
|
|
|
|
if (isMobileDevice()) {
|
|
poll();
|
|
} else {
|
|
resolve(null);
|
|
}
|
|
});
|
|
}
|
|
|
|
async function connectToApp() {
|
|
const raw = await requestAccessOrigin();
|
|
if (!raw) return;
|
|
setHeadersFromApp(parseAccessOrigin(raw));
|
|
}
|
|
|
|
async function apiGet(path) {
|
|
const response = await fetch(`${API_BASE_URL}${path}`, {
|
|
method: "GET",
|
|
headers: commonHeaders
|
|
});
|
|
|
|
const data = await response.json().catch(() => ({}));
|
|
if (!response.ok || data.status === false) {
|
|
const error = new Error(data.errorMsg || data.message || `Request failed: ${response.status}`);
|
|
error.response = data;
|
|
throw error;
|
|
}
|
|
return data;
|
|
}
|
|
|
|
async function fetchBalance() {
|
|
const result = await apiGet("/wallet/salary-account/balance?salaryType=BD_SALARY");
|
|
if (result.status && result.body) {
|
|
state.balance = result.body.availableBalance || 0;
|
|
}
|
|
}
|
|
|
|
async function fetchGiftPermission() {
|
|
const result = await apiGet("/sys/bd/own-permission");
|
|
if (result.status) {
|
|
state.hasGiftPermission = Boolean(result.body);
|
|
}
|
|
}
|
|
|
|
function navigateTo(target) {
|
|
const url = new URL(target, window.location.origin);
|
|
const currentLang = new URLSearchParams(window.location.search).get("lang");
|
|
if (currentLang && !url.searchParams.has("lang")) {
|
|
url.searchParams.set("lang", currentLang);
|
|
}
|
|
window.location.href = `${url.pathname}${url.search}${url.hash}`;
|
|
}
|
|
|
|
function bindEvents() {
|
|
document.querySelector("[data-action='back']").addEventListener("click", () => {
|
|
if (window.history.length > 1) {
|
|
window.history.back();
|
|
return;
|
|
}
|
|
if (window.app && typeof window.app.closePage === "function") {
|
|
window.app.closePage();
|
|
return;
|
|
}
|
|
if (window.FlutterPageControl && typeof window.FlutterPageControl.postMessage === "function") {
|
|
window.FlutterPageControl.postMessage("close_page");
|
|
}
|
|
});
|
|
|
|
document.querySelector("[data-action='language']").addEventListener("click", () => {
|
|
navigateTo("/language");
|
|
});
|
|
|
|
document.querySelectorAll("[data-route]").forEach((node) => {
|
|
node.addEventListener("click", () => navigateTo(node.dataset.route));
|
|
});
|
|
}
|
|
|
|
async function init() {
|
|
setLanguage();
|
|
setIcons();
|
|
bindEvents();
|
|
render();
|
|
localStorage.setItem("identity", JSON.stringify({ identity: "BD" }));
|
|
|
|
try {
|
|
await connectToApp();
|
|
const results = await Promise.allSettled([fetchBalance(), fetchGiftPermission()]);
|
|
results.forEach((result) => {
|
|
if (result.status === "rejected") {
|
|
console.warn("BD center data request failed:", result.reason);
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.warn("BD center initialization failed:", error);
|
|
showToast(error.response?.errorMsg || error.message || t("failed_to_load_balance"));
|
|
} finally {
|
|
render();
|
|
}
|
|
}
|
|
|
|
init();
|