Experimental Event API: preventDefault handling for anchors (#15383)
Dominic Gannaway committed
Apr 11, 2019 at 12:04 UTC
c9841001b07200660de21a3275afd1cd7d9554a8
1 file changed
+10
-21
packages/react-events/src/Press.js
+10
-21
@@ -32,10 +32,10 @@ type PressProps = {
32
bottom: number,
33
left: number,
34
},
35
+ preventDefault: boolean,
36
};
37
38
type PressState = {
38
- defaultPrevented: boolean,
39
isActivePressed: boolean,
40
isActivePressStart: boolean,
41
isAnchorTouched: boolean,
@@ -206,14 +206,7 @@ function dispatchPressStartEvents(
206
state.isLongPressed = true;
207
state.longPressTimeout = null;
208
if (props.onLongPress) {
209
- const listener = e => {
210
- props.onLongPress(e);
211
- // TODO address this again at some point
212
- // if (e.nativeEvent.defaultPrevented) {
213
- // state.defaultPrevented = true;
214
- // }
215
- };
216
- dispatchEvent(context, state, 'longpress', listener);
209
+ dispatchEvent(context, state, 'longpress', props.onLongPress);
210
}
211
if (props.onLongPressChange) {
212
dispatchLongPressChangeEvent(context, props, state);
@@ -363,7 +356,6 @@ const PressResponder = {
356
targetEventTypes,
357
createInitialState(): PressState {
358
return {
366
- defaultPrevented: false,
359
isActivePressed: false,
360
isActivePressStart: false,
361
isAnchorTouched: false,
@@ -477,14 +469,7 @@ const PressResponder = {
469
props.onLongPressShouldCancelPress()
470
)
471
) {
480
- const listener = e => {
481
- props.onPress(e);
482
- // TODO address this again at some point
483
- // if (e.nativeEvent.defaultPrevented) {
484
- // state.defaultPrevented = true;
485
- // }
486
- };
487
- dispatchEvent(context, state, 'press', listener);
472
+ dispatchEvent(context, state, 'press', props.onPress);
473
}
474
}
475
}
@@ -607,9 +592,13 @@ const PressResponder = {
592
}
593
594
case 'click': {
610
- if (state.defaultPrevented) {
611
- (nativeEvent: any).preventDefault();
612
- state.defaultPrevented = false;
595
+ if (isAnchorTagElement(target)) {
596
+ const {ctrlKey, metaKey, shiftKey} = ((nativeEvent: any): MouseEvent);
597
+ const preventDefault = props.preventDefault;
598
+ // Check "open in new window/tab" key modifiers
599
+ if (preventDefault !== false && !shiftKey && !ctrlKey && !metaKey) {
600
+ (nativeEvent: any).preventDefault();
601
+ }
602
}
603
}
604
}