File tree Expand file tree Collapse file tree 1 file changed +31
-19
lines changed Expand file tree Collapse file tree 1 file changed +31
-19
lines changed Original file line number Diff line number Diff line change @@ -9,6 +9,16 @@ interface UseKeyboardNavigationProps {
9
9
onClose : ( ) => void ;
10
10
}
11
11
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
+
12
22
export const useKeyboardNavigation = ( {
13
23
items,
14
24
isOpen,
@@ -20,25 +30,27 @@ export const useKeyboardNavigation = ({
20
30
const handleKeyDown = ( event : React . KeyboardEvent ) => {
21
31
if ( ! isOpen ) return ;
22
32
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
+ }
42
54
}
43
55
} ;
44
56
You can’t perform that action at this time.
0 commit comments