293 lines
9.9 KiB
JavaScript
293 lines
9.9 KiB
JavaScript
(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();
|
||
})();
|