/**
* AKSRT Report — 前台统一举报弹窗
*
* 监听 [data-aksrt-report] 点击,弹出对齐参考主题格式的举报弹窗:
* 红色警示头 + 举报原因徽章(含“其它原因”)+ 违规链接 + 详细描述 + 取消/确认提交。
* 提交走 REST /aksrt/v1/report/submit(user/comment/post 三类目标统一入口)。
*
* @package AKSRT
*/
(function () {
'use strict';
var API_ROOT = (function () {
var d = window.aksrtData || {};
var raw = d.apiUrl || d.restUrl || d.rest_url || '/index.php?rest_route=/aksrt/v1';
return String(raw).replace(/\/$/, '');
})();
var NONCE = (window.aksrtData && window.aksrtData.restNonce) || '';
var TARGET_TITLES = {
user: '举报用户',
post: '举报文章',
comment: '举报评论',
};
function getReportCategories() {
// 预置原因:后台“用户&互动 → 禁封/举报”配置(aksrtData.reportCategories)。
var list = window.aksrtData && window.aksrtData.reportCategories;
if (Array.isArray(list)) {
var items = list
.map(function (cat) {
return {
slug: String((cat && (cat.slug || cat.value)) || ''),
label: String((cat && (cat.label || cat.name)) || ''),
};
})
.filter(function (cat) { return cat.slug !== '' && cat.label !== ''; });
if (items.length) return items;
}
return [
{ slug: 'spam', label: '垃圾信息' },
{ slug: 'abuse', label: '人身攻击' },
{ slug: 'copyright', label: '版权投诉' },
];
}
function escapeHtml(value) {
return String(value == null ? '' : value)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function buildReportModalHtml(data) {
var categories = getReportCategories();
var title = TARGET_TITLES[data.target_type] || '举报不良信息';
var html = '';
// 弹窗头:参考主题红色警示样式。
html += '
';
html += '' + escapeHtml(title) + '';
html += '';
html += '
';
html += '';
return html;
}
function selectedReason(shell) {
var active = shell.querySelector('[data-report-reason].is-active');
return active ? active.getAttribute('data-report-reason') : '';
}
function submitReport(session, data, shell) {
var form = shell.querySelector('.aksrt-report-form');
if (!form) return;
var submitBtn = form.querySelector('[data-aksrt-report-submit]');
var descInput = form.querySelector('[name="report_desc"]');
var otherInput = form.querySelector('[name="reason_other"]');
var urlInput = form.querySelector('[name="report_url"]');
var slug = selectedReason(shell);
var reason = (descInput && descInput.value || '').trim();
var other = (otherInput && otherInput.value || '').trim();
if (!slug && !reason) {
notyf('请选择或输入举报原因', 'danger');
return;
}
// “其它原因”时以自定义文本为举报原因。
if (slug === 'other') {
slug = '';
reason = other || reason;
}
if (!reason) {
// 徽章已选但没有描述时,将徽章文案作为举报原因(参考主题同款语义)。
var activeBtn = shell.querySelector('[data-report-reason].is-active');
reason = activeBtn ? (activeBtn.textContent || '').trim() : '';
}
var link = (urlInput && urlInput.value || '').trim();
if (link) {
reason += (reason ? '\n' : '') + '违规链接:' + link;
}
if (!reason) {
notyf('请选择或输入举报原因', 'danger');
return;
}
submitBtn.disabled = true;
notyf('正在提交举报…', 'load', 3000, 'aksrt-report-submit');
window.fetch(API_ROOT + '/report/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-WP-Nonce': NONCE,
},
body: JSON.stringify({
target_type: data.target_type,
target_id: data.target_id,
category: slug,
reason: reason,
}),
})
.then(function (res) { return res.json(); })
.then(function (result) {
if (result && result.success) {
window.AksrtModalRuntime.close('submit');
notyf(result.message || '举报已提交,我们会尽快处理', 'success');
} else {
submitBtn.disabled = false;
notyf((result && result.message) || '举报提交失败', 'danger');
}
})
.catch(function () {
submitBtn.disabled = false;
notyf('网络错误,请重试', 'danger');
})
.then(function () {
var toast = document.getElementById('aksrt-report-submit');
if (toast) toast.remove();
});
}
function openReportModal(data) {
if (!window.AksrtModalRuntime || typeof window.AksrtModalRuntime.open !== 'function') {
notyf('举报组件加载失败,请刷新页面后重试', 'danger');
return;
}
var shell = window.AksrtModalRuntime.open({
html: buildReportModalHtml(data),
className: 'aksrt-report-modal modal-mini',
kind: 'report',
mobileBottom: true,
});
shell.addEventListener('click', function (event) {
var chip = event.target.closest('[data-report-reason]');
if (chip) {
event.preventDefault();
var wasActive = chip.classList.contains('is-active');
shell.querySelectorAll('[data-report-reason].is-active').forEach(function (el) {
el.classList.remove('is-active');
});
if (!wasActive) chip.classList.add('is-active');
var otherBox = shell.querySelector('.aksrt-report-other');
if (otherBox) otherBox.hidden = chip.getAttribute('data-report-reason') !== 'other' || wasActive;
return;
}
var submitBtn = event.target.closest('[data-aksrt-report-submit]');
if (submitBtn) {
event.preventDefault();
submitReport({ target_type: data.target_type, target_id: data.target_id }, data, shell);
}
});
}
function initReportButtons() {
if (document.documentElement.dataset.aksrtReportInitialized === '1') return;
document.documentElement.dataset.aksrtReportInitialized = '1';
document.addEventListener('click', function (e) {
var btn = e.target.closest('[data-aksrt-report]');
if (!btn) return;
e.preventDefault();
try {
var data = JSON.parse(btn.getAttribute('data-aksrt-report'));
if (data && data.target_type && data.target_id) {
openReportModal(data);
}
} catch {
// invalid data attribute
}
});
}
jQuery(document).off('auto_fun.aksrt-report').on('auto_fun.aksrt-report', initReportButtons);
})();