From c3bfd12c69c053273f099df93e52f7b2094ff50b Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 12 Aug 2026 20:02:37 +0800 Subject: [PATCH] fix(users): keep center navigation local and restore public home --- assets/js/routes/user-center.js | 49 ++++++++++++------- .../sidebar-commerce.php | 4 +- .../user-center-renderers/sidebar-creator.php | 4 +- .../user-center-renderers/sidebar-stats.php | 5 +- .../user-center-renderers/sidebar-vip.php | 2 +- templates/pages/page-user-home.php | 6 ++- 6 files changed, 45 insertions(+), 25 deletions(-) diff --git a/assets/js/routes/user-center.js b/assets/js/routes/user-center.js index c62a25fe..be54a649 100644 --- a/assets/js/routes/user-center.js +++ b/assets/js/routes/user-center.js @@ -28,7 +28,7 @@ if (!tabContainer) return; var tabs = tabContainer.querySelectorAll('[data-tab]'); - var sidebarBtns = document.querySelectorAll('.uc-sidebar__btn[data-tab], .uc-service-grid__item[data-tab]'); + var sidebarBtns = document.querySelectorAll('.uc-sidebar [data-tab]'); var panels = {}; var defaultTab = cfg.defaultTab || 'profile'; var drawerTrigger = document.getElementById('uc-drawer-trigger'); @@ -82,9 +82,12 @@ } target.classList.add('is-loading'); var url = restUrl.replace(/\/$/, '') + '/user-center/panel/' + encodeURIComponent(name); - if (name === 'creator') { + if (name === 'creator' || name === 'revenue') { var params = queryParams || new URLSearchParams(window.location.search); - ['income_page'].forEach(function(key) { + var allowedParams = name === 'creator' + ? ['income_page'] + : ['reward_tab', 'commission_page', 'invite_page']; + allowedParams.forEach(function(key) { if (params.get(key)) url += (url.indexOf('?') === -1 ? '?' : '&') + key + '=' + encodeURIComponent(params.get(key)); }); } @@ -131,24 +134,34 @@ return tabAliases[name] || name; } - function updateUrl(name) { + function updateUrl(name, sourceUrl) { if (!window.history.replaceState) return; var pathTab = name === 'credits' ? 'balance' : name; var u = new URL('/user/' + pathTab + '/', window.location.origin); - window.history.replaceState({}, '', u); + if (sourceUrl) { + var source = new URL(sourceUrl, window.location.href); + source.searchParams.forEach(function(value, key) { u.searchParams.set(key, value); }); + } + window.history.pushState({}, '', u); } - tabs.forEach(function(tab) { - tab.addEventListener('click', function(e) { - e.preventDefault(); - activate(this.getAttribute('data-tab'), true); - }); - }); - sidebarBtns.forEach(function(btn) { - btn.addEventListener('click', function(e) { - e.preventDefault(); - activate(this.getAttribute('data-tab'), true); - }); + // Delegate every internal user-center link. This also covers markup injected + // after a REST panel refresh, so panel navigation never falls back to a full load. + document.addEventListener('click', function(e) { + var link = e.target && e.target.closest ? e.target.closest('a[href]') : null; + if (!link || e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || link.target === '_blank') return; + var url; + try { url = new URL(link.href, window.location.href); } catch (_) { return; } + if (url.origin !== window.location.origin) 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; + if (name === 'balance') name = 'credits'; + name = tabAliases[name] || name; + if (!name || !panels[name]) return; + e.preventDefault(); + var hasQuery = url.search !== ''; + activate(name, false, hasQuery, url.searchParams).then(function() { updateUrl(name, url.href); }); }); var creatorPanel = panels.creator ? panels.creator.panel : null; if (creatorPanel) { @@ -166,7 +179,9 @@ }); }); } - window.addEventListener('popstate', function() { activate(tabFromUrl(), false, true); }); + window.addEventListener('popstate', function() { + activate(tabFromUrl(), false, window.location.search !== '', new URLSearchParams(window.location.search)); + }); if (drawerTrigger) drawerTrigger.addEventListener('click', openDrawer); if (drawerOverlay) drawerOverlay.addEventListener('click', closeDrawer); activate(tabFromUrl(), false); diff --git a/inc/helpers/user-center-renderers/sidebar-commerce.php b/inc/helpers/user-center-renderers/sidebar-commerce.php index 9a8a74db..98353690 100644 --- a/inc/helpers/user-center-renderers/sidebar-commerce.php +++ b/inc/helpers/user-center-renderers/sidebar-commerce.php @@ -19,7 +19,7 @@ $points = (float) ($credit_balance ?? 0); ?>
- + @@ -28,7 +28,7 @@ $points = (float) ($credit_balance ?? 0); - + diff --git a/inc/helpers/user-center-renderers/sidebar-creator.php b/inc/helpers/user-center-renderers/sidebar-creator.php index b9e8c7a4..bc3df004 100644 --- a/inc/helpers/user-center-renderers/sidebar-creator.php +++ b/inc/helpers/user-center-renderers/sidebar-creator.php @@ -16,14 +16,14 @@ if ($creation_url === '' && $revenue_url === '') { ?>
- + - + diff --git a/inc/helpers/user-center-renderers/sidebar-stats.php b/inc/helpers/user-center-renderers/sidebar-stats.php index d185d233..3a83fe47 100644 --- a/inc/helpers/user-center-renderers/sidebar-stats.php +++ b/inc/helpers/user-center-renderers/sidebar-stats.php @@ -13,16 +13,19 @@ $stats = [ 'label' => __('文章', 'aksrt'), 'value' => (int) ($post_count ?? 0), 'url' => isset($dashboard_tabs['posts']) ? aksrt_get_user_center_tab_url('posts') : $public_home_url, + 'tab' => isset($dashboard_tabs['posts']) ? 'posts' : '', ], [ 'label' => __('评论', 'aksrt'), 'value' => (int) ($comment_count ?? 0), 'url' => isset($dashboard_tabs['comments']) ? aksrt_get_user_center_tab_url('comments') : $public_home_url, + 'tab' => isset($dashboard_tabs['comments']) ? 'comments' : '', ], [ 'label' => __('收藏', 'aksrt'), 'value' => (int) ($favorite_count ?? 0), 'url' => isset($dashboard_tabs['favorites']) ? aksrt_get_user_center_tab_url('favorites') : $public_home_url, + 'tab' => isset($dashboard_tabs['favorites']) ? 'favorites' : '', ], [ 'label' => __('粉丝', 'aksrt'), @@ -34,7 +37,7 @@ $stats = [