2026-07-12 17:38:53 +08:00

293 lines
9.9 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.

(function () {
'use strict';
var state = { range: null, data: null, loading: false, mutating: false };
function $(id) {
return document.getElementById(id);
}
function t(key, fallback) {
return window.HyAppI18n && window.HyAppI18n.t
? window.HyAppI18n.t(key, fallback)
: fallback || key;
}
function toast(message) {
if (window.HyAppToast) window.HyAppToast.show(message);
}
function count(value) {
return Number.isFinite(value)
? Number(value).toLocaleString(undefined, {
maximumFractionDigits: 0,
})
: '—';
}
function dateTime(value) {
return Number(value)
? new Date(Number(value)).toLocaleString(undefined, {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
})
: '—';
}
function renderProfile() {
if (!state.data) return;
var profile = state.data.profile || {};
$('profileName').textContent = profile.name || '—';
$('profileUID').textContent =
t('fami_common.uid_prefix', 'UID:') +
' ' +
(profile.displayUserId || profile.userId || '—');
$('profileInitial').textContent = String(profile.name || 'B')
.trim()
.charAt(0)
.toUpperCase();
$('profileAvatar').hidden = !profile.avatar;
$('profileInitial').hidden = !!profile.avatar;
if (profile.avatar) $('profileAvatar').src = profile.avatar;
$('contactValue').textContent = profile.contact || '—';
}
function agencyAvatar(item) {
var shell = document.createElement('span');
shell.className = 'agency-avatar';
if (item.avatar) {
var image = document.createElement('img');
image.src = item.avatar;
image.alt = '';
shell.appendChild(image);
} else {
shell.textContent = String(item.name || 'A')
.charAt(0)
.toUpperCase();
}
return shell;
}
function textCell(row, value) {
var cell = document.createElement('td');
cell.textContent = value;
row.appendChild(cell);
}
function renderAgencies() {
var agencies =
state.data && state.data.stats
? state.data.stats.agencies || []
: [];
var body = $('agencyTableBody');
body.textContent = '';
agencies.forEach(function (item) {
var row = document.createElement('tr');
var identityCell = document.createElement('td');
var identity = document.createElement('div');
identity.className = 'agency-identity';
identity.appendChild(agencyAvatar(item));
var copy = document.createElement('span');
copy.className = 'agency-copy';
var name = document.createElement('strong');
name.textContent = item.name || '—';
var id = document.createElement('span');
id.textContent =
t('fami_agency.id_prefix', 'Agency ID:') +
' ' +
(item.shortId || item.id || '—');
copy.appendChild(name);
copy.appendChild(id);
identity.appendChild(copy);
identityCell.appendChild(identity);
row.appendChild(identityCell);
textCell(row, item.ownerId || '—');
textCell(row, item.country || '—');
textCell(row, count(item.totalHosts));
textCell(row, count(item.giftedHostCount));
textCell(row, count(item.diamondEarnings));
textCell(row, dateTime(item.joinedAtMS));
body.appendChild(row);
});
$('agencyEmpty').hidden = agencies.length > 0;
}
function renderRange() {
document.querySelectorAll('[data-range]').forEach(function (button) {
button.setAttribute(
'aria-pressed',
button.getAttribute('data-range') === state.range.preset
? 'true'
: 'false'
);
button.disabled = state.loading;
});
$('rangeCaption').textContent =
state.range.startDate === state.range.endDate
? state.range.startDate
: state.range.startDate + ' ' + state.range.endDate;
}
function renderAll() {
renderProfile();
renderAgencies();
renderRange();
}
function setLoading(value) {
state.loading = value;
document.body.classList.toggle('is-loading', value);
renderRange();
}
function setMutating(value) {
state.mutating = value;
document.body.classList.toggle('is-mutating', value);
}
function load() {
setLoading(true);
return window.HyGuild.bdCenter
.load(state.range)
.then(function (data) {
state.data = data;
$('statsStatus').hidden = true;
renderAll();
})
.catch(function () {
$('statsStatus').hidden = false;
$('statsStatus').textContent = t(
'fami_bd.load_failed',
'Unable to load BD Center.'
);
toast($('statsStatus').textContent);
})
.finally(function () {
setLoading(false);
});
}
function selectRange(preset) {
if (preset === 'custom') {
$('rangeStart').value = state.range.startDate;
$('rangeEnd').value = state.range.endDate;
$('rangeDialog').showModal();
return;
}
state.range = window.HyGuild.dateRange.create(preset);
load();
}
function applyCustomRange(event) {
event.preventDefault();
try {
state.range = window.HyGuild.dateRange.create('custom', {
start: $('rangeStart').value,
end: $('rangeEnd').value,
});
} catch (_) {
toast(t('fami_range.invalid', 'Choose a valid date range.'));
return;
}
$('rangeDialog').close();
load();
}
function saveContact(event) {
event.preventDefault();
if (state.mutating) return;
var value = String($('contactInput').value || '').trim();
if (!value) {
toast(t('fami_agency.contact_required', 'Enter a contact number.'));
return;
}
setMutating(true);
window.HyGuild.bdCenter
.saveContact(value)
.then(function () {
state.data.profile.contact = value;
$('contactDialog').close();
renderProfile();
toast(t('fami_agency.contact_saved', 'Contact saved.'));
})
.catch(function () {
toast(
t(
'fami_agency.contact_save_failed',
'Unable to save contact.'
)
);
})
.finally(function () {
setMutating(false);
});
}
function inviteAgency(event) {
event.preventDefault();
if (state.mutating) return;
var ownerID = String($('ownerDisplayID').value || '').trim();
if (!ownerID) return;
setMutating(true);
window.HyGuild.bdCenter
.inviteAgency(ownerID, $('agencyNameInput').value)
.then(function () {
$('inviteDialog').close();
toast(
t(
'fami_bd.invite_sent',
'Invitation sent. The agency is created after acceptance.'
)
);
})
.catch(function () {
toast(t('fami_bd.invite_failed', 'Unable to invite agency.'));
})
.finally(function () {
setMutating(false);
});
}
function bind() {
$('backButton').addEventListener('click', function () {
if (window.history.length > 1) window.history.back();
else if (window.HyAppBridge) window.HyAppBridge.back();
});
$('editContactButton').addEventListener('click', function () {
$('contactInput').value =
(state.data && state.data.profile.contact) || '';
$('contactDialog').showModal();
});
$('cancelContactButton').addEventListener('click', function () {
$('contactDialog').close();
});
$('contactForm').addEventListener('submit', saveContact);
$('addAgencyButton').addEventListener('click', function () {
$('ownerDisplayID').value = '';
$('agencyNameInput').value = '';
$('inviteDialog').showModal();
});
$('cancelInviteButton').addEventListener('click', function () {
$('inviteDialog').close();
});
$('inviteForm').addEventListener('submit', inviteAgency);
$('rangeFilters').addEventListener('click', function (event) {
var button = event.target.closest('[data-range]');
if (button && !state.loading)
selectRange(button.getAttribute('data-range'));
});
$('cancelRangeButton').addEventListener('click', function () {
$('rangeDialog').close();
});
$('rangeForm').addEventListener('submit', applyCustomRange);
window.addEventListener('hyapp:i18n-ready', renderAll);
}
function init() {
state.range = window.HyGuild.dateRange.create('today');
bind();
renderRange();
load();
}
if (document.readyState === 'loading')
document.addEventListener('DOMContentLoaded', init);
else init();
})();