/** * 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, '''); } 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 = '

分享链接后,邀请记录会显示在这里。

'; return; } listEl.innerHTML = items.map(function (item) { var name = item.invitee_name || (item.invitee_id ? '用户 #' + item.invitee_id : '受邀用户'); var avatar = item.invitee_avatar ? '' : '' + escapeHtml(name.charAt(0)) + ''; var status = item.status === 'rewarded' ? '已奖励' : (item.status === 'verified' ? '已验证' : '已注册'); return '
' + avatar + '' + escapeHtml(name) + '' + escapeHtml(formatDate(item.created_at)) + '' + status + '
'; }).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 = '

邀请记录加载失败,请稍后重试。

'; return; } renderList(result.json || {}, invitePage); }).catch(function () { listEl.classList.remove('is-loading'); listEl.innerHTML = '

邀请记录加载失败,请稍后重试。

'; }); } 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); }); }); } var withdrawModal = root.querySelector('[data-aksrt-commission-withdraw-modal]') || document.querySelector('[data-aksrt-commission-withdraw-modal]'); var withdrawForm = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-form]'); var withdrawTip = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-tip]'); var withdrawSubmit = withdrawModal && withdrawModal.querySelector('[data-aksrt-commission-withdraw-submit]'); var lastWithdrawTrigger = null; var withdrawBusy = false; function setWithdrawTip(text, error) { if (!withdrawTip) return; withdrawTip.textContent = text || ''; withdrawTip.classList.toggle('is-error', !!error); } function setWithdrawBusy(isBusy) { withdrawBusy = isBusy; if (withdrawSubmit) withdrawSubmit.disabled = isBusy; } function getWithdrawFocusable() { return Array.prototype.slice.call(withdrawModal.querySelectorAll('button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])')); } function closeWithdrawModal() { if (!withdrawModal || withdrawModal.hidden) return; withdrawModal.hidden = true; document.body.classList.remove('uc-modal-open'); if (lastWithdrawTrigger && typeof lastWithdrawTrigger.focus === 'function') { lastWithdrawTrigger.focus(); } } if (withdrawModal && withdrawForm) { document.querySelectorAll('[data-aksrt-commission-withdraw-open]').forEach(function (button) { button.addEventListener('click', function () { lastWithdrawTrigger = button; withdrawModal.hidden = false; document.body.classList.add('uc-modal-open'); window.requestAnimationFrame(function () { var amountInput = withdrawForm.querySelector('[data-aksrt-commission-withdraw-amount]'); if (amountInput) amountInput.focus(); }); }); }); withdrawModal.querySelectorAll('[data-aksrt-commission-withdraw-close]').forEach(function (button) { button.addEventListener('click', closeWithdrawModal); }); document.addEventListener('keydown', function (event) { if (withdrawModal.hidden) return; if (event.key === 'Escape') { event.preventDefault(); closeWithdrawModal(); return; } if (event.key !== 'Tab') return; var focusable = getWithdrawFocusable(); if (!focusable.length) return; var first = focusable[0]; var last = focusable[focusable.length - 1]; if (event.shiftKey && document.activeElement === first) { event.preventDefault(); last.focus(); } else if (!event.shiftKey && document.activeElement === last) { event.preventDefault(); first.focus(); } }); withdrawForm.addEventListener('submit', function (event) { event.preventDefault(); if (withdrawBusy) return; var values = new FormData(withdrawForm); var amount = Number(values.get('amount') || 0); var minimum = Number(root.getAttribute('data-min-amount') || 50); var account = String(values.get('account_info') || '').trim(); if (amount < minimum) { setWithdrawTip('提现金额未达到最低额度', true); return; } if (!account) { setWithdrawTip('请填写收款账户信息', true); return; } setWithdrawTip('正在提交...', false); setWithdrawBusy(true); fetch(rest + '/pay/balance/withdraw', { method: 'POST', credentials: 'same-origin', headers: { 'Content-Type': 'application/json', 'X-WP-Nonce': data.restNonce || data.nonce || '' }, body: JSON.stringify({ amount: amount, method: values.get('method') || 'alipay', account_info: account }) }).then(function (response) { return response.json().catch(function () { return {}; }).then(function (json) { return { ok: response.ok, json: json }; }); }).then(function (result) { if (!result.ok || !result.json || !result.json.success) { setWithdrawBusy(false); setWithdrawTip((result.json && result.json.message) || '提现申请失败', true); return; } setWithdrawTip('提现申请已提交', false); if (result.json.data && typeof result.json.data.wallet_balance !== 'undefined') { var balanceEl = root.querySelector('[data-aksrt-revenue-balance]'); if (balanceEl) balanceEl.textContent = Number(result.json.data.wallet_balance).toFixed(2); } withdrawForm.reset(); setWithdrawBusy(false); closeWithdrawModal(); reloadRevenuePanel().catch(function () { if (typeof showToast === 'function') showToast('提现已提交,但收益数据刷新失败'); }); }).catch(function () { setWithdrawBusy(false); setWithdrawTip('网络错误,请稍后重试', true); }); }); } } 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); }); }).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]')); })();