Files
wordpress-theme-aksrt/assets/js/credits.js
T
2026-08-06 14:33:24 +08:00

1030 lines
34 KiB
JavaScript

/**
* AKSRT Credits Frontend
*
* 功能:
* - 签到 panel:拉取 /signin/today,按钮触发 POST /signin
* - 邀请 panel:拉取 /invite/me,复制邀请链接
*
* 仅在 page-profile 页面 + 启用积分时加载。
*/
(function () {
'use strict';
var aksrt = window.aksrtData;
if (!aksrt) {
return;
}
var activePoll = null;
function api(path, options) {
return window.AksrtRequest.request(path, options || {}).then(function (response) {
return {
ok: response.ok,
status: response.status,
json: response.json || {},
data: response.data,
};
}).catch(function (error) {
var response = error && error.response ? error.response : {};
return {
ok: false,
status: error && error.status ? error.status : (response.status || 0),
json: error && error.json ? error.json : (response.json || { message: error && error.message }),
};
});
}
// ===== 签到 =====
function initSignin() {
var root = document.querySelector('[data-aksrt-signin]');
if (!root) return;
var status = root.querySelector('[data-signin-status]');
var btn = root.querySelector('[data-signin-btn]');
var tip = root.querySelector('[data-signin-tip]');
if (!btn) return;
function setStatus(text) { if (status) status.textContent = text; }
function setStatusHtml(html) { if (status) status.innerHTML = html; }
function setTip(text) { if (tip) tip.textContent = text; }
function refresh() {
api('/signin/today').then(function (r) {
if (!r.ok) {
setStatus((r.json && r.json.message) || '加载失败 (HTTP ' + r.status + ')');
return;
}
var j = r.json;
if (!j.enabled) {
setStatus('签到功能未启用');
btn.disabled = true;
setTip('');
return;
}
if (j.signed) {
setStatusHtml('已签到 <strong>' + j.streak + '</strong> 天 +' + j.reward_today);
btn.disabled = true;
btn.innerHTML = '已签到';
setTip('');
} else {
setStatusHtml('连续 <strong>' + j.streak + '</strong> 天,+' + j.reward_if_signin);
btn.disabled = false;
setTip('');
}
}).catch(function (err) {
if (window.console) console.error('[AKSRT Credits] /signin/today 请求失败:', err);
setStatus('加载失败,请刷新重试');
});
}
function collectCaptcha() {
var el = document.querySelector('[data-signin-captcha]');
if (!el) return {};
var out = {};
var keys = [
'captcha_verified', 'cf_turnstile_response',
'tencent_ticket', 'tencent_randstr', 'tencent_sid',
'geetest_lot_number', 'geetest_captcha_output', 'geetest_pass_token', 'geetest_gen_time',
'aliyun_captcha_verify_param',
];
keys.forEach(function (k) {
var inp = el.querySelector('input[name="' + k + '"]');
if (inp && inp.value !== '') out[k] = inp.value;
});
return out;
}
function resetCaptcha() {
try {
var state = window.AKSRTCaptchaState;
var scene = state && state.scenes && state.scenes.signin;
if (scene && typeof scene.reset === 'function') scene.reset();
} catch (_) {}
}
function triggerCaptcha(onSuccess, onFail) {
var mount = document.querySelector('[data-signin-captcha]');
var state = window.AKSRTCaptchaState;
var scene = state && state.scenes && state.scenes.signin;
if (scene && typeof scene.verify === 'function') {
scene.verify(function (ok) {
if (ok === false) {
if (typeof onFail === 'function') onFail('已取消验证');
return;
}
onSuccess();
});
return;
}
if (mount) {
if (typeof onFail === 'function') onFail('人机验证加载中,请稍候再试');
return;
}
onSuccess();
}
btn.addEventListener('click', function () {
btn.disabled = true;
btn.innerHTML = '…';
setTip('');
triggerCaptcha(function () {
doSignin();
}, function (msg) {
resetCaptcha();
if (msg) setTip(msg);
btn.disabled = false;
btn.innerHTML = '签到';
});
function doSignin() {
api('/signin', {
method: 'POST',
body: JSON.stringify({ captcha: collectCaptcha() })
}).then(function (r) {
if (!r.ok) {
resetCaptcha();
setTip((r.json && r.json.message) || '签到失败');
btn.disabled = false;
btn.innerHTML = '签到';
return;
}
setTip('签到成功,获得 ' + r.json.reward + ' 积分(连续 ' + r.json.streak + ' 天)');
var balanceEls = document.querySelectorAll('[data-credits-value]');
balanceEls.forEach(function (el) { el.textContent = r.json.balance.toLocaleString(); });
refresh();
}).catch(function () {
resetCaptcha();
setTip('网络错误,请重试');
btn.disabled = false;
btn.innerHTML = '签到';
});
}
});
refresh();
}
// Task-list "去签到" → scroll + click the real asset-card sign-in button.
function initSigninGoto() {
document.querySelectorAll('[data-aksrt-signin-goto]').forEach(function (el) {
el.addEventListener('click', function (e) {
e.preventDefault();
var root = document.querySelector('[data-aksrt-signin]');
var btn = root ? root.querySelector('[data-signin-btn]') : null;
if (!btn) return;
try {
if (root && typeof root.scrollIntoView === 'function') {
root.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
} catch (_) {}
if (!btn.disabled) {
btn.click();
} else {
btn.focus();
}
});
});
}
// ===== 邀请 =====
function initInvite() {
var root = document.querySelector('[data-aksrt-invite]');
if (!root) return;
var linkInput = root.querySelector('[data-invite-link]');
var copyBtn = root.querySelector('[data-invite-copy]');
var stats = root.querySelector('[data-invite-stats]');
var codeEl = root.querySelector('[data-invite-code]');
var listEl = root.querySelector('[data-invite-list]');
var totalEl = root.querySelector('[data-invite-total]');
var statusEl = root.querySelector('[data-invite-status]');
var copyFeedback = root.querySelector('[data-invite-copy-feedback]');
function setStatus(text, isError) {
if (!statusEl) return;
statusEl.textContent = text;
statusEl.classList.toggle('is-error', !!isError);
}
function setCopyFeedback(text, isError) {
if (!copyFeedback) return;
copyFeedback.textContent = text;
copyFeedback.classList.toggle('is-error', !!isError);
}
function escapeHtml(value) {
return String(value == null ? '' : value)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;');
}
function formatDate(value) {
if (!value || value === '0000-00-00 00:00:00') return '';
var date = new Date(String(value).replace(' ', 'T') + 'Z');
if (isNaN(date.getTime())) return String(value).slice(0, 16);
function pad(n) { return n < 10 ? '0' + n : String(n); }
return date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()) + ' ' + pad(date.getHours()) + ':' + pad(date.getMinutes());
}
function statusMeta(status) {
if (status === 'rewarded') {
return { label: '已奖励', text: '奖励已发放', className: 'is-rewarded' };
}
if (status === 'verified') {
return { label: '已验证', text: '等待奖励发放', className: 'is-verified' };
}
return { label: '已注册', text: '等待完成验证', className: 'is-registered' };
}
function setCopyText(text) {
if (!copyBtn) return;
var label = copyBtn.querySelector('span');
if (label) label.textContent = text;
else copyBtn.textContent = text;
}
function renderInviteList(items, total) {
if (!listEl) return;
listEl.classList.remove('is-loading');
if (totalEl) {
if (total > items.length) totalEl.textContent = '最近 ' + items.length + ' 条 / 共 ' + total + ' 条';
else totalEl.textContent = total ? '共 ' + total + ' 条' : '暂无记录';
}
if (!items.length) {
listEl.innerHTML = '<div class="uc-promotion-record-empty">分享链接后,好友注册记录会显示在这里。</div>';
return;
}
listEl.innerHTML = items.map(function (item) {
var name = item.invitee_name || (item.invitee_id ? '用户 #' + item.invitee_id : '受邀用户');
var first = name ? name.charAt(0).toUpperCase() : '?';
var meta = statusMeta(item.status);
var createdAt = formatDate(item.created_at);
var rewardedAt = formatDate(item.rewarded_at);
var statusText = meta.text;
if (item.status === 'rewarded' && rewardedAt) statusText = '奖励于 ' + rewardedAt;
var avatar = item.invitee_avatar
? '<img src="' + escapeHtml(item.invitee_avatar) + '" alt="">'
: '<span>' + escapeHtml(first) + '</span>';
return '<div class="uc-promotion-record ' + meta.className + '">' +
'<div class="uc-promotion-record__avatar">' + avatar + '</div>' +
'<div class="uc-promotion-record__main">' +
'<strong>' + escapeHtml(name) + '</strong>' +
'<span>' + (createdAt ? '注册于 ' + escapeHtml(createdAt) : '注册时间未知') + '</span>' +
'</div>' +
'<div class="uc-promotion-record__status">' +
'<span class="uc-promotion-badge ' + meta.className + '">' + meta.label + '</span>' +
'<small>' + escapeHtml(statusText) + '</small>' +
'</div>' +
'</div>';
}).join('');
}
api('/invite/me').then(function (r) {
if (!r.ok) {
if (linkInput) linkInput.value = '';
if (copyBtn) copyBtn.disabled = true;
if (codeEl) codeEl.textContent = '--';
if (stats) {
stats.querySelectorAll('[data-stat]').forEach(function (el) {
el.textContent = '—';
});
}
setStatus((r.json && r.json.message) || '推广数据加载失败,请稍后刷新。', true);
return;
}
var j = r.json || {};
if (linkInput) linkInput.value = j.invite_url || '';
if (copyBtn) copyBtn.disabled = !j.invite_url;
if (codeEl) codeEl.textContent = j.code || '--';
if (stats && j.stats) {
stats.querySelectorAll('[data-stat]').forEach(function (el) {
var k = el.getAttribute('data-stat');
el.textContent = (j.stats[k] || 0).toString();
});
}
setStatus('推广数据已更新。');
}).catch(function () {
if (copyBtn) copyBtn.disabled = true;
if (codeEl) codeEl.textContent = '--';
if (stats) {
stats.querySelectorAll('[data-stat]').forEach(function (el) {
el.textContent = '—';
});
}
setStatus('推广数据加载失败,请检查网络后重试。', true);
});
if (listEl) {
api('/invite/list?per_page=8').then(function (r) {
if (!r.ok) {
listEl.classList.remove('is-loading');
listEl.innerHTML = '<div class="uc-promotion-record-empty">邀请记录加载失败,请稍后刷新。</div>';
if (totalEl) totalEl.textContent = '加载失败';
return;
}
var j = r.json || {};
renderInviteList(j.items || [], Number(j.total || 0));
}).catch(function () {
listEl.classList.remove('is-loading');
listEl.innerHTML = '<div class="uc-promotion-record-empty">邀请记录加载失败,请稍后刷新。</div>';
if (totalEl) totalEl.textContent = '加载失败';
});
}
if (!copyBtn) return;
var copying = false;
copyBtn.addEventListener('click', function () {
if (copying || !linkInput || !linkInput.value) return;
copying = true;
copyBtn.disabled = true;
setCopyFeedback('正在复制…');
function copied() {
setCopyText('已复制');
setCopyFeedback('推广链接已复制到剪贴板。');
setTimeout(function () {
setCopyText('复制链接');
setCopyFeedback('');
copyBtn.disabled = false;
copying = false;
}, 2000);
}
function copyFailed() {
setCopyText('复制链接');
setCopyFeedback('复制失败,请手动选择并复制链接。', true);
copyBtn.disabled = false;
copying = false;
linkInput.focus();
linkInput.select();
}
if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
navigator.clipboard.writeText(linkInput.value).then(copied).catch(copyFailed);
return;
}
linkInput.focus();
linkInput.select();
try {
if (document.execCommand('copy')) {
copied();
return;
}
} catch (_) {}
copyFailed();
});
}
// ===== VIP 积分兑换 =====
function initVipPointsExchange() {
var root = document.querySelector('[data-aksrt-vip-points]');
if (!root || !window.AksrtModalRuntime.isRolloutEnabled('vip')) return;
var tip = root.querySelector('[data-aksrt-vip-points-tip]');
var busy = false;
var coordinator = window.AksrtVipPurchaseCoordinator;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
root.addEventListener('click', function (e) {
var btn = e.target.closest('[data-aksrt-vip-points-buy]');
if (!btn || busy || btn.disabled) return;
e.preventDefault();
var packageId = parseInt(btn.getAttribute('data-package-id') || '0', 10);
if (!packageId) return;
busy = true;
btn.classList.add('is-loading');
setTip('正在兑换…');
coordinator.exchange({
packageId: packageId,
tags: ['vip', 'orders']
}).then(function (r) {
busy = false;
btn.classList.remove('is-loading');
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '兑换失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
setTip((data && data.message) || '兑换成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
btn.classList.remove('is-loading');
setTip('网络错误,请重试', true);
});
});
}
// ===== VIP 开通 =====
function initVipShop() {
var root = document.querySelector('[data-aksrt-vip-shop]');
if (!root || !window.AksrtModalRuntime.isRolloutEnabled('vip')) return;
var tip = root.querySelector('[data-aksrt-vip-tip]');
var busy = false;
var coordinator = window.AksrtVipPurchaseCoordinator;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
function selectedMethod() {
var fixed = root.querySelector('[data-aksrt-vip-method-fixed]');
if (fixed && fixed.value) return fixed.value;
var checked = root.querySelector('input[name="aksrt_vip_pay_method"]:checked');
if (checked) return checked.value;
var first = root.querySelector('input[name="aksrt_vip_pay_method"]');
return first ? first.value : 'balance';
}
root.addEventListener('click', function (e) {
var btn = e.target.closest('[data-aksrt-vip-buy]');
if (!btn || busy) return;
e.preventDefault();
var packageId = parseInt(btn.getAttribute('data-package-id') || '0', 10);
if (!packageId) return;
busy = true;
btn.disabled = true;
btn.classList.add('is-loading');
setTip('正在创建订单…');
coordinator.start({
packageId: packageId,
paymentMethod: selectedMethod(),
tags: ['vip', 'orders'],
onPending: function (data) {
busy = false;
btn.disabled = false;
btn.classList.remove('is-loading');
if (data.payment_url) window.open(data.payment_url, '_blank');
setTip(data.message || '请完成支付,支付成功后将自动刷新。');
},
onSuccess: function (result) {
busy = false;
btn.disabled = false;
btn.classList.remove('is-loading');
setTip((result.data && result.data.message) || '开通成功,正在刷新…');
window.location.reload();
},
onFailure: function () {
busy = false;
btn.disabled = false;
btn.classList.remove('is-loading');
setTip('支付未完成,请重试。', true);
},
onTimeout: function () {
busy = false;
btn.disabled = false;
btn.classList.remove('is-loading');
setTip('支付状态暂未确认,请稍后在订单中心查看。', true);
},
onError: function (response) {
busy = false;
btn.disabled = false;
btn.classList.remove('is-loading');
setTip((response.json && response.json.message) || '开通失败', true);
}
});
});
}
// ===== 卡密兑换(余额 / 会员) =====
function initCardPass() {
var roots = document.querySelectorAll('[data-aksrt-card-pass]');
if (!roots || !roots.length) return;
Array.prototype.forEach.call(roots, function (root) {
var tip = root.querySelector('[data-aksrt-card-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
var btn = root.querySelector('[data-aksrt-card-redeem]');
if (!btn) return;
btn.addEventListener('click', function () {
if (busy || btn.disabled) return;
var type = btn.getAttribute('data-type') || root.getAttribute('data-aksrt-card-pass') || '';
var pwInput = root.querySelector('[data-aksrt-card-password]');
var cardInput = root.querySelector('[data-aksrt-card-no]');
var password = pwInput ? String(pwInput.value || '').trim() : '';
var card = cardInput ? String(cardInput.value || '').trim() : '';
if (!password) {
setTip('请输入卡密', true);
if (pwInput) pwInput.focus();
return;
}
if (cardInput && !card) {
setTip('请输入卡号', true);
cardInput.focus();
return;
}
busy = true;
btn.disabled = true;
setTip('正在兑换…');
var body = { password: password, type: type };
if (card) body.card = card;
api('/pay/card-pass/redeem', {
method: 'POST',
body: JSON.stringify(body)
}).then(function (r) {
busy = false;
btn.disabled = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '兑换失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
if (type === 'vip' && window.AksrtModalRuntime && typeof window.AksrtModalRuntime.invalidate === 'function') {
window.AksrtModalRuntime.invalidate(['vip', 'orders']);
}
setTip((data && data.message) || '兑换成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
btn.disabled = false;
setTip('网络错误,请重试', true);
});
});
});
}
// ===== 余额充值 / 转账 / 积分兑余额(Zibll 资产中心) =====
function openModal(el) {
if (!el) return;
el.hidden = false;
el.classList.add('is-open');
document.body.classList.add('uc-modal-open');
}
function closeModal(el) {
if (!el) return;
if (activePoll && typeof activePoll.abort === 'function') activePoll.abort();
activePoll = null;
el.hidden = true;
el.classList.remove('is-open');
if (!document.querySelector('.uc-modal.is-open')) {
document.body.classList.remove('uc-modal-open');
}
}
function pollPaidOrder(orderNumber, setTip, tags) {
var coordinator = window.AksrtVipPurchaseCoordinator;
if (!orderNumber) return;
var handle = coordinator.poll(orderNumber, {
tags: tags || ['credits', 'orders'],
onTerminal: function (result) {
activePoll = null;
if (result.success) {
if (typeof setTip === 'function') setTip('支付成功,正在刷新…');
window.location.reload();
}
}
});
return handle;
}
function initBalanceCharge() {
var modal = document.querySelector('[data-aksrt-charge-modal]');
if (!modal) return;
var form = modal.querySelector('[data-aksrt-charge-form]');
var tip = modal.querySelector('[data-aksrt-charge-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
document.querySelectorAll('[data-aksrt-charge-open]').forEach(function (btn) {
btn.addEventListener('click', function () { openModal(modal); });
});
modal.querySelectorAll('[data-aksrt-charge-close]').forEach(function (btn) {
btn.addEventListener('click', function () {
if (activePoll && typeof activePoll.abort === 'function') activePoll.abort();
activePoll = null;
closeModal(modal);
});
});
modal.querySelectorAll('.uc-charge-package input').forEach(function (inp) {
inp.addEventListener('change', function () {
modal.querySelectorAll('.uc-charge-package').forEach(function (el) {
el.classList.toggle('is-active', el.contains(inp) && inp.checked);
});
});
});
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
if (busy) return;
var pkgInput = form.querySelector('input[name="balance_package"]:checked') || form.querySelector('input[name="balance_package"]');
var pkg = pkgInput ? pkgInput.value : 'custom';
var customEl = form.querySelector('input[name="custom_price"]');
var custom = customEl ? parseFloat(customEl.value || '0') : 0;
if (custom > 0) {
pkg = 'custom';
}
if ((!pkg || pkg === 'custom') && !(custom > 0) && !pkgInput) {
setTip('请选择或输入充值金额', true);
return;
}
if (pkg === 'custom' && !(custom > 0)) {
setTip('请输入有效充值金额', true);
return;
}
var methodEl = form.querySelector('input[name="payment_method"]:checked');
var method = methodEl ? methodEl.value : 'alipay';
busy = true;
setTip('正在创建订单…');
api('/pay/balance/charge', {
method: 'POST',
body: JSON.stringify({
package: pkg,
custom_price: custom,
payment_method: method
})
}).then(function (r) {
busy = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '充值失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
if (data && data.redirect && (data.payment_url || data.qr_content)) {
if (data.payment_url) window.open(data.payment_url, '_blank');
setTip(data.message || '请完成支付,支付成功后将自动刷新。');
if (data.order_number) activePoll = pollPaidOrder(data.order_number, setTip, ['credits', 'orders']);
return;
}
setTip((data && data.message) || '充值成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
setTip('网络错误,请重试', true);
});
});
}
function initTransfer() {
var modal = document.querySelector('[data-aksrt-transfer-modal]');
if (!modal) return;
var form = modal.querySelector('[data-aksrt-transfer-form]');
var tip = modal.querySelector('[data-aksrt-transfer-tip]');
var results = modal.querySelector('[data-aksrt-transfer-results]');
var selected = modal.querySelector('[data-aksrt-transfer-selected]');
var recipientInput = modal.querySelector('[data-aksrt-transfer-recipient]');
var typeInput = modal.querySelector('[data-aksrt-transfer-type]');
var title = modal.querySelector('[data-aksrt-transfer-title]');
var searchTimer = null;
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
document.querySelectorAll('[data-aksrt-transfer-open]').forEach(function (btn) {
btn.addEventListener('click', function () {
var type = btn.getAttribute('data-aksrt-transfer-open') || 'balance';
if (typeInput) typeInput.value = type;
if (title) title.textContent = type === 'points' ? '积分转账' : '余额转账';
if (results) results.innerHTML = '';
if (selected) selected.textContent = '';
if (recipientInput) recipientInput.value = '';
setTip('');
openModal(modal);
});
});
modal.querySelectorAll('[data-aksrt-transfer-close]').forEach(function (btn) {
btn.addEventListener('click', function () { closeModal(modal); });
});
var searchEl = modal.querySelector('[data-aksrt-transfer-search]');
if (searchEl) {
searchEl.addEventListener('input', function () {
var q = String(searchEl.value || '').trim();
if (searchTimer) clearTimeout(searchTimer);
if (q.length < 1) {
if (results) results.innerHTML = '';
return;
}
searchTimer = setTimeout(function () {
api('/pay/transfer/search?s=' + encodeURIComponent(q)).then(function (r) {
if (!results) return;
results.innerHTML = '';
if (!r.ok) return;
var data = (r.json && r.json.data) ? r.json.data : r.json;
var users = (data && data.users) || [];
if (!users.length) {
results.innerHTML = '<div class="muted-2-color em09">未找到相关用户</div>';
return;
}
users.forEach(function (u) {
var item = document.createElement('button');
item.type = 'button';
item.className = 'uc-transfer-user';
item.innerHTML = '<img src="' + (u.avatar || '') + '" alt="" class="uc-transfer-user__avatar"><span>' + (u.display_name || u.user_login) + '</span><span class="muted-2-color em09">@' + (u.user_login || '') + '</span>';
item.addEventListener('click', function () {
if (recipientInput) recipientInput.value = String(u.id);
if (selected) selected.textContent = '已选择:' + (u.display_name || u.user_login);
results.innerHTML = '';
});
results.appendChild(item);
});
});
}, 280);
});
}
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
if (busy) return;
var type = typeInput ? typeInput.value : 'balance';
var recipient = recipientInput ? parseInt(recipientInput.value || '0', 10) : 0;
var amountEl = form.querySelector('[data-aksrt-transfer-amount]');
var amount = amountEl ? amountEl.value : 0;
if (!recipient) {
setTip('请选择收款用户', true);
return;
}
if (!(parseFloat(amount) > 0)) {
setTip('请输入有效金额', true);
return;
}
busy = true;
setTip('正在转账…');
api('/pay/transfer', {
method: 'POST',
body: JSON.stringify({ type: type, recipient: recipient, amount: amount })
}).then(function (r) {
busy = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '转账失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
setTip((data && data.message) || '转账成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
setTip('网络错误,请重试', true);
});
});
}
function initExchange() {
var modal = document.querySelector('[data-aksrt-exchange-modal]');
if (!modal) return;
var form = modal.querySelector('[data-aksrt-exchange-form]');
var tip = modal.querySelector('[data-aksrt-exchange-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
document.querySelectorAll('[data-aksrt-exchange-open]').forEach(function (btn) {
btn.addEventListener('click', function () { openModal(modal); });
});
modal.querySelectorAll('[data-aksrt-exchange-close]').forEach(function (btn) {
btn.addEventListener('click', function () { closeModal(modal); });
});
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
if (busy) return;
var pointsEl = form.querySelector('[data-aksrt-exchange-points]');
var points = pointsEl ? parseInt(pointsEl.value || '0', 10) : 0;
if (!(points > 0)) {
setTip('请输入兑换积分数量', true);
return;
}
busy = true;
setTip('正在兑换…');
api('/pay/balance/exchange', {
method: 'POST',
body: JSON.stringify({ points: points })
}).then(function (r) {
busy = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '兑换失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
setTip((data && data.message) || '兑换成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
setTip('网络错误,请重试', true);
});
});
}
function initPointsBuy() {
var modal = document.querySelector('[data-aksrt-points-buy-modal]');
if (!modal) return;
var form = modal.querySelector('[data-aksrt-points-buy-form]');
var tip = modal.querySelector('[data-aksrt-points-buy-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
document.querySelectorAll('[data-aksrt-points-buy-open]').forEach(function (btn) {
btn.addEventListener('click', function () { openModal(modal); });
});
modal.querySelectorAll('[data-aksrt-points-buy-close]').forEach(function (btn) {
btn.addEventListener('click', function () { closeModal(modal); });
});
modal.querySelectorAll('.uc-charge-package input').forEach(function (inp) {
inp.addEventListener('change', function () {
modal.querySelectorAll('.uc-charge-package').forEach(function (el) {
el.classList.toggle('is-active', el.contains(inp) && inp.checked);
});
});
});
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
if (busy) return;
var pkgInput = form.querySelector('input[name="points_package"]:checked') || form.querySelector('input[name="points_package"]');
var pkg = pkgInput ? pkgInput.value : 'custom';
var customEl = form.querySelector('[data-aksrt-points-buy-custom]');
var custom = customEl ? parseInt(customEl.value || '0', 10) : 0;
if (custom > 0) pkg = 'custom';
if (pkg === 'custom' && !(custom > 0)) {
setTip('请输入购买积分数量', true);
return;
}
var methodEl = form.querySelector('input[name="points_pay_method"]:checked');
var method = methodEl ? methodEl.value : 'alipay';
busy = true;
setTip('正在创建订单…');
api('/pay/points/buy', {
method: 'POST',
body: JSON.stringify({
package: pkg,
custom_points: custom,
payment_method: method
})
}).then(function (r) {
busy = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '购买失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
if (data && data.redirect && (data.payment_url || data.qr_content)) {
if (data.payment_url) window.open(data.payment_url, '_blank');
setTip(data.message || '请完成支付,支付成功后将自动刷新。');
if (data.order_number) activePoll = pollPaidOrder(data.order_number, setTip, ['credits', 'orders']);
return;
}
setTip((data && data.message) || '购买成功,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
setTip('网络错误,请重试', true);
});
});
}
function initWithdraw() {
var modal = document.querySelector('[data-aksrt-withdraw-modal]');
if (!modal || modal.dataset.aksrtWithdrawInitialized === '1') return;
modal.dataset.aksrtWithdrawInitialized = '1';
var form = modal.querySelector('[data-aksrt-withdraw-form]');
var tip = modal.querySelector('[data-aksrt-withdraw-tip]');
var busy = false;
function setTip(text, isError) {
if (!tip) return;
tip.textContent = text || '';
tip.classList.toggle('is-error', !!isError);
}
document.querySelectorAll('[data-aksrt-withdraw-open]').forEach(function (btn) {
btn.addEventListener('click', function () { openModal(modal); });
});
modal.querySelectorAll('[data-aksrt-withdraw-close]').forEach(function (btn) {
btn.addEventListener('click', function () { closeModal(modal); });
});
if (!form) return;
form.addEventListener('submit', function (e) {
e.preventDefault();
if (busy) return;
var amountEl = form.querySelector('[data-aksrt-withdraw-amount]');
var methodEl = form.querySelector('[data-aksrt-withdraw-method]');
var accountEl = form.querySelector('[data-aksrt-withdraw-account]');
var amount = amountEl ? parseFloat(amountEl.value || '0') : 0;
var method = methodEl ? methodEl.value : 'alipay';
var account = accountEl ? String(accountEl.value || '').trim() : '';
if (!(amount > 0)) {
setTip('请输入提现金额', true);
return;
}
if (!account) {
setTip('请填写收款账号信息', true);
return;
}
busy = true;
setTip('正在提交…');
api('/pay/balance/withdraw', {
method: 'POST',
body: JSON.stringify({ amount: amount, method: method, account_info: account })
}).then(function (r) {
busy = false;
if (!r.ok || (r.json && r.json.code && !r.json.success)) {
setTip((r.json && r.json.message) || '提现失败', true);
return;
}
var data = (r.json && r.json.data) ? r.json.data : r.json;
setTip((data && data.message) || '申请已提交,正在刷新…');
window.location.reload();
}).catch(function () {
busy = false;
setTip('网络错误,请重试', true);
});
});
}
function initAssetTabs() {
var nav = document.querySelectorAll('[data-aksrt-asset-tab]');
if (!nav.length) return;
nav.forEach(function (link) {
link.addEventListener('click', function (e) {
e.preventDefault();
var key = link.getAttribute('data-aksrt-asset-tab');
document.querySelectorAll('.uc-asset-tabs__nav [data-aksrt-asset-tab]').forEach(function (a) {
var li = a.closest('li');
if (!li) return;
var aKey = a.getAttribute('data-aksrt-asset-tab');
var on = aKey === key || (key === 'points_date' && aKey === 'points_free');
li.classList.toggle('active', on);
});
var tabs = document.querySelector('.uc-asset-tabs');
if (tabs && typeof tabs.scrollIntoView === 'function') {
tabs.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
document.querySelectorAll('[data-aksrt-asset-pane]').forEach(function (pane) {
var on = pane.getAttribute('data-aksrt-asset-pane') === key;
pane.classList.toggle('is-active', on);
pane.hidden = !on;
});
});
});
}
function initWithdrawHistory() {
var modal = document.querySelector('[data-aksrt-withdraw-history-modal]');
if (!modal) return;
function open() { modal.hidden = false; document.body.classList.add('uc-modal-open'); }
function close() { modal.hidden = true; document.body.classList.remove('uc-modal-open'); }
document.querySelectorAll('[data-aksrt-withdraw-history-open]').forEach(function (btn) {
btn.addEventListener('click', function (e) { e.preventDefault(); open(); });
});
modal.querySelectorAll('[data-aksrt-withdraw-history-close]').forEach(function (btn) {
btn.addEventListener('click', function (e) { e.preventDefault(); close(); });
});
}
window.AKSRTWithdrawInit = initWithdraw;
function bootAssets() {
initSignin();
initSigninGoto();
initInvite();
initVipShop();
initVipPointsExchange();
initCardPass();
initBalanceCharge();
initTransfer();
initExchange();
initPointsBuy();
initWithdraw();
initWithdrawHistory();
initAssetTabs();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', bootAssets);
} else {
bootAssets();
}
})();