/** * AKSRT global sign-in controller. * * All sign-in buttons share one REST request, captcha and toast flow. */ (function () { 'use strict'; if (!window.aksrtData) { return; } var signinBusy = false; function api(path, options) { return window.AksrtRequest.request(path, options || {}).then(function (response) { return { ok: response.ok, status: response.status, json: response.json || {} }; }).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 buttons = Array.prototype.slice.call(document.querySelectorAll('[data-signin-btn]')); var freshButtons = buttons.filter(function (button) { return button.dataset.aksrtSigninInitialized !== '1'; }); if (!freshButtons.length) return; freshButtons.forEach(function (button) { button.dataset.aksrtSigninInitialized = '1'; }); function statuses() { return document.querySelectorAll('[data-signin-status]'); } function currentButtons() { return document.querySelectorAll('[data-signin-btn]'); } function setStatus(text) { statuses().forEach(function (status) { status.textContent = text; }); } function setStatusHtml(html) { statuses().forEach(function (status) { status.innerHTML = html; }); } function setButtonState(state) { currentButtons().forEach(function (button) { var label = button.querySelector('[data-signin-label]'); var text = state === 'done' ? button.getAttribute('data-signin-done-label') || '已签到' : (state === 'busy' ? '…' : button.getAttribute('data-signin-idle-label') || '签到'); if (label) label.textContent = text; button.disabled = state !== 'idle'; button.classList.toggle('is-done', state === 'done'); }); } function refresh() { api('/signin/today').then(function (result) { if (!result.ok) { var message = (result.json && result.json.message) || '签到状态加载失败 (HTTP ' + result.status + ')'; setStatus(message); notyf(message, 'danger'); return; } var data = result.json; if (!data.enabled) { setStatus('签到功能未启用'); setButtonState('done'); return; } if (data.signed) { setStatusHtml('已签到 ' + data.streak + ' 天 +' + data.reward_today); setButtonState('done'); return; } setStatusHtml('连续 ' + data.streak + ' 天,+' + data.reward_if_signin); setButtonState('idle'); }); } function captchaMount() { return document.querySelector('[data-signin-captcha]'); } function doSignin(captchaPayload) { notyf('正在签到…', 'load', '', 'aksrt-balance-signin-toast'); api('/signin', { method: 'POST', body: JSON.stringify({ captcha: captchaPayload || {} }) }).then(function (result) { signinBusy = false; if (!result.ok) { notyf((result.json && result.json.message) || '签到失败', 'danger', 5, 'aksrt-balance-signin-toast'); setButtonState('idle'); return; } notyf(result.json.message || '签到成功', 'success', 5, 'aksrt-balance-signin-toast'); document.querySelectorAll('[data-credits-value]').forEach(function (element) { element.textContent = Number(result.json.balance || 0).toLocaleString(); }); setButtonState('done'); refresh(); }).finally(function () { if (window.AKSRTCaptcha) window.AKSRTCaptcha.reset('signin', captchaMount()); }); } freshButtons.forEach(function (button) { button.addEventListener('click', function (event) { event.preventDefault(); if (signinBusy || button.disabled) return; signinBusy = true; setButtonState('busy'); var captchaRequired = !!window.aksrtData.captchaSignin; var captcha = window.AKSRTCaptcha; var mount = captchaMount(); if (captchaRequired && (!captcha || !mount)) { signinBusy = false; notyf('人机验证未正确加载,请刷新页面后重试', 'danger'); setButtonState('idle'); return; } if (!captchaRequired) { doSignin({}); return; } captcha.run('signin', mount).then(function (payload) { if (payload === null) throw new Error('已取消验证'); doSignin(payload); }).catch(function (error) { signinBusy = false; captcha.reset('signin', mount); notyf((error && error.message) || '人机验证加载中,请稍候再试', 'danger'); setButtonState('idle'); }); }); }); refresh(); } function boot() { if (!window.AksrtRequest) return; jQuery(document).off('auto_fun.aksrt-signin').on('auto_fun.aksrt-signin', initSignin); initSignin(); } if (typeof tbquire === 'function') { tbquire(['main'], boot); } else { boot(); } })();