Skip to content

Commit 9bd58aa

Browse files
committed
[n/a] Fix breaking keyboard shortcut tests
Reworked the keyboard shortcut handler so we keep a single keydown listener and fetch the latest Zustand state on-demand via getState(), eliminating the gap where the listener was briefly removed during re-renders and causing the intermittent fullscreen toggle failure.
1 parent 99bf885 commit 9bd58aa

File tree

2 files changed

+34
-38
lines changed

2 files changed

+34
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Change Log
22

33
## 0.3.0
4+
- Fix flakey e2e test - `keyboard-shortcuts.spec.ts` ([#53](https://github.com/vigetlabs/parts-kit/pull/53))
45
- [#50](https://github.com/vigetlabs/parts-kit/issues/50) - Don't escape forward slashes. Switch deep links to use a `path` parameter instead of `part`. Add routing e2e coverage. ([#51](https://github.com/vigetlabs/parts-kit/pull/51))
56
- [#43](https://github.com/vigetlabs/parts-kit/issues/43) - Add a direct link button to the UtilityBar and fix anchor hover styles. ([#46](https://github.com/vigetlabs/parts-kit/pull/46))
67
- [#40](https://github.com/vigetlabs/parts-kit/issues/40) - Fix keyboard shortcuts firing when focused within inputs. ([#45](https://github.com/vigetlabs/parts-kit/pull/45))

src/components/KeyboardShortcuts.tsx

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect } from 'preact/hooks'
1+
import { useCallback, useEffect } from 'preact/hooks'
22
import {
33
useThemeStore,
44
useUtilityBarStore,
@@ -54,76 +54,71 @@ function preventDefault(e: SimpleKeyboardEvent) {
5454
}
5555

5656
export default function () {
57-
const utilityStore = useUtilityBarStore()
58-
const themeStore = useThemeStore()
57+
const keydownHandler = useCallback((e: SimpleKeyboardEvent) => {
58+
const utilityStore = useUtilityBarStore.getState()
59+
const themeStore = useThemeStore.getState()
5960

60-
usePostMessageReceiver({
61-
onMessage(e) {
62-
if (!isKeyboardEventMessage(e.data)) {
63-
return
64-
}
65-
66-
keydownHandler(e.data.payload)
67-
},
68-
})
69-
70-
// handles different keyboard shortcuts
71-
const keydownHandler = (e: SimpleKeyboardEvent) => {
7261
if (!canHandleKeyboard()) {
7362
return
7463
}
7564

76-
// Make sure all of your case statements are lowercase too
7765
switch (e.key.toLowerCase()) {
78-
// toggle fullscreen [F]
79-
case 'f':
66+
case 'f': {
8067
preventDefault(e)
81-
return utilityStore.setIsNavBarVisible(!utilityStore.isNavBarVisible)
68+
utilityStore.setIsNavBarVisible(!utilityStore.isNavBarVisible)
69+
return
70+
}
8271

83-
// exit fullscreen [Esc]
84-
case 'escape':
72+
case 'escape': {
8573
preventDefault(e)
86-
return utilityStore.setIsNavBarVisible(true)
74+
utilityStore.setIsNavBarVisible(true)
75+
return
76+
}
8777

88-
// toggle viewport menu [Shift + V]
89-
case 'v':
78+
case 'v': {
9079
if (e.shiftKey) {
9180
preventDefault(e)
9281
utilityStore.setIsViewportOpen(!utilityStore.isViewportOpen)
9382
}
9483
return
84+
}
9585

96-
// toggle theme [Shift + T]
97-
case 't':
86+
case 't': {
9887
if (e.shiftKey) {
9988
preventDefault(e)
10089
themeStore.toggleMode()
10190
}
10291
return
92+
}
10393

104-
// toggle settings [Shift + S]
105-
case 's':
94+
case 's': {
10695
if (e.shiftKey) {
10796
preventDefault(e)
10897
utilityStore.setIsSettingsOpen(!utilityStore.isSettingsOpen)
10998
}
11099
return
100+
}
111101

112102
default:
113103
return
114104
}
115-
}
105+
}, [])
106+
107+
usePostMessageReceiver({
108+
onMessage(e) {
109+
if (!isKeyboardEventMessage(e.data)) {
110+
return
111+
}
112+
113+
keydownHandler(e.data.payload)
114+
},
115+
})
116116

117-
// be sure to track changes to your states here, or they won't update when re-used
118117
useEffect(() => {
119-
document.addEventListener('keydown', keydownHandler)
118+
const handleKeydown = (event: KeyboardEvent) => keydownHandler(event)
119+
document.addEventListener('keydown', handleKeydown)
120120
return () => {
121-
document.removeEventListener('keydown', keydownHandler)
121+
document.removeEventListener('keydown', handleKeydown)
122122
}
123-
}, [
124-
utilityStore.isNavBarVisible,
125-
utilityStore.isViewportOpen,
126-
utilityStore.isSettingsOpen,
127-
themeStore.mode,
128-
])
123+
}, [keydownHandler])
129124
}

0 commit comments

Comments
 (0)