207 lines
9.6 KiB
JavaScript
207 lines
9.6 KiB
JavaScript
/**
|
|
* Commission center referral link and invited-user records.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
function init(root) {
|
|
var data = window.aksrtData || {};
|
|
if (!root || !data) return;
|
|
|
|
var rest = data.restUrl || data.apiUrl || ((data.siteUrl || '').replace(/\/$/, '') + '/wp-json/aksrt/v1');
|
|
if (!rest) return;
|
|
rest = rest.replace(/\/?$/, '');
|
|
|
|
function api(path) {
|
|
return fetch(rest + path, {
|
|
credentials: 'same-origin',
|
|
headers: { 'X-WP-Nonce': data.restNonce || data.nonce || '' }
|
|
}).then(function (response) {
|
|
return response.json().catch(function () { return {}; }).then(function (json) {
|
|
return { ok: response.ok, json: json };
|
|
});
|
|
});
|
|
}
|
|
|
|
function escapeHtml(value) {
|
|
return String(value == null ? '' : value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
}
|
|
|
|
function formatDate(value) {
|
|
if (!value || value === '0000-00-00 00:00:00') return '';
|
|
var date = new Date(String(value).replace(' ', 'T') + 'Z');
|
|
return isNaN(date.getTime()) ? String(value).slice(0, 16) : date.toLocaleString();
|
|
}
|
|
|
|
var linkInput = root.querySelector('[data-invite-link]');
|
|
var codeEl = root.querySelector('[data-invite-code]');
|
|
var copyBtn = root.querySelector('[data-invite-copy]');
|
|
var statusEl = root.querySelector('[data-invite-status]');
|
|
var feedbackEl = root.querySelector('[data-invite-copy-feedback]');
|
|
var listEl = root.querySelector('[data-invite-list]');
|
|
var totalEl = root.querySelector('[data-invite-total]');
|
|
|
|
function setStatus(text, error) {
|
|
if (!statusEl) return;
|
|
statusEl.textContent = text || '';
|
|
statusEl.classList.toggle('is-error', !!error);
|
|
}
|
|
|
|
api('/invite/me').then(function (result) {
|
|
if (!result.ok) {
|
|
setStatus((result.json && result.json.message) || '推广数据加载失败', true);
|
|
return;
|
|
}
|
|
var payload = result.json || {};
|
|
if (linkInput) linkInput.value = payload.invite_url || '';
|
|
if (codeEl) codeEl.textContent = payload.code || '--';
|
|
if (copyBtn) copyBtn.disabled = !payload.invite_url;
|
|
setStatus('推广数据已更新', false);
|
|
}).catch(function () {
|
|
setStatus('推广数据加载失败,请稍后重试', true);
|
|
});
|
|
|
|
function renderPagination(total, current) {
|
|
if (!listEl || total <= 10) return;
|
|
var nav = root.querySelector('[data-invite-pagination]');
|
|
if (!nav) {
|
|
nav = document.createElement('nav');
|
|
nav.className = 'uc-reward-pagination';
|
|
nav.setAttribute('data-invite-pagination', 'true');
|
|
nav.setAttribute('aria-label', '邀请记录分页');
|
|
listEl.parentNode.appendChild(nav);
|
|
}
|
|
nav.innerHTML = '';
|
|
var pages = Math.ceil(total / 10);
|
|
for (var page = 1; page <= pages; page++) {
|
|
var url = new URL(window.location.href);
|
|
url.searchParams.set('reward_tab', 'users');
|
|
if (page > 1) url.searchParams.set('invite_page', String(page));
|
|
else url.searchParams.delete('invite_page');
|
|
var link = document.createElement('a');
|
|
link.href = url.toString();
|
|
link.textContent = String(page);
|
|
link.className = page === current ? 'is-active' : '';
|
|
nav.appendChild(link);
|
|
}
|
|
}
|
|
|
|
function renderList(payload, page) {
|
|
if (!listEl) return;
|
|
var items = Array.isArray(payload.items) ? payload.items : [];
|
|
var total = Number(payload.total || 0);
|
|
listEl.classList.remove('is-loading');
|
|
if (totalEl) totalEl.textContent = total ? total + ' 条' : '暂无记录';
|
|
if (!items.length) {
|
|
listEl.innerHTML = '<p class="uc-reward-empty">分享链接后,邀请记录会显示在这里。</p>';
|
|
return;
|
|
}
|
|
listEl.innerHTML = items.map(function (item) {
|
|
var name = item.invitee_name || (item.invitee_id ? '用户 #' + item.invitee_id : '受邀用户');
|
|
var avatar = item.invitee_avatar ? '<img src="' + escapeHtml(item.invitee_avatar) + '" alt="">' : '<span>' + escapeHtml(name.charAt(0)) + '</span>';
|
|
var status = item.status === 'rewarded' ? '已奖励' : (item.status === 'verified' ? '已验证' : '已注册');
|
|
return '<article class="uc-invite-record"><span class="uc-invite-record__avatar">' + avatar + '</span><span class="uc-invite-record__main"><strong>' + escapeHtml(name) + '</strong><span>' + escapeHtml(formatDate(item.created_at)) + '</span></span><span class="uc-invite-record__status">' + status + '</span></article>';
|
|
}).join('');
|
|
var currentPage = Number(payload.page || page);
|
|
renderPagination(total, isNaN(currentPage) ? 1 : currentPage);
|
|
}
|
|
|
|
if (listEl) {
|
|
var invitePage = 1;
|
|
try {
|
|
var requestedPage = parseInt(new URLSearchParams(window.location.search).get('invite_page') || '1', 10);
|
|
invitePage = isNaN(requestedPage) ? 1 : Math.max(1, requestedPage);
|
|
} catch (_) {}
|
|
api('/invite/list?per_page=10&page=' + invitePage).then(function (result) {
|
|
if (!result.ok) {
|
|
listEl.classList.remove('is-loading');
|
|
listEl.innerHTML = '<p class="uc-reward-empty">邀请记录加载失败,请稍后重试。</p>';
|
|
return;
|
|
}
|
|
renderList(result.json || {}, invitePage);
|
|
}).catch(function () {
|
|
listEl.classList.remove('is-loading');
|
|
listEl.innerHTML = '<p class="uc-reward-empty">邀请记录加载失败,请稍后重试。</p>';
|
|
});
|
|
}
|
|
|
|
if (copyBtn && linkInput) {
|
|
copyBtn.addEventListener('click', function () {
|
|
if (!linkInput.value) return;
|
|
var done = function () {
|
|
if (feedbackEl) feedbackEl.textContent = '推广链接已复制';
|
|
copyBtn.disabled = false;
|
|
};
|
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
navigator.clipboard.writeText(linkInput.value).then(done).catch(function () { linkInput.select(); document.execCommand('copy'); done(); });
|
|
} else {
|
|
linkInput.select();
|
|
document.execCommand('copy');
|
|
done();
|
|
}
|
|
});
|
|
}
|
|
function reloadRevenuePanel() {
|
|
var current = document.querySelector('[data-aksrt-revenue-page]');
|
|
if (!current) return Promise.resolve();
|
|
var panelUrl = rest + '/user-center/panel/revenue';
|
|
var query = new URL(window.location.href).searchParams;
|
|
query.delete('tab');
|
|
panelUrl += '?' + query.toString();
|
|
return fetch(panelUrl, {
|
|
credentials: 'same-origin',
|
|
headers: { 'X-WP-Nonce': data.restNonce || data.nonce || '' }
|
|
}).then(function (response) {
|
|
return response.json().then(function (payload) {
|
|
if (!response.ok || !payload.success || !payload.data || !payload.data.html) throw new Error('revenue-refresh-failed');
|
|
var wrapper = document.createElement('div');
|
|
wrapper.innerHTML = payload.data.html;
|
|
var next = wrapper.firstElementChild;
|
|
if (!next) throw new Error('revenue-html-empty');
|
|
current.replaceWith(next);
|
|
window.AKSRTRevenueCenterInit(next);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function initRewardNavigation(root, rest, data) {
|
|
var rewardTabs = root.querySelectorAll('.uc-reward-tabs a, .uc-reward-pagination a');
|
|
rewardTabs.forEach(function (link) {
|
|
link.addEventListener('click', function (event) {
|
|
event.preventDefault();
|
|
var targetUrl = new URL(link.href, window.location.href);
|
|
var panelUrl = rest + '/user-center/panel/revenue?' + targetUrl.searchParams.toString();
|
|
fetch(panelUrl, {
|
|
credentials: 'same-origin',
|
|
headers: { 'X-WP-Nonce': data.restNonce || data.nonce || '' }
|
|
}).then(function (response) {
|
|
return response.json().then(function (payload) {
|
|
if (!response.ok || !payload.success || !payload.data || !payload.data.html) throw new Error('revenue-load-failed');
|
|
var current = document.querySelector('[data-aksrt-revenue-page]');
|
|
if (!current) return;
|
|
var wrapper = document.createElement('div');
|
|
wrapper.innerHTML = payload.data.html;
|
|
var next = wrapper.firstElementChild;
|
|
if (!next) throw new Error('revenue-html-empty');
|
|
current.replaceWith(next);
|
|
window.history.pushState({}, '', targetUrl);
|
|
window.AKSRTRevenueCenterInit(next);
|
|
if (typeof window.AKSRTWithdrawInit === 'function') window.AKSRTWithdrawInit();
|
|
});
|
|
}).catch(function () {
|
|
if (typeof showToast === 'function') showToast('加载失败,请重试');
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
window.AKSRTRevenueCenterInit = function (root) {
|
|
init(root);
|
|
var data = window.aksrtData || {};
|
|
var rest = data.restUrl || data.apiUrl || '';
|
|
if (root && rest) initRewardNavigation(root, rest.replace(/\/$/, ''), data);
|
|
};
|
|
window.AKSRTRevenueCenterInit(document.querySelector('[data-aksrt-revenue-page]'));
|
|
})();
|