Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 55a9225

Browse files
Merge pull request #182 from christianfuttrup/main
Added type check to keyboard navigation
2 parents 9105c2a + a92a93f commit 55a9225

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

‎src/hooks/useKeyboardNavigation.ts

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ interface UseKeyboardNavigationProps {
99
onClose: () => void;
1010
}
1111

12+
const keyboardEventKeys = {
13+
arrowDown: "ArrowDown",
14+
arrowUp: "ArrowUp",
15+
enter: "Enter",
16+
escape: "Escape",
17+
} as const;
18+
19+
type KeyboardEventKeys =
20+
(typeof keyboardEventKeys)[keyof typeof keyboardEventKeys];
21+
1222
export const useKeyboardNavigation = ({
1323
items,
1424
isOpen,
@@ -20,25 +30,27 @@ export const useKeyboardNavigation = ({
2030
const handleKeyDown = (event: React.KeyboardEvent) => {
2131
if (!isOpen) return;
2232

23-
switch (event.key) {
24-
case "ArrowDown":
25-
event.preventDefault();
26-
setFocusedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));
27-
break;
28-
case "ArrowUp":
29-
event.preventDefault();
30-
setFocusedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));
31-
break;
32-
case "Enter":
33-
event.preventDefault();
34-
if (focusedIndex >= 0) {
35-
onSelect(items[focusedIndex]);
36-
}
37-
break;
38-
case "Escape":
39-
event.preventDefault();
40-
onClose();
41-
break;
33+
const key = event.key as KeyboardEventKeys;
34+
35+
if (Object.values(keyboardEventKeys).includes(key)) {
36+
event.preventDefault();
37+
38+
switch (key) {
39+
case "ArrowDown":
40+
setFocusedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));
41+
break;
42+
case "ArrowUp":
43+
setFocusedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));
44+
break;
45+
case "Enter":
46+
if (focusedIndex >= 0) {
47+
onSelect(items[focusedIndex]);
48+
}
49+
break;
50+
case "Escape":
51+
onClose();
52+
break;
53+
}
4254
}
4355
};
4456

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /