/**
* AKSRT user badges — wear modal.
*/
(function () {
'use strict';
var aksrt = window.aksrtData || {};
var siteUrl = aksrt.siteUrl || '';
if (window.location.protocol === 'https:' && siteUrl.substring(0, 5) === 'http:') {
siteUrl = 'https:' + siteUrl.substring(5);
}
var REST = (siteUrl || '').replace(/\/$/, '') + '/wp-json/aksrt/v1';
var NONCE = aksrt.restNonce || aksrt.nonce || '';
function api(path, options) {
var opts = Object.assign({
credentials: 'same-origin',
headers: Object.assign({ 'Content-Type': 'application/json', 'X-WP-Nonce': NONCE }, (options && options.headers) || {}),
}, options || {});
return fetch(REST + path, opts).then(function (r) {
return r.json().catch(function () { return {}; }).then(function (j) {
return { ok: r.ok, status: r.status, json: j };
});
});
}
function toast(msg, type) {
if (window.AksrtToast && typeof window.AksrtToast.show === 'function') {
window.AksrtToast.show(msg, type || 'info');
return;
}
if (window.aksrtNotify) {
window.aksrtNotify(msg, type || 'info');
return;
}
// fallback
try { console.log('[AKSRT badges]', msg); } catch (_) {}
}
function escapeHtml(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"');
}
function renderList(root, data, canWear) {
var body = root.querySelector('[data-aksrt-badges-body]');
if (!body) return;
var items = (data && data.items) || [];
if (!items.length) {
body.innerHTML = '
' + escapeHtml('暂无徽章') + '
';
return;
}
body.innerHTML = items.map(function (item) {
var icon = item.icon_url
? ' '
: ' ' + escapeHtml(item.label) + ' ';
var wearBadge = item.wear ? '佩戴中 ' : '';
var action = '';
if (canWear && !item.wear) {
action = '佩戴此徽章 ';
} else if (item.wear) {
action = '当前佩戴 ';
}
return '' +
'
' + icon + '
' + escapeHtml(item.label) + '
' + wearBadge + '
' +
'
' + action + '
';
}).join('');
}
function openModal(root) {
root.hidden = false;
document.body.classList.add('uc-modal-open');
}
function closeModal(root) {
root.hidden = true;
document.body.classList.remove('uc-modal-open');
}
function init() {
var openers = document.querySelectorAll('[data-aksrt-badges-open]');
var modal = document.querySelector('[data-aksrt-badges-modal]');
if (!modal || !openers.length) return;
var userId = parseInt(modal.getAttribute('data-user-id') || '0', 10);
var canWear = modal.getAttribute('data-can-wear') === '1';
function load() {
if (!userId) return Promise.resolve();
var body = modal.querySelector('[data-aksrt-badges-body]');
if (body) body.innerHTML = '加载中…
';
return api('/users/' + userId + '/badges').then(function (r) {
if (!r.ok || !r.json || !r.json.data) {
if (body) body.innerHTML = '加载失败
';
return;
}
renderList(modal, r.json.data, canWear);
});
}
openers.forEach(function (btn) {
btn.addEventListener('click', function (e) {
e.preventDefault();
openModal(modal);
load();
});
});
modal.querySelectorAll('[data-aksrt-badges-close]').forEach(function (btn) {
btn.addEventListener('click', function (e) {
e.preventDefault();
closeModal(modal);
});
});
modal.addEventListener('click', function (e) {
var wearBtn = e.target.closest('[data-aksrt-badge-wear]');
if (!wearBtn || !canWear) return;
e.preventDefault();
var slug = wearBtn.getAttribute('data-aksrt-badge-wear') || '';
wearBtn.disabled = true;
api('/users/me/badges/wear', {
method: 'POST',
body: JSON.stringify({ slug: slug }),
}).then(function (r) {
if (!r.ok) {
toast((r.json && (r.json.message || (r.json.data && r.json.data.message))) || '佩戴失败', 'error');
wearBtn.disabled = false;
return;
}
toast((r.json && r.json.message) || '已佩戴徽章', 'success');
renderList(modal, (r.json && r.json.data) || {}, canWear);
}).catch(function () {
toast('网络错误', 'error');
wearBtn.disabled = false;
});
});
}
// Global wear handler (remote modal + UC modal).
document.addEventListener("click", function (e) {
var wearBtn = e.target.closest("[data-aksrt-badge-wear]");
if (!wearBtn) return;
// UC modal has its own handler when canWear on modal root.
var modalRoot = wearBtn.closest("[data-aksrt-badges-modal]");
if (modalRoot) return;
e.preventDefault();
var slug = wearBtn.getAttribute("data-aksrt-badge-wear") || "";
if (!slug) return;
wearBtn.disabled = true;
api("/users/me/badges/wear", {
method: "POST",
body: JSON.stringify({ slug: slug }),
}).then(function (r) {
if (!r.ok) {
toast((r.json && (r.json.message || (r.json.data && r.json.data.message))) || "佩戴失败", "error");
wearBtn.disabled = false;
return;
}
toast((r.json && r.json.message) || "已佩戴徽章", "success");
// Soft refresh modal content if remote host present.
try {
document.dispatchEvent(new CustomEvent("aksrt:remote-modal:close"));
} catch (_) {}
}).catch(function () {
toast("网络错误", "error");
wearBtn.disabled = false;
});
});
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();