/** * 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('已签到 ' + j.streak + ' 天 +' + j.reward_today); btn.disabled = true; btn.innerHTML = '已签到'; setTip(''); } else { setStatusHtml('连续 ' + j.streak + ' 天,+' + 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, '&') .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'); 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 = '
分享链接后,好友注册记录会显示在这里。
'; 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 ? '' : '' + escapeHtml(first) + ''; return '
' + '
' + avatar + '
' + '
' + '' + escapeHtml(name) + '' + '' + (createdAt ? '注册于 ' + escapeHtml(createdAt) : '注册时间未知') + '' + '
' + '
' + '' + meta.label + '' + '' + escapeHtml(statusText) + '' + '
' + '
'; }).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 = '
邀请记录加载失败,请稍后刷新。
'; 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 = '
邀请记录加载失败,请稍后刷新。
'; 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 = '
未找到相关用户
'; return; } users.forEach(function (u) { var item = document.createElement('button'); item.type = 'button'; item.className = 'uc-transfer-user'; item.innerHTML = '' + (u.display_name || u.user_login) + '@' + (u.user_login || '') + ''; 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) return; 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(); }); }); } 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(); } })();