/** * AKSRT Public User Home runtime * * Handles public user-home dashboard tabs and cover uploads. * Loaded on /user/{nicename}/ (author archives 301-redirect here). * * @package AKSRT */ /* global aksrtAuthorPage */ (function () { 'use strict'; function notify(message, type) { if (!message) return; if (typeof window.AksrtToast === 'function') { window.AksrtToast(message, type || 'info'); return; } if (typeof window.showToast === 'function') { window.showToast(message, type || 'info'); return; } if (typeof window.aksrtToast === 'function') { window.aksrtToast(message, type || 'info'); return; } window.alert(message); } function updateTabUrl(root, name, defaultTab) { if (!window.history || typeof window.history.replaceState !== 'function') return; var url = new URL(window.location.href); if (!name || name === defaultTab) { url.searchParams.delete('tab'); } else { url.searchParams.set('tab', name); } window.history.replaceState({}, '', url.toString()); } function initPublicDashboards() { document.querySelectorAll('.dashboard--public').forEach(function (root) { if (root.dataset.aksrtAuthorBound === '1') return; root.dataset.aksrtAuthorBound = '1'; var tabs = Array.prototype.slice.call(root.querySelectorAll('.dashboard-tabs [data-tab]')); if (!tabs.length) return; var defaultTab = root.dataset.defaultTab || tabs[0].getAttribute('data-tab') || 'posts'; var panels = {}; tabs.forEach(function (tab) { var name = tab.getAttribute('data-tab'); var panel = root.querySelector('#panel-' + name); if (name && panel) { panels[name] = { tab: tab, panel: panel }; } }); function switchTo(name, syncUrl) { if (!panels[name]) { name = defaultTab; } Object.keys(panels).forEach(function (key) { var active = key === name; panels[key].tab.classList.toggle('is-active', active); panels[key].tab.setAttribute('aria-selected', active ? 'true' : 'false'); panels[key].panel.classList.toggle('is-active', active); if (active) { panels[key].panel.removeAttribute('hidden'); } else { panels[key].panel.setAttribute('hidden', ''); } }); if (syncUrl) { updateTabUrl(root, name, defaultTab); } } function resolveInitialTab() { var url = new URL(window.location.href); return url.searchParams.get('tab') || defaultTab; } tabs.forEach(function (tab) { tab.addEventListener('click', function () { switchTo(tab.getAttribute('data-tab'), true); }); }); switchTo(resolveInitialTab(), false); }); } function initCoverUpload() { var cfg = window.aksrtAuthorPage || {}; var upload = cfg.coverUpload || null; if (!upload || !upload.enabled || !upload.restUrl) return; var btn = document.getElementById(upload.buttonId || 'aksrt-upload-bg-btn'); var input = document.getElementById(upload.inputId || 'aksrt-bg-file-input'); if (!btn || !input || btn.dataset.aksrtCoverBound === '1') return; btn.dataset.aksrtCoverBound = '1'; var label = btn.querySelector('span'); var idleText = upload.idleText || (label ? label.textContent : ''); var loadingText = upload.loadingText || idleText; function setBusy(busy) { btn.disabled = !!busy; if (label) { label.textContent = busy ? loadingText : idleText; } } function resetImage(previousUrl) { var image = document.getElementById(upload.imageId || 'aksrt-cover-img'); if (!image) return; if (previousUrl) { image.src = previousUrl; return; } if (upload.fallbackImage) { image.src = upload.fallbackImage; } } function applyImage(nextUrl) { var image = document.getElementById(upload.imageId || 'aksrt-cover-img'); if (image && nextUrl) { image.src = nextUrl; } } btn.addEventListener('click', function () { input.click(); }); input.addEventListener('change', function () { var file = input.files && input.files[0]; if (!file) return; if (upload.maxSize && file.size > upload.maxSize) { notify(upload.tooLargeText || '图片大小不能超过 2MB', 'warning'); input.value = ''; return; } setBusy(true); var formData = new FormData(); formData.append(upload.fieldName || 'background', file); fetch(upload.restUrl, { method: 'POST', credentials: 'same-origin', headers: { 'X-WP-Nonce': upload.restNonce || '' }, body: formData }) .then(function (response) { return response.json().catch(function () { return null; }).then(function (payload) { if (!response.ok) { throw payload || { message: upload.errorText || '上传失败' }; } return payload; }); }) .then(function (payload) { if (payload && payload.success && payload.url) { applyImage(payload.url); notify(upload.successText || '背景图已更新', 'success'); return; } throw payload || { message: upload.errorText || '上传失败' }; }) .catch(function (error) { var previousUrl = error && error.data && error.data.previous_url !== undefined ? error.data.previous_url : ''; resetImage(previousUrl); notify((error && error.message) || upload.networkErrorText || '网络错误,请重试', 'error'); }) .finally(function () { setBusy(false); input.value = ''; }); }); } function init() { initPublicDashboards(); initCoverUpload(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();