Skip to content

Commit 32b1e87

Browse files
committed
fix(web): route panel shortcut correctly
1 parent 2079170 commit 32b1e87

2 files changed

Lines changed: 74 additions & 4 deletions

File tree

src/apps/web/src/__tests__/appUI.test.tsx

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { act } from 'react'
1+
import { act, useEffect, useState } from 'react'
22
import { createRoot } from 'react-dom/client'
33
import { MemoryRouter } from 'react-router-dom'
44
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
55

6-
import { AppUIProvider, useSettingsUI, useSidebarUI } from '../contexts/app-ui'
6+
import { AppUIProvider, useSettingsUI, useSidebarUI, useTitleBarRightPanelUI } from '../contexts/app-ui'
77
import { AuthContextBridge, type AuthContextValue } from '../contexts/auth'
88
import { DesktopTitleBar } from '../components/DesktopTitleBar'
99
import { LocaleProvider } from '../contexts/LocaleContext'
@@ -44,6 +44,30 @@ function SettingsProbe() {
4444
)
4545
}
4646

47+
function RightPanelShortcutProbe() {
48+
const { rightPanelOpen, setRightPanelOpen } = useSidebarUI()
49+
const { setTitleBarRightPanelClick } = useTitleBarRightPanelUI()
50+
const [visible, setVisible] = useState(false)
51+
52+
useEffect(() => {
53+
setTitleBarRightPanelClick(() => {
54+
setVisible((open) => !open)
55+
})
56+
return () => setTitleBarRightPanelClick(null)
57+
}, [setTitleBarRightPanelClick])
58+
59+
useEffect(() => {
60+
setRightPanelOpen(visible)
61+
}, [visible, setRightPanelOpen])
62+
63+
return (
64+
<div>
65+
<span data-testid="right-panel-visible">{visible ? 'open' : 'closed'}</span>
66+
<span data-testid="right-panel-icon">{rightPanelOpen ? 'open' : 'closed'}</span>
67+
</div>
68+
)
69+
}
70+
4771
describe('AppUIProvider sidebar state', () => {
4872
const authValue: AuthContextValue = {
4973
me: null,
@@ -226,6 +250,52 @@ describe('AppUIProvider sidebar state', () => {
226250
})
227251
container.remove()
228252
})
253+
254+
it('右侧面板快捷键复用标题栏回调路径', async () => {
255+
desktopMock.isDesktop.mockReturnValue(false)
256+
Object.defineProperty(window.navigator, 'platform', {
257+
configurable: true,
258+
value: 'Win32',
259+
})
260+
261+
const container = document.createElement('div')
262+
document.body.appendChild(container)
263+
const root = createRoot(container)
264+
265+
await act(async () => {
266+
root.render(
267+
<MemoryRouter initialEntries={['/']}>
268+
<AuthContextBridge value={authValue}>
269+
<AppUIProvider>
270+
<RightPanelShortcutProbe />
271+
</AppUIProvider>
272+
</AuthContextBridge>
273+
</MemoryRouter>,
274+
)
275+
})
276+
277+
expect(container.querySelector('[data-testid="right-panel-visible"]')?.textContent).toBe('closed')
278+
expect(container.querySelector('[data-testid="right-panel-icon"]')?.textContent).toBe('closed')
279+
280+
await act(async () => {
281+
window.dispatchEvent(new KeyboardEvent('keydown', {
282+
key: 'b',
283+
code: 'KeyB',
284+
altKey: true,
285+
ctrlKey: true,
286+
bubbles: true,
287+
cancelable: true,
288+
}))
289+
})
290+
291+
expect(container.querySelector('[data-testid="right-panel-visible"]')?.textContent).toBe('open')
292+
expect(container.querySelector('[data-testid="right-panel-icon"]')?.textContent).toBe('open')
293+
294+
act(() => {
295+
root.unmount()
296+
})
297+
container.remove()
298+
})
229299
})
230300

231301
describe('DesktopTitleBar update entry', () => {

src/apps/web/src/contexts/app-ui.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ export function AppUIProvider({ children }: { children: ReactNode }) {
560560
}
561561
if (matchesShortcut(e, SHORTCUTS.toggleRightPanel)) {
562562
e.preventDefault()
563-
setRightPanelOpen((open) => !open)
563+
triggerTitleBarRightPanelClick()
564564
return
565565
}
566566
if (matchesShortcut(e, SHORTCUTS.toggleSidebar)) {
@@ -570,7 +570,7 @@ export function AppUIProvider({ children }: { children: ReactNode }) {
570570
}
571571
window.addEventListener('keydown', handler)
572572
return () => window.removeEventListener('keydown', handler)
573-
}, [settingsOpen, openSettings, closeSettings, openSearchOverlay, toggleSidebar])
573+
}, [settingsOpen, openSettings, closeSettings, openSearchOverlay, triggerTitleBarRightPanelClick, toggleSidebar])
574574

575575
useEffect(() => {
576576
if (!(desktop && settingsOpen)) return

0 commit comments

Comments
 (0)