fix(web): 穩定治理頁 deep link 與盤點容錯
All checks were successful
CD Pipeline / tests (push) Successful in 1m23s
Code Review / ai-code-review (push) Successful in 14s
CD Pipeline / build-and-deploy (push) Successful in 4m18s
CD Pipeline / post-deploy-checks (push) Successful in 1m29s

This commit is contained in:
Your Name
2026-06-05 10:33:11 +08:00
parent b09b5151c2
commit fd33591cd6
2 changed files with 46 additions and 22 deletions

View File

@@ -101,12 +101,15 @@ export function PageTabs({ tabs, defaultTab, syncWithUrl = true }: PageTabsProps
const [activeTab, setActiveTab] = useState(initialTab)
const tabIds = tabs.map(t => t.id).join('|')
const firstTabId = tabs[0]?.id || ''
const knownTabIds = useMemo(() => tabIds.split('|'), [tabIds])
const urlActiveTab = syncWithUrl && urlTab && knownTabIds.includes(urlTab) ? urlTab : null
const resolvedActiveTab = urlActiveTab || activeTab || defaultTab || firstTabId
useEffect(() => {
const nextTab = (syncWithUrl ? urlTab : null) || defaultTab || firstTabId
if (!nextTab || !tabIds.split('|').includes(nextTab)) return
if (!nextTab || !knownTabIds.includes(nextTab)) return
setActiveTab(prev => prev === nextTab ? prev : nextTab)
}, [defaultTab, firstTabId, syncWithUrl, tabIds, urlTab])
}, [defaultTab, firstTabId, knownTabIds, syncWithUrl, urlTab])
// 切換 Tab
const switchTab = useCallback((tabId: string) => {
@@ -126,8 +129,8 @@ export function PageTabs({ tabs, defaultTab, syncWithUrl = true }: PageTabsProps
// 找到目前的 Tab 內容
const activeContent = useMemo(() => {
return tabs.find(t => t.id === activeTab)?.content ?? tabs[0]?.content
}, [tabs, activeTab])
return tabs.find(t => t.id === resolvedActiveTab)?.content ?? tabs[0]?.content
}, [tabs, resolvedActiveTab])
return (
<>
@@ -147,17 +150,17 @@ export function PageTabs({ tabs, defaultTab, syncWithUrl = true }: PageTabsProps
}}
>
{tabs.map(tab => {
const isActive = tab.id === activeTab
const isActive = tab.id === resolvedActiveTab
return (
<button
key={tab.id}
data-tab-id={tab.id}
onClick={() => switchTab(tab.id)}
style={{
padding: '0 14px',
fontSize: 12,
fontWeight: isActive ? 600 : 500,
color: isActive ? '#d97757' : '#87867f',
borderBottom: `2px solid ${isActive ? '#d97757' : 'transparent'}`,
background: 'transparent',
border: 'none',
borderBottomWidth: 2,