Files
wordpress-theme-aksrt/assets/js/header-userbox.js
T
kate522 35ac26db28 fix(nav): publish menu contrast, check-in toast and button layout
Use solid light plate + forced ink on 发布 items, notyf instead of alert,
and keep header check-in flex layout after success.
2026-07-22 09:09:02 +08:00

131 lines
3.8 KiB
JavaScript

/**
* Header user-box: check-in REST + signout modal.
*
* @package AKSRT
*/
(function () {
'use strict';
function restBase() {
if (window.aksrtData && window.aksrtData.restUrl) return window.aksrtData.restUrl.replace(/\/?$/, '/');
if (window.aksrtData && window.aksrtData.siteUrl) return String(window.aksrtData.siteUrl).replace(/\/?$/, '/') + 'wp-json/';
return '/wp-json/';
}
function restNonce() {
return (window.aksrtData && window.aksrtData.restNonce) || '';
}
function toast(msg, type) {
type = type || 'info';
// Site-wide notification widget (aksrt-runtime notyf).
if (window.aksrt && typeof window.aksrt.notyf === 'function') {
window.aksrt.notyf(msg, { type: type, duration: 2200 });
return;
}
if (typeof window.aksrtToast === 'function') {
window.aksrtToast(msg, type);
return;
}
if (typeof window.AksrtToast === 'function') {
window.AksrtToast(msg, type);
return;
}
// Last resort: non-blocking console (never native alert for UX).
if (window.console && typeof window.console.log === 'function') {
window.console.log('[aksrt]', type, msg);
}
}
function openModal(id) {
var modal = document.getElementById(id);
if (!modal) return;
modal.classList.add('is-open', 'show');
modal.setAttribute('aria-hidden', 'false');
}
function closeModal(id) {
var modal = document.getElementById(id);
if (!modal) return;
modal.classList.remove('is-open', 'show');
modal.setAttribute('aria-hidden', 'true');
}
function initSignoutModal() {
document.addEventListener('click', function (e) {
var openBtn = e.target.closest('[data-target="#modal_signout"], [href="#modal_signout"]');
if (openBtn) {
e.preventDefault();
openModal('modal_signout');
return;
}
var dismiss = e.target.closest('#modal_signout [data-dismiss="modal"]');
if (dismiss) {
e.preventDefault();
closeModal('modal_signout');
return;
}
if (e.target && e.target.id === 'modal_signout') {
closeModal('modal_signout');
}
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') closeModal('modal_signout');
});
}
function initCheckin() {
document.addEventListener('click', function (e) {
var btn = e.target.closest('[data-aksrt-checkin="1"]');
if (!btn || btn.disabled) return;
e.preventDefault();
btn.disabled = true;
fetch(restBase() + 'signin', {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': restNonce(),
},
body: '{}',
})
.then(function (r) {
return r.json().then(function (data) {
return { ok: r.ok, data: data };
});
})
.then(function (res) {
if (!res.ok) {
var msg = (res.data && (res.data.message || res.data.msg)) || '签到失败';
toast(msg, 'danger');
btn.disabled = false;
return;
}
toast((res.data && res.data.message) || '签到成功', 'success');
btn.classList.add('is-done');
btn.disabled = true;
btn.setAttribute('disabled', 'disabled');
// Keep existing structure so CSS layout (.but.block flex) is not lost.
btn.innerHTML =
'<i class="fas fa-calendar-check" aria-hidden="true"></i>' +
'<span>今日已签到</span>';
})
.catch(function () {
toast('网络错误', 'danger');
btn.disabled = false;
});
});
}
function init() {
initSignoutModal();
initCheckin();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();