|
1 | | -import { useEffect } from 'preact/hooks' |
| 1 | +import { useCallback, useEffect } from 'preact/hooks' |
2 | 2 | import { |
3 | 3 | useThemeStore, |
4 | 4 | useUtilityBarStore, |
@@ -54,76 +54,71 @@ function preventDefault(e: SimpleKeyboardEvent) { |
54 | 54 | } |
55 | 55 |
|
56 | 56 | 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() |
59 | 60 |
|
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) => { |
72 | 61 | if (!canHandleKeyboard()) { |
73 | 62 | return |
74 | 63 | } |
75 | 64 |
|
76 | | - // Make sure all of your case statements are lowercase too |
77 | 65 | switch (e.key.toLowerCase()) { |
78 | | - // toggle fullscreen [F] |
79 | | - case 'f': |
| 66 | + case 'f': { |
80 | 67 | preventDefault(e) |
81 | | - return utilityStore.setIsNavBarVisible(!utilityStore.isNavBarVisible) |
| 68 | + utilityStore.setIsNavBarVisible(!utilityStore.isNavBarVisible) |
| 69 | + return |
| 70 | + } |
82 | 71 |
|
83 | | - // exit fullscreen [Esc] |
84 | | - case 'escape': |
| 72 | + case 'escape': { |
85 | 73 | preventDefault(e) |
86 | | - return utilityStore.setIsNavBarVisible(true) |
| 74 | + utilityStore.setIsNavBarVisible(true) |
| 75 | + return |
| 76 | + } |
87 | 77 |
|
88 | | - // toggle viewport menu [Shift + V] |
89 | | - case 'v': |
| 78 | + case 'v': { |
90 | 79 | if (e.shiftKey) { |
91 | 80 | preventDefault(e) |
92 | 81 | utilityStore.setIsViewportOpen(!utilityStore.isViewportOpen) |
93 | 82 | } |
94 | 83 | return |
| 84 | + } |
95 | 85 |
|
96 | | - // toggle theme [Shift + T] |
97 | | - case 't': |
| 86 | + case 't': { |
98 | 87 | if (e.shiftKey) { |
99 | 88 | preventDefault(e) |
100 | 89 | themeStore.toggleMode() |
101 | 90 | } |
102 | 91 | return |
| 92 | + } |
103 | 93 |
|
104 | | - // toggle settings [Shift + S] |
105 | | - case 's': |
| 94 | + case 's': { |
106 | 95 | if (e.shiftKey) { |
107 | 96 | preventDefault(e) |
108 | 97 | utilityStore.setIsSettingsOpen(!utilityStore.isSettingsOpen) |
109 | 98 | } |
110 | 99 | return |
| 100 | + } |
111 | 101 |
|
112 | 102 | default: |
113 | 103 | return |
114 | 104 | } |
115 | | - } |
| 105 | + }, []) |
| 106 | + |
| 107 | + usePostMessageReceiver({ |
| 108 | + onMessage(e) { |
| 109 | + if (!isKeyboardEventMessage(e.data)) { |
| 110 | + return |
| 111 | + } |
| 112 | + |
| 113 | + keydownHandler(e.data.payload) |
| 114 | + }, |
| 115 | + }) |
116 | 116 |
|
117 | | - // be sure to track changes to your states here, or they won't update when re-used |
118 | 117 | useEffect(() => { |
119 | | - document.addEventListener('keydown', keydownHandler) |
| 118 | + const handleKeydown = (event: KeyboardEvent) => keydownHandler(event) |
| 119 | + document.addEventListener('keydown', handleKeydown) |
120 | 120 | return () => { |
121 | | - document.removeEventListener('keydown', keydownHandler) |
| 121 | + document.removeEventListener('keydown', handleKeydown) |
122 | 122 | } |
123 | | - }, [ |
124 | | - utilityStore.isNavBarVisible, |
125 | | - utilityStore.isViewportOpen, |
126 | | - utilityStore.isSettingsOpen, |
127 | | - themeStore.mode, |
128 | | - ]) |
| 123 | + }, [keydownHandler]) |
129 | 124 | } |
0 commit comments