@@ -24,15 +24,12 @@ type KeyboardEventType =
2424
2525type KeyboardProps = { |
2626disabled ? : boolean ,
27- onClick ?: ( e : KeyboardEvent ) => ?boolean ,
28- onKeyDown ?: ( e : KeyboardEvent ) => ?boolean ,
29- onKeyUp ?: ( e : KeyboardEvent ) => ?boolean ,
30- preventClick ?: boolean ,
31- preventKeys ? : PreventKeysArray ,
27+ onClick ?: ( e : KeyboardEvent ) => void ,
28+ onKeyDown ?: ( e : KeyboardEvent ) => void ,
29+ onKeyUp ?: ( e : KeyboardEvent ) => void ,
3230| } ;
3331
3432type KeyboardState = { |
35- defaultPrevented : boolean ,
3633isActive : boolean ,
3734| } ;
3835
@@ -48,20 +45,11 @@ export type KeyboardEvent = {|
4845target : Element | Document ,
4946type : KeyboardEventType ,
5047timeStamp : number ,
48+ continuePropagation : ( ) => void ,
49+ preventDefault : ( ) => void ,
5150| } ;
5251
53- type ModifiersObject = { |
54- altKey ? : boolean ,
55- ctrlKey ? : boolean ,
56- metaKey ? : boolean ,
57- shiftKey ? : boolean ,
58- | } ;
59-
60- type PreventKeysArray = Array < string | Array < string | ModifiersObject >> ;
61-
62- const isArray = Array . isArray ;
6352const targetEventTypes = [ 'click_active' , 'keydown_active' , 'keyup' ] ;
64- const modifiers = [ 'altKey' , 'ctrlKey' , 'metaKey' , 'shiftKey' ] ;
6553
6654/**
6755 * Normalization of deprecated HTML5 `key` values
@@ -146,20 +134,31 @@ function createKeyboardEvent(
146134event : ReactDOMResponderEvent ,
147135context : ReactDOMResponderContext ,
148136type : KeyboardEventType ,
149- defaultPrevented : boolean ,
150137) : KeyboardEvent {
151138const nativeEvent = ( event : any ) . nativeEvent ;
152139const { altKey, ctrlKey, metaKey, shiftKey} = nativeEvent ;
153140let keyboardEvent = {
154141 altKey,
155142 ctrlKey,
156- defaultPrevented,
143+ defaultPrevented : nativeEvent . defaultPrevented === true ,
157144 metaKey,
158145pointerType : 'keyboard' ,
159146 shiftKey,
160147target : event . target ,
161148timeStamp : context . getTimeStamp ( ) ,
162149 type,
150+ // We don't use stopPropagation, as the default behavior
151+ // is to not propagate. Plus, there might be confusion
152+ // using stopPropagation as we don't actually stop
153+ // native propagation from working, but instead only
154+ // allow propagation to the others keyboard responders.
155+ continuePropagation ( ) {
156+ context . continuePropagation ( ) ;
157+ } ,
158+ preventDefault ( ) {
159+ keyboardEvent . defaultPrevented = true ;
160+ nativeEvent . preventDefault ( ) ;
161+ } ,
163162} ;
164163if ( type !== 'keyboard:click' ) {
165164const key = getEventKey ( nativeEvent ) ;
@@ -171,32 +170,18 @@ function createKeyboardEvent(
171170
172171function dispatchKeyboardEvent (
173172event : ReactDOMResponderEvent ,
174- listener : KeyboardEvent => ? boolean ,
173+ listener : KeyboardEvent => void ,
175174context : ReactDOMResponderContext ,
176175type : KeyboardEventType ,
177- defaultPrevented : boolean ,
178176) : void {
179- const syntheticEvent = createKeyboardEvent (
180- event ,
181- context ,
182- type ,
183- defaultPrevented ,
184- ) ;
185- let shouldPropagate ;
186- const listenerWithReturnValue = e => {
187- shouldPropagate = listener ( e ) ;
188- } ;
189- context . dispatchEvent ( syntheticEvent , listenerWithReturnValue , DiscreteEvent ) ;
190- if ( shouldPropagate ) {
191- context . continuePropagation ( ) ;
192- }
177+ const syntheticEvent = createKeyboardEvent ( event , context , type ) ;
178+ context . dispatchEvent ( syntheticEvent , listener , DiscreteEvent ) ;
193179}
194180
195181const keyboardResponderImpl = {
196182 targetEventTypes,
197183getInitialState ( ) : KeyboardState {
198184return {
199- defaultPrevented : false ,
200185isActive : false ,
201186} ;
202187} ,
@@ -207,82 +192,36 @@ const keyboardResponderImpl = {
207192state : KeyboardState ,
208193) : void {
209194const { type} = event ;
210- const nativeEvent : any = event . nativeEvent ;
211195
212196if ( props . disabled ) {
213197return ;
214198}
215199
216200if ( type === 'keydown' ) {
217- state . defaultPrevented = nativeEvent . defaultPrevented === true ;
218-
219- const preventKeys = ( ( props . preventKeys : any ) : PreventKeysArray ) ;
220- if ( ! state . defaultPrevented && isArray ( preventKeys ) ) {
221- preventKeyLoop: for ( let i = 0 ; i < preventKeys . length ; i ++ ) {
222- const preventKey = preventKeys [ i ] ;
223- let key = preventKey ;
224-
225- if ( isArray ( preventKey ) ) {
226- key = preventKey [ 0 ] ;
227- const config = ( ( preventKey [ 1 ] : any ) : Object ) ;
228- for ( let s = 0 ; s < modifiers . length ; s ++ ) {
229- const modifier = modifiers [ s ] ;
230- const configModifier = config [ modifier ] ;
231- const eventModifier = nativeEvent [ modifier ] ;
232- if (
233- ( configModifier && ! eventModifier ) ||
234- ( ! configModifier && eventModifier )
235- ) {
236- continue preventKeyLoop;
237- }
238- }
239- }
240-
241- if ( key === getEventKey ( nativeEvent ) ) {
242- state . defaultPrevented = true ;
243- nativeEvent . preventDefault ( ) ;
244- break ;
245- }
246- }
247- }
248201state . isActive = true ;
249202const onKeyDown = props . onKeyDown ;
250203if ( onKeyDown != null ) {
251204dispatchKeyboardEvent (
252205event ,
253- ( ( onKeyDown : any ) : ( e : KeyboardEvent ) = > ? boolean ) ,
206+ ( ( onKeyDown : any ) : ( e : KeyboardEvent ) = > void ) ,
254207context ,
255208'keyboard:keydown' ,
256- state . defaultPrevented ,
257209) ;
258210}
259211} else if ( type === 'click' && isVirtualClick ( event ) ) {
260- if ( props . preventClick !== false ) {
261- // 'click' occurs before or after 'keyup', and may need native
262- // behavior prevented
263- nativeEvent . preventDefault ( ) ;
264- state . defaultPrevented = true ;
265- }
266212const onClick = props . onClick ;
267213if ( onClick != null ) {
268- dispatchKeyboardEvent (
269- event ,
270- onClick ,
271- context ,
272- 'keyboard:click' ,
273- state . defaultPrevented ,
274- ) ;
214+ dispatchKeyboardEvent ( event , onClick , context , 'keyboard:click' ) ;
275215}
276216} else if ( type === 'keyup' ) {
277217state . isActive = false ;
278218const onKeyUp = props . onKeyUp ;
279219if ( onKeyUp != null ) {
280220dispatchKeyboardEvent (
281221event ,
282- ( ( onKeyUp : any ) : ( e : KeyboardEvent ) = > ? boolean ) ,
222+ ( ( onKeyUp : any ) : ( e : KeyboardEvent ) = > void ) ,
283223context ,
284224'keyboard:keyup' ,
285- state . defaultPrevented ,
286225) ;
287226}
288227}
0 commit comments