fix(user-center): load revenue tabs without refresh

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 10:42:32 +08:00
co-authored by Claude Fable 5
parent 39c92017d9
commit 02fcde3c84
7 changed files with 169 additions and 41 deletions
+42 -24
View File
@@ -56,11 +56,6 @@
function switchTo(name) {
if (!panels[name]) name = defaultTab;
if (panels[name].panel.dataset.panelLoaded === 'false') {
window.location.assign(tabUrls[name] || panels[name].panel.dataset.tabUrl || ('?tab=' + encodeURIComponent(name)));
return;
}
Object.keys(panels).forEach(function(key) {
var active = key === name;
panels[key].tab.classList.toggle('is-active', active);
@@ -68,14 +63,48 @@
panels[key].panel.classList.toggle('is-active', active);
panels[key].panel.hidden = !active;
});
sidebarBtns.forEach(function(btn) {
btn.classList.toggle('is-active', btn.getAttribute('data-tab') === name);
});
closeDrawer();
}
function loadPanel(name) {
if (!panels[name]) return Promise.reject(new Error('panel-not-found'));
var target = panels[name].panel;
if (target.dataset.panelLoaded === 'true') return Promise.resolve();
if (target._aksrtPanelRequest) return target._aksrtPanelRequest;
var restUrl = (window.aksrtData && (window.aksrtData.restUrl || window.aksrtData.apiUrl)) || '';
if (!restUrl) return Promise.reject(new Error('rest-unavailable'));
target.classList.add('is-loading');
var url = restUrl.replace(/\/$/, '') + '/user-center/panel/' + encodeURIComponent(name);
target._aksrtPanelRequest = fetch(url, {
credentials: 'same-origin',
headers: { 'X-WP-Nonce': (window.aksrtData && (window.aksrtData.restNonce || window.aksrtData.nonce)) || '' }
}).then(function(response) {
return response.json().then(function(payload) {
if (!response.ok || !payload || !payload.success || !payload.data || typeof payload.data.html !== 'string') throw new Error('panel-load-failed');
target.innerHTML = payload.data.html;
target.dataset.panelLoaded = 'true';
});
}).finally(function() {
target._aksrtPanelRequest = null;
target.classList.remove('is-loading');
});
return target._aksrtPanelRequest;
}
function activate(name, updateHistory) {
if (!panels[name]) name = defaultTab;
return loadPanel(name).then(function() {
switchTo(name);
if (updateHistory) updateUrl(name);
if (typeof window.AKSRTRevenueCenterInit === 'function') window.AKSRTRevenueCenterInit(panels[name].panel);
}).catch(function() {
if (typeof showToast === 'function') showToast(i18n.networkError || '加载失败,请重试');
});
}
function tabFromUrl() {
var m = window.location.search.match(/[?&]tab=([^&]+)/);
var name = m ? decodeURIComponent(m[1]) : (cfg.activeTab || defaultTab);
@@ -85,38 +114,27 @@
function updateUrl(name) {
if (!window.history.replaceState) return;
var u = new URL(window.location);
if (name === defaultTab) {
u.searchParams.delete('tab');
} else {
u.searchParams.set('tab', name);
}
if (name === defaultTab) u.searchParams.delete('tab');
else u.searchParams.set('tab', name);
window.history.replaceState({}, '', u);
}
tabs.forEach(function(tab) {
tab.addEventListener('click', function(e) {
var name = this.getAttribute('data-tab');
if (!panels[name] || panels[name].panel.dataset.panelLoaded === 'false') return;
e.preventDefault();
switchTo(name);
updateUrl(name);
activate(this.getAttribute('data-tab'), true);
});
});
sidebarBtns.forEach(function(btn) {
btn.addEventListener('click', function(e) {
var name = this.getAttribute('data-tab');
if (!panels[name] || panels[name].panel.dataset.panelLoaded === 'false') return;
e.preventDefault();
switchTo(name);
updateUrl(name);
activate(this.getAttribute('data-tab'), true);
});
});
window.addEventListener('popstate', function() { activate(tabFromUrl(), false); });
if (drawerTrigger) drawerTrigger.addEventListener('click', openDrawer);
if (drawerOverlay) drawerOverlay.addEventListener('click', closeDrawer);
switchTo(tabFromUrl());
activate(tabFromUrl(), false);
}
/* ==================== 个人信息保存 ==================== */