(function () { 'use strict'; var _gate = { index: null, opts: null }; var MAIL_ICON = ''; var LOCK_ICON = ''; function esc(s) { if (s == null) return ''; return String(s).replace(/&/g, '&').replace(//g, '>'); } function toast(msg, type) { if (typeof window.soonToast === 'function') window.soonToast(msg, type); } function apiBase() { var cfg = window.SOON_DEPLOY_CONFIG && window.SOON_DEPLOY_CONFIG.api_v1_base; if (cfg) return String(cfg).replace(/\/+$/, ''); if (window.location) return window.location.origin + '/api/v1'; return '/api/v1'; } function ensureLayer(cb) { if (typeof layer !== 'undefined' && layer.open) { if (layer.config) layer.config({ skin: 'soon-layer' }); cb(); return; } if (typeof layui !== 'undefined') { layui.use(['layer'], function () { window.layer = layui.layer; layer.config({ skin: 'soon-layer' }); cb(); }); return; } toast('登录功能暂不可用,请刷新页面后重试', 'warn'); } function shellHtml(panel, reason) { var isReg = panel === 'register'; var action = esc(reason || '导出或打印'); return '
' + '
' + '' + '' + '
' + '
' + '' + '' + '' + '' + '
' + '
'; } function closeGate() { var idx = _gate.index; _gate = { index: null, opts: null }; if (idx != null && typeof layer !== 'undefined') { try { layer.close(idx); } catch (e) { /* ignore */ } } if (typeof window.soonCleanupLayerMask === 'function') window.soonCleanupLayerMask(); } function finishAuthSuccess() { var opts = _gate.opts; closeGate(); var chain = typeof window.soonRefreshPortalAuthUi === 'function' ? Promise.resolve(window.soonRefreshPortalAuthUi()) : Promise.resolve(); return chain.then(function () { if (typeof window.soonReloadRecentFiles === 'function') window.soonReloadRecentFiles(); if (opts && typeof opts.onSuccess === 'function') opts.onSuccess(); }); } function storeTokens(data) { if (!data || !data.access_token) return false; localStorage.setItem('soon_access', data.access_token); if (data.refresh_token) localStorage.setItem('soon_refresh', data.refresh_token); return true; } function swapPanel(modal, panel) { if (!modal || !modal.parentNode) return; var parent = modal.parentNode; var reason = _gate.opts && _gate.opts.reason; modal.outerHTML = shellHtml(panel, reason); var root = parent.querySelector('.soon-login-gate'); if (root) bindModal(root); } function bindAuthForm(modal, role, path, failMsg) { var form = modal.querySelector('[data-role="' + role + '-form"]'); if (!form) return; form.addEventListener('submit', function (e) { e.preventDefault(); var errEl = modal.querySelector('[data-role="' + role + '-error"]'); if (errEl) { errEl.hidden = true; errEl.textContent = ''; } var email = (form.email && form.email.value || '').trim(); var password = form.password ? form.password.value : ''; fetch(apiBase() + path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email, password: password }), }).then(function (r) { return r.json(); }).then(function (j) { if (!j.ok || !storeTokens(j.data)) { if (errEl) { errEl.textContent = (j && j.message) || failMsg; errEl.hidden = false; } return; } finishAuthSuccess(); }).catch(function () { if (errEl) { errEl.textContent = '网络错误,请稍后重试'; errEl.hidden = false; } }); }); } function bindModal(modal) { modal.addEventListener('click', function (e) { if (e.target.closest('[data-action="stay"]')) { e.preventDefault(); closeGate(); return; } if (e.target.closest('[data-action="show-register"]')) { e.preventDefault(); swapPanel(modal, 'register'); return; } if (e.target.closest('[data-action="show-login"]')) { e.preventDefault(); swapPanel(modal, 'login'); } }); bindAuthForm(modal, 'login', '/auth/login', '登录失败'); bindAuthForm(modal, 'register', '/auth/register', '注册失败'); } function openGate(opts, panel) { opts = opts || {}; ensureLayer(function () { if (_gate.index != null) { try { layer.close(_gate.index); } catch (e) { /* ignore */ } } _gate.opts = opts; var width = Math.min(400, window.innerWidth - 32); layer.open({ type: 1, skin: 'soon-layer', title: false, closeBtn: 1, shade: [0.62, '#000'], shadeClose: true, area: [width + 'px', 'auto'], offset: 'auto', content: shellHtml(panel, opts.reason), success: function (layero, index) { var layerEl = layero && layero[0] ? layero[0] : layero; if (layerEl && layerEl.classList) layerEl.classList.add('soon-layer--login-gate'); var content = layerEl && layerEl.querySelector ? layerEl.querySelector('.layui-layer-content') : null; if (content) { content.style.padding = '0'; content.style.overflow = 'visible'; content.style.background = 'transparent'; } var modal = layerEl.querySelector('.soon-login-gate'); _gate.index = index; if (modal) bindModal(modal); }, end: function () { _gate = { index: null, opts: null }; }, }); }); } window.soonShowLoginGate = function (opts) { openGate(opts, 'login'); }; window.soonShowRegisterGate = function (opts) { openGate(opts, 'register'); }; })();