diff --git a/assets/js/routes/user-center.js b/assets/js/routes/user-center.js index dfb78197..3d1c376c 100644 --- a/assets/js/routes/user-center.js +++ b/assets/js/routes/user-center.js @@ -113,6 +113,39 @@ return target._aksrtPanelRequest; } + /* Revenue tabs are injected with the panel HTML. Handle them in the + * capture phase so they never fall through to a browser navigation. */ + function loadRevenueTab(queryParams) { + var target = document.getElementById('panel-revenue'); + var restUrl = (window.aksrtData && (window.aksrtData.restUrl || window.aksrtData.apiUrl)) || cfg.restUrl || ''; + if (!target || !restUrl) return Promise.reject(new Error('revenue-panel-unavailable')); + var params = queryParams || new URLSearchParams(); + var url = restUrl.replace(/\/$/, '') + '/user-center/panel/revenue'; + params.forEach(function(value, key) { + if (key === 'reward_tab' || key === 'commission_page' || key === 'user_page') { + url += (url.indexOf('?') === -1 ? '?' : '&') + key + '=' + encodeURIComponent(value); + } + }); + target.classList.add('is-loading'); + return 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('revenue-tab-load-failed'); + } + target.innerHTML = payload.data.html; + target.dataset.panelLoaded = 'true'; + if (window.AksrtFrontend && typeof window.AksrtFrontend.rehydrate === 'function') { + window.AksrtFrontend.rehydrate(target, 'ajax'); + } + }); + }).finally(function() { + target.classList.remove('is-loading'); + }); + } + function activate(name, updateHistory, forceLoad, queryParams) { if (!panels[name]) name = defaultTab; // VIP membership may change outside this page, so never reuse stale HTML. @@ -155,6 +188,18 @@ var url; try { url = new URL(link.href, window.location.href); } catch (_) { return; } if (url.origin !== window.location.origin) return; + if (link.closest('.uc-reward-tabs, .uc-reward-pagination')) { + e.preventDefault(); + e.stopPropagation(); + loadRevenueTab(url.searchParams).then(function() { + if (window.history.replaceState) window.history.replaceState({}, '', '/user/revenue/'); + if (typeof window.AKSRTAffiliateRevenueInit === 'function') window.AKSRTAffiliateRevenueInit(); + if (typeof window.AKSRTWithdrawInit === 'function') window.AKSRTWithdrawInit(); + }).catch(function() { + if (typeof showToast === 'function') showToast(i18n.networkError || '加载失败,请重试'); + }); + return; + } var parts = url.pathname.replace(/\/+$/, '').split('/'); var pathTab = parts.length > 2 && parts[parts.length - 2] === 'user' ? parts[parts.length - 1] : ''; var name = link.getAttribute('data-tab') || pathTab; @@ -164,7 +209,7 @@ e.preventDefault(); var hasQuery = url.search !== ''; activate(name, false, hasQuery, url.searchParams).then(function() { updateUrl(name, url.href); }); - }); + }, true); var creatorPanel = panels.creator ? panels.creator.panel : null; if (creatorPanel) { creatorPanel.addEventListener('click', function(e) {