@@ -16,26 +16,32 @@ import React from 'react';
16
16
import { DiscreteEvent } from 'shared/ReactTypes' ;
17
17
import type { ReactEventResponderListener } from 'shared/ReactTypes' ;
18
18
19
- type KeyboardEventType = 'keydown' | 'keyup' ;
19
+ type KeyboardEventType = 'keyboard: keydown' | 'keyboard: keyup' ;
20
20
21
- type KeyboardProps = {
21
+ type KeyboardProps = { |
22
22
disabled ? : boolean ,
23
23
onKeyDown ?: ( e : KeyboardEvent ) => ?boolean ,
24
24
onKeyUp ?: ( e : KeyboardEvent ) => ?boolean ,
25
25
preventKeys ? : PreventKeysArray ,
26
- } ;
26
+ | } ;
27
+
28
+ type KeyboardState = { |
29
+ defaultPrevented : boolean ,
30
+ isActive : boolean ,
31
+ | } ;
27
32
28
33
export type KeyboardEvent = { |
29
34
altKey : boolean ,
30
35
ctrlKey : boolean ,
36
+ defaultPrevented : boolean ,
31
37
isComposing : boolean ,
32
38
key : string ,
33
39
metaKey : boolean ,
40
+ pointerType : 'keyboard' ,
34
41
shiftKey : boolean ,
35
42
target : Element | Document ,
36
43
type : KeyboardEventType ,
37
44
timeStamp : number ,
38
- defaultPrevented : boolean ,
39
45
| } ;
40
46
41
47
type ModifiersObject = { |
@@ -48,7 +54,7 @@ type ModifiersObject = {|
48
54
type PreventKeysArray = Array < string | Array < string | ModifiersObject >> ;
49
55
50
56
const isArray = Array . isArray ;
51
- const targetEventTypes = [ 'keydown_active' , 'keyup' ] ;
57
+ const targetEventTypes = [ 'click_active' , ' keydown_active', 'keyup' ] ;
52
58
const modifiers = [ 'altKey' , 'ctrlKey' , 'metaKey' , 'shiftKey' ] ;
53
59
54
60
/**
@@ -150,6 +156,7 @@ function createKeyboardEvent(
150
156
isComposing,
151
157
key : getEventKey ( nativeEvent ) ,
152
158
metaKey,
159
+ pointerType : 'keyboard' ,
153
160
shiftKey,
154
161
target : event . target ,
155
162
timeStamp : context . getTimeStamp ( ) ,
@@ -182,21 +189,30 @@ function dispatchKeyboardEvent(
182
189
183
190
const keyboardResponderImpl = {
184
191
targetEventTypes,
192
+ getInitialState ( ) : KeyboardState {
193
+ return {
194
+ defaultPrevented : false ,
195
+ isActive : false ,
196
+ } ;
197
+ } ,
185
198
onEvent (
186
199
event : ReactDOMResponderEvent ,
187
200
context : ReactDOMResponderContext ,
188
201
props : KeyboardProps ,
202
+ state : KeyboardState ,
189
203
) : void {
190
204
const { type} = event ;
191
205
const nativeEvent : any = event . nativeEvent ;
192
206
193
207
if ( props . disabled ) {
194
208
return ;
195
209
}
196
- let defaultPrevented = nativeEvent . defaultPrevented === true ;
210
+
197
211
if ( type === 'keydown' ) {
212
+ state . defaultPrevented = nativeEvent . defaultPrevented === true ;
213
+
198
214
const preventKeys = ( ( props . preventKeys : any ) : PreventKeysArray ) ;
199
- if ( ! defaultPrevented && isArray ( preventKeys ) ) {
215
+ if ( ! state . defaultPrevented && isArray ( preventKeys ) ) {
200
216
preventKeyLoop: for ( let i = 0 ; i < preventKeys . length ; i ++ ) {
201
217
const preventKey = preventKeys [ i ] ;
202
218
let key = preventKey ;
@@ -216,32 +232,38 @@ const keyboardResponderImpl = {
216
232
}
217
233
}
218
234
}
235
+
219
236
if ( key === getEventKey ( nativeEvent ) ) {
220
- defaultPrevented = true ;
237
+ state . defaultPrevented = true ;
221
238
nativeEvent . preventDefault ( ) ;
222
239
break ;
223
240
}
224
241
}
225
242
}
243
+ state . isActive = true ;
226
244
const onKeyDown = props . onKeyDown ;
227
245
if ( isFunction ( onKeyDown ) ) {
228
246
dispatchKeyboardEvent (
229
247
event ,
230
248
( ( onKeyDown : any ) : ( e : KeyboardEvent ) = > ?boolean ) ,
231
249
context ,
232
- 'keydown' ,
233
- defaultPrevented ,
250
+ 'keyboard: keydown' ,
251
+ state . defaultPrevented ,
234
252
) ;
235
253
}
254
+ } else if ( type === 'click' && state . isActive && state . defaultPrevented ) {
255
+ // 'click' occurs before 'keyup' and may need native behavior prevented
256
+ nativeEvent . preventDefault ( ) ;
236
257
} else if ( type === 'keyup' ) {
258
+ state . isActive = false ;
237
259
const onKeyUp = props . onKeyUp ;
238
260
if ( isFunction ( onKeyUp ) ) {
239
261
dispatchKeyboardEvent (
240
262
event ,
241
263
( ( onKeyUp : any ) : ( e : KeyboardEvent ) = > ?boolean ) ,
242
264
context ,
243
- 'keyup' ,
244
- defaultPrevented ,
265
+ 'keyboard: keyup' ,
266
+ state . defaultPrevented ,
245
267
) ;
246
268
}
247
269
}
0 commit comments