1414 * limitations under the License.
1515 */
1616
17- import { useCallback , useEffect , useMemo , useRef } from 'react'
17+ import { KeyboardEvent , useCallback , useEffect , useMemo , useRef } from 'react'
1818import { deepEquals } from '@rjsf/utils'
1919
20+ import { noop } from '@Common/Helper'
21+
2022import { ShortcutType , UseRegisterShortcutContextType , UseRegisterShortcutProviderType } from './types'
2123import { UseRegisterShortcutContext } from './UseRegisterShortcutContext'
2224import { preprocessKeys , verifyCallbackStack } from './utils'
@@ -25,7 +27,7 @@ const IGNORE_TAGS_FALLBACK = ['input', 'textarea', 'select']
2527const DEFAULT_TIMEOUT = 300
2628
2729const UseRegisterShortcutProvider = ( {
28- containerRef ,
30+ shouldHookOntoWindow = true ,
2931 ignoreTags,
3032 preventDefault = false ,
3133 shortcutTimeout,
@@ -117,13 +119,12 @@ const UseRegisterShortcutProvider = ({
117119 }
118120 } , [ ] )
119121
120- const handleKeydownEvent = useCallback ( ( event : KeyboardEvent ) => {
122+ const handleKeydownEvent = useCallback ( ( event : KeyboardEvent < HTMLElement > ) => {
121123 if (
122124 // NOTE: in case of custom events generated by password managers autofill, the event.key is not set
123125 ! event . key ||
124- ( ignoredTags . map ( ( tag ) => tag . toUpperCase ( ) ) . indexOf ( ( event . target as HTMLElement ) . tagName ?. toUpperCase ( ) ) >
125- - 1 &&
126- ( ! containerRef || containerRef . current ?. contains ( event . target as HTMLElement ) ) ) ||
126+ ignoredTags . map ( ( tag ) => tag . toUpperCase ( ) ) . indexOf ( ( event . target as HTMLElement ) . tagName ?. toUpperCase ( ) ) >
127+ - 1 ||
127128 ( event . target as HTMLElement ) ?. role === 'textbox' ||
128129 disableShortcutsRef . current
129130 ) {
@@ -161,29 +162,48 @@ const UseRegisterShortcutProvider = ({
161162 } , [ ] )
162163
163164 useEffect ( ( ) => {
164- window . addEventListener ( 'keydown' , handleKeydownEvent )
165+ if ( ! shouldHookOntoWindow ) {
166+ return noop
167+ }
168+
169+ window . addEventListener ( 'keydown' , handleKeydownEvent as unknown as ( event : globalThis . KeyboardEvent ) => void )
165170 window . addEventListener ( 'keyup' , handleKeyupEvent )
166171 window . addEventListener ( 'blur' , handleBlur )
167172
168173 return ( ) => {
169- window . removeEventListener ( 'keydown' , handleKeydownEvent )
174+ window . removeEventListener (
175+ 'keydown' ,
176+ handleKeydownEvent as unknown as ( event : globalThis . KeyboardEvent ) => void ,
177+ )
170178 window . removeEventListener ( 'keyup' , handleKeyupEvent )
171179 window . removeEventListener ( 'blur' , handleBlur )
172180
173181 if ( keyDownTimeoutRef . current > - 1 ) {
174182 clearTimeout ( keyDownTimeoutRef . current )
175183 }
176184 }
177- } , [ handleKeyupEvent , handleKeydownEvent , handleBlur ] )
185+ } , [ handleKeyupEvent , handleKeydownEvent , handleBlur , shouldHookOntoWindow ] )
178186
179187 const providerValue : UseRegisterShortcutContextType = useMemo (
180188 ( ) => ( {
181189 registerShortcut,
182190 unregisterShortcut,
183191 setDisableShortcuts,
184192 triggerShortcut,
193+ ...( ! shouldHookOntoWindow
194+ ? { targetProps : { onKeyDown : handleKeydownEvent , onKeyUp : handleKeyupEvent , onBlur : handleBlur } }
195+ : { } ) ,
185196 } ) ,
186- [ registerShortcut , unregisterShortcut , setDisableShortcuts , triggerShortcut ] ,
197+ [
198+ registerShortcut ,
199+ unregisterShortcut ,
200+ setDisableShortcuts ,
201+ triggerShortcut ,
202+ shouldHookOntoWindow ,
203+ handleKeydownEvent ,
204+ handleKeyupEvent ,
205+ handleBlur ,
206+ ] ,
187207 )
188208
189209 return < UseRegisterShortcutContext . Provider value = { providerValue } > { children } </ UseRegisterShortcutContext . Provider >
0 commit comments