11import { useCallback , useEffect , useMemo , useState } from 'react' ;
22
33type Props < T > = {
4+ /**
5+ * Whether to disable the keyboard event listeners conditionally
6+ */
7+ disableEventListeners : boolean ;
48 /**
59 * The list of values to navigate through
610 */
711 list : T [ ] ;
12+
813 /**
914 * Callback triggered when the item is selected
1015 */
@@ -14,7 +19,7 @@ type Props<T> = {
1419/**
1520 * Navigate a list of items using the up/down arrow and ^j/^k keys
1621 */
17- function useKeyboardNavigate < T > ( { list, onSelect} : Props < T > ) {
22+ function useListKeyboardNavigate < T > ( { list, onSelect, disableEventListeners } : Props < T > ) {
1823 const [ focused , setFocus ] = useState < T | null > ( null ) ;
1924
2025 const setFocusIndex = useCallback (
@@ -85,11 +90,15 @@ function useKeyboardNavigate<T>({list, onSelect}: Props<T>) {
8590 ) ;
8691
8792 useEffect ( ( ) => {
88- document . addEventListener ( 'keydown' , handleNavigate ) ;
89- return ( ) => document . removeEventListener ( 'keydown' , handleNavigate ) ;
90- } , [ handleNavigate ] ) ;
93+ if ( ! disableEventListeners ) {
94+ document . addEventListener ( 'keydown' , handleNavigate ) ;
95+ return ( ) => document . removeEventListener ( 'keydown' , handleNavigate ) ;
96+ }
97+
98+ return undefined ;
99+ } , [ disableEventListeners , handleNavigate ] ) ;
91100
92101 return { focused, setFocus} ;
93102}
94103
95- export { useKeyboardNavigate } ;
104+ export { useListKeyboardNavigate } ;
0 commit comments