diff --git a/packages/react-events/src/Press.js b/packages/react-events/src/Press.js index ecc3e807d1..9c498cb1e9 100644 --- a/packages/react-events/src/Press.js +++ b/packages/react-events/src/Press.js @@ -118,7 +118,6 @@ const DEFAULT_PRESS_RETENTION_OFFSET = { }; const targetEventTypes = [ - {name: 'click', passive: false}, {name: 'keydown', passive: false}, {name: 'contextmenu', passive: false}, // We need to preventDefault on pointerdown for mouse/pen events @@ -126,6 +125,7 @@ const targetEventTypes = [ {name: 'pointerdown', passive: false}, ]; const rootEventTypes = [ + {name: 'click', passive: false}, 'keyup', 'pointerup', 'pointermove', @@ -422,11 +422,9 @@ function dispatchCancel( ): void { if (state.isPressed) { state.ignoreEmulatedMouseEvents = false; - removeRootEventTypes(context, state); dispatchPressEndEvents(event, context, props, state); - } else if (state.allowPressReentry) { - removeRootEventTypes(context, state); } + removeRootEventTypes(context, state); } function isValidKeyboardEvent(nativeEvent: Object): boolean { @@ -609,7 +607,7 @@ const PressResponder = { props: PressProps, state: PressState, ): void { - const {target, type} = event; + const {type} = event; if (props.disabled) { removeRootEventTypes(context, state); @@ -652,6 +650,7 @@ const PressResponder = { context.isEventWithinTouchHitTarget(event) ) { // We need to prevent the native event to block the focus + removeRootEventTypes(context, state); nativeEvent.preventDefault(); return; } @@ -710,29 +709,6 @@ const PressResponder = { } break; } - - case 'click': { - if (context.isTargetWithinHostComponent(target, 'a', true)) { - const { - altKey, - ctrlKey, - metaKey, - shiftKey, - } = (nativeEvent: MouseEvent); - // Check "open in new window/tab" and "open context menu" key modifiers - const preventDefault = props.preventDefault; - if ( - preventDefault !== false && - !shiftKey && - !metaKey && - !ctrlKey && - !altKey - ) { - nativeEvent.preventDefault(); - } - } - break; - } } }, onRootEvent( @@ -807,9 +783,6 @@ const PressResponder = { dispatchPressStartEvents(event, context, props, state); } } else { - if (!state.allowPressReentry) { - removeRootEventTypes(context, state); - } dispatchPressEndEvents(event, context, props, state); } } @@ -851,7 +824,6 @@ const PressResponder = { } const wasLongPressed = state.isLongPressed; - removeRootEventTypes(context, state); dispatchPressEndEvents(event, context, props, state); if (state.pressTarget !== null && props.onPress) { @@ -874,10 +846,35 @@ const PressResponder = { } } } - } else if (type === 'mouseup' && state.ignoreEmulatedMouseEvents) { + } else if (type === 'mouseup') { state.ignoreEmulatedMouseEvents = false; - } else if (state.allowPressReentry) { - removeRootEventTypes(context, state); + } + break; + } + + case 'click': { + removeRootEventTypes(context, state); + if ( + context.isTargetWithinEventComponent(target) && + context.isTargetWithinHostComponent(target, 'a', true) + ) { + const { + altKey, + ctrlKey, + metaKey, + shiftKey, + } = (nativeEvent: MouseEvent); + // Check "open in new window/tab" and "open context menu" key modifiers + const preventDefault = props.preventDefault; + if ( + preventDefault !== false && + !shiftKey && + !metaKey && + !ctrlKey && + !altKey + ) { + nativeEvent.preventDefault(); + } } break; }