chatapp-h5/h5/agency-center/agency-center.js
2026-04-24 20:42:36 +08:00

704 lines
20 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { _ as policyIcon, a as transferIcon, b as bankIcon } from "../js/database-export-CGwyHyM--1776148658686.js";
import { _ as coinsIcon, a as cashIcon } from "../js/database-dollar-DDq4bT-e-1776148658686.js";
import { _ as arrowIcon } from "../js/arrow-Cf0JWzXk-1776148658686.js";
import { _ as helpIcon } from "../js/help-BgsLqEJs-1776148658686.js";
const API_BASE_URL = "https://jvapi.haiyihy.com";
const labels = {
en: {
agency_center: "Agency Center",
my_available_salary: "My available salary",
my_salary_details: "Salary details",
today_host_task: "My task as a host today is:",
host_type: "Host type",
minutes: "Minutes",
gift_task: "Gift Task",
platform_policy: "Platform policy",
exchange_coins: "Exchange coins",
transfer: "Transfer",
cash_withdraw: "Cash withdraw",
bank_accounts: "Bank Accounts",
team_member: "Team Member",
team_bill: "Team Bill",
invite_members: "Invite Members",
prompt: "Prompt",
fill_info_tips: "Please complete your withdrawal information first.",
card_issue_tips: "Make sure the bank card and identity information are valid.",
to_improve: "To improve",
completed: "Completed",
in_progress: "In progress",
out_of_account: "Out of account",
failed_to_load_data: "Failed to load data. Please try again."
},
ar: {},
tr: {},
bn: {}
};
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(),
userProfile: null,
teamInfo: null,
identityInfo: null,
salaryInfo: {
currentSalary: "0.00"
},
taskInfo: {
anchorType: "Chat",
minutesProgress: 0,
minutesTotal: 120,
giftTask: 0
},
memberQuantity: 0,
memberWorkTotal: "0.00",
teamBill: {
date: "",
hostSalary: "",
agentSalary: "",
total: "",
status: ""
},
bankCards: [],
defaultBankCard: null,
withdrawInfo: null,
withdrawEnabled: false,
showFillInfoModal: false
};
const rolePriority = {
guest: 0,
anchor: 1,
agent: 2,
bd: 3,
bdLeader: 4,
freightAgent: 5,
admin: 6
};
const roleDefaultPages = {
admin: "/admin-center",
freightAgent: "/coin-seller",
agent: "/agency-center",
bdLeader: "/bd-leader-center",
bd: "/bd-center",
anchor: "/host-center",
guest: "/apply"
};
const rolePages = {
admin: [
"/admin-center",
"/invite-bd-leader",
"/invite-bd",
"/invite-recharge-agency",
"/invite-agency",
"/item-distribution",
"/my-BDLeader-teams",
"/my-BD-teams",
"/my-agency-teams",
"/my-recharge-agency",
"/admin-policy"
],
freightAgent: ["/coin-seller", "/seller-records", "/coin-seller-search"],
agent: [
"/agency-center",
"/transfer",
"/exchange-gold-coins",
"/message",
"/platform-policy",
"/agency-setting",
"/team-member",
"/information-details",
"/history-salary",
"/invite-members",
"/team-bill"
],
bdLeader: [
"/bd-leader-center",
"/invite-bd-leader",
"/invite-bd",
"/bd-center",
"/transfer",
"/exchange-gold-coins",
"/message",
"/invite-agency",
"/bd-item-distribution",
"/team-member",
"/history-salary",
"/agency-list",
"/available-income",
"/income-details",
"/policy",
"/bd-list"
],
bd: [
"/bd-center",
"/transfer",
"/exchange-gold-coins",
"/message",
"/invite-agency",
"/bd-item-distribution",
"/team-member",
"/history-salary",
"/agency-list",
"/available-income",
"/income-details",
"/policy"
],
anchor: [
"/host-center",
"/transfer",
"/exchange-gold-coins",
"/message",
"/platform-policy",
"/host-setting",
"/information-details",
"/history-salary",
"/invite-members",
"/team-bill"
],
guest: ["/apply", "/language"]
};
const publicPages = [
"/apply",
"/language",
"/not_app",
"/pay-result",
"/map",
"/top-list",
"/weekly-star",
"/ranking",
"/games-king",
"/couple",
"/invitation-to-register",
"/invitation/invite-new-user",
"/recharge-reward",
"/login-reward",
"/activities/lesser-bairam",
"/activities/lucky-dollars-season3",
"/activities/spring-festival",
"/recharge",
"/recharge-pay-way",
"/recharge-guide",
"/recharge-agency-recruit",
"/search-payee",
"/cash-withdraw",
"/cash-out",
"/cash-out-details",
"/bank-cards",
"/bank-card",
"/KYC",
"/good-ID"
];
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]?.[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,
transfer: transferIcon,
bank: bankIcon,
coins: coinsIcon,
cash: cashIcon,
arrow: arrowIcon,
help: helpIcon
};
document.querySelectorAll("[data-icon]").forEach((img) => {
img.src = iconMap[img.dataset.icon] || "";
});
}
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: data["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 poll = () => {
attempt += 1;
if (window.app && typeof window.app.getAccessOrigin === "function") {
resolve(window.app.getAccessOrigin());
return;
}
if (attempt < 50) {
window.setTimeout(poll, 100);
return;
}
if (window.FlutterApp && typeof window.FlutterApp.postMessage === "function") {
window.FlutterApp.postMessage("requestAccessOrigin");
}
};
if (isMobileDevice()) {
poll();
return;
}
resolve(null);
});
}
async function connectToApp() {
const raw = await requestAccessOrigin();
if (raw) 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;
}
function readCachedJson(key) {
const raw = localStorage.getItem(key);
if (!raw) return null;
try {
return JSON.parse(raw);
} catch (error) {
console.warn(`Failed to parse ${key}:`, error);
return null;
}
}
function writeCachedJson(key, value) {
if (value === null || value === undefined) {
localStorage.removeItem(key);
return;
}
localStorage.setItem(key, JSON.stringify(value));
}
function getUserId() {
return state.userProfile?.id || readCachedJson("userProfile")?.id || null;
}
function getTeamId() {
return state.teamInfo?.id || readCachedJson("teamInfo")?.id || null;
}
function formatMoney(value) {
if (value === null || value === undefined || value === "") return "0";
const number = Number(value);
if (Number.isNaN(number)) return String(value);
return number.toFixed(2);
}
function formatBillStatus(status) {
return {
SETTLED: t("completed"),
UNPAID: t("in_progress"),
HANG_UP: t("out_of_account"),
PAY_OUT: t("completed")
}[status] || status || "";
}
function getIdentityRoles(identity) {
if (!identity) return ["guest"];
const roles = [];
if (identity.freightAgent) roles.push("freightAgent");
if (identity.agent) roles.push("agent");
if (identity.bdLeader) roles.push("bdLeader");
if (identity.bd) roles.push("bd");
if (identity.anchor) roles.push("anchor");
if (identity.admin) roles.push("admin");
return roles.length ? roles : ["guest"];
}
function getPrimaryRole(roles) {
return roles.reduce((primary, role) => (rolePriority[role] > rolePriority[primary] ? role : primary), "guest");
}
function getAllowedPages(roles) {
const pages = new Set([...publicPages, "/loading"]);
roles.forEach((role) => {
(rolePages[role] || []).forEach((page) => pages.add(page));
});
return pages;
}
function applyPermissionRedirect() {
const roles = getIdentityRoles(state.identityInfo);
const primaryRole = getPrimaryRole(roles);
const allowedPages = getAllowedPages(roles);
const currentPath = window.location.pathname.replace(/\/$/, "") || "/";
if (!allowedPages.has(currentPath)) {
navigateTo(roleDefaultPages[primaryRole] || "/apply");
}
}
async function fetchIdentity() {
const result = await apiGet("/app/h5/identity");
if (result.status && result.body) state.identityInfo = result.body;
}
async function fetchUserProfile() {
const result = await apiGet("/team/member/profile");
if (result.status && result.body) {
state.userProfile = result.body;
writeCachedJson("userProfile", result.body);
}
}
async function fetchTeamInfo() {
const result = await apiGet("/team/entry");
if (result.status && result.body) {
state.teamInfo = result.body.teamProfile || result.body;
writeCachedJson("teamInfo", state.teamInfo);
} else {
state.teamInfo = null;
writeCachedJson("teamInfo", null);
}
}
async function fetchBankBalance() {
const result = await apiGet("/wallet/bank/balance");
if (result.status && typeof result.body === "number") {
state.salaryInfo.currentSalary = result.body.toFixed(2);
} else {
state.salaryInfo.currentSalary = "0";
}
}
async function fetchWorkStatistics() {
const userId = getUserId();
if (!userId) return;
const result = await apiGet(`/team/member/work/statistics-now?dataType=DAILY&memberId=${encodeURIComponent(userId)}`);
if (result.status && result.body) {
const ownTime = Number(result.body.ownTime) || 0;
const otherTime = Number(result.body.otherTime) || 0;
const progress = ownTime + otherTime;
state.taskInfo.anchorType = "Chat";
state.taskInfo.minutesProgress = Math.min(progress, state.taskInfo.minutesTotal);
state.taskInfo.giftTask = result.body.acceptGiftValue || 0;
}
}
async function fetchMemberWorkTotal() {
const userId = getUserId();
if (!userId) return;
const result = await apiGet(`/team/member-work?userId=${encodeURIComponent(userId)}`);
if (!result.status || !result.body) return;
const targets = result.body.targets || [];
const isAgent = Boolean(state.identityInfo?.agent);
const isAnchor = Boolean(state.identityInfo?.anchor);
const total = targets.reduce((sum, item, index) => {
if (index === 0) return sum;
const settlement = item.target?.settlementResult || {};
if (isAgent) {
return sum + Number(settlement.ownSalary || 0) + Number(settlement.memberSalary || 0);
}
if (isAnchor) {
return sum + Number(settlement.memberSalary || 0);
}
return sum;
}, 0);
state.memberWorkTotal = total.toFixed(2);
}
async function fetchTeamMemberCount() {
const teamId = getTeamId();
if (!teamId) return;
try {
const result = await apiGet(`/team/members/count?id=${encodeURIComponent(teamId)}`);
if (result.status && result.body) {
state.memberQuantity = result.body.memberQuantity || 0;
}
} catch (error) {
console.error("Failed to fetch team member count:", error);
state.memberQuantity = 87;
}
}
async function fetchTeamBill() {
const teamId = getTeamId();
if (!teamId) return;
const result = await apiGet(`/team/bill?id=${encodeURIComponent(teamId)}`);
if (!result.status || !Array.isArray(result.body) || !result.body[0]) return;
const bill = result.body[0];
const billBelong = String(bill.billBelong || "");
state.teamBill = {
date: billBelong.length >= 6 ? `${billBelong.slice(0, 4)}.${billBelong.slice(4, 6)}` : "",
hostSalary: bill.settleResult?.memberSalary?.toFixed(2) || "",
agentSalary: bill.settleResult?.ownSalary?.toFixed(2) || "",
total: bill.settleResult?.totalSalary?.toFixed(2) || "",
status: formatBillStatus(bill.status)
};
}
async function fetchBankCards() {
const result = await apiGet("/wallet/bank-card/list");
if (result.status && result.body) {
state.bankCards = result.body;
state.defaultBankCard = state.bankCards.find((card) => card.use) || null;
}
}
async function fetchWithdrawInfo() {
const result = await apiGet("/wallet/withdraw-info/list");
if (result.status && Array.isArray(result.body) && result.body.length > 0) {
const info = result.body[0];
let previewUrls = [];
try {
previewUrls = JSON.parse(info.passportFrontUrl || "[]").map((item) => item);
} catch (error) {
console.warn("Failed to parse withdraw info preview urls:", error);
}
state.withdrawInfo = { ...info, previewUrls };
}
}
async function fetchWithdrawEnabled() {
const result = await apiGet("/wallet/bank/host-salary/withdraw/enabled");
if (result.status) state.withdrawEnabled = Boolean(result.body);
}
function render() {
document.getElementById("currentSalary").textContent = `$${state.salaryInfo.currentSalary}`;
document.getElementById("anchorType").textContent = state.taskInfo.anchorType;
document.getElementById("minutesProgress").textContent = state.taskInfo.minutesProgress;
document.getElementById("minutesTotal").textContent = state.taskInfo.minutesTotal;
document.getElementById("giftTask").textContent = state.taskInfo.giftTask;
document.querySelectorAll(".cash-withdraw-row").forEach((node) => {
node.hidden = !state.withdrawEnabled;
});
document.getElementById("fillInfoModal").hidden = !state.showFillInfoModal;
}
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 closePage() {
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");
}
}
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 openCashWithdraw() {
if (!state.withdrawInfo || !state.defaultBankCard) {
state.showFillInfoModal = true;
render();
return;
}
navigateTo("/cash-withdraw");
}
function bindEvents() {
const actions = {
back: closePage,
language: () => navigateTo("/language"),
message: () => navigateTo("/message"),
salaryDetails: () => navigateTo("/history-salary"),
platformPolicy: () => navigateTo("/platform-policy?from=agencycenter"),
exchangeCoins: () => navigateTo("/exchange-gold-coins"),
transfer: () => navigateTo("/transfer"),
cashWithdraw: openCashWithdraw,
bankAccounts: () => navigateTo("/agency-setting"),
teamMember: () => navigateTo(`/team-member?source=agency-center&members=${state.memberQuantity}`),
teamBill: () => navigateTo("/team-bill"),
inviteMembers: () => navigateTo("/invite-members"),
completeInfo: () => navigateTo("/agency-setting")
};
document.querySelectorAll("[data-action]").forEach((node) => {
const handler = actions[node.dataset.action];
if (handler) node.addEventListener("click", handler);
});
document.getElementById("fillInfoModal").addEventListener("click", (event) => {
if (event.target.id === "fillInfoModal") {
state.showFillInfoModal = false;
render();
}
});
}
async function initializeData() {
const firstWave = [
fetchUserProfile(),
fetchTeamInfo(),
fetchBankBalance(),
fetchWithdrawEnabled(),
fetchBankCards(),
fetchWithdrawInfo(),
fetchIdentity()
];
const firstResults = await Promise.allSettled(firstWave);
firstResults.forEach((result) => {
if (result.status === "rejected") console.warn("Agency center data request failed:", result.reason);
});
applyPermissionRedirect();
const secondWave = [
fetchWorkStatistics(),
fetchTeamMemberCount(),
fetchTeamBill(),
fetchMemberWorkTotal()
];
const secondResults = await Promise.allSettled(secondWave);
secondResults.forEach((result) => {
if (result.status === "rejected") console.warn("Agency center dependent request failed:", result.reason);
});
}
async function init() {
setLanguage();
setIcons();
bindEvents();
render();
localStorage.setItem("identity", JSON.stringify({ identity: "AGENCY" }));
localStorage.removeItem("payee");
try {
await connectToApp();
await initializeData();
} catch (error) {
console.warn("Agency center initialization failed:", error);
showToast(error.response?.errorMsg || error.message || t("failed_to_load_data"));
} finally {
render();
}
}
init();