Skip to content

Commit 031eba7

Browse files
authored
[react-events] Tap: change order of events (#16694)
Before: start -> change -> update -> end (cancel) -> change Now: start -> change -> update -> change -> end (cancel)
1 parent f26fe8c commit 031eba7

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

packages/react-events/src/dom/Tap.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,8 @@ const responderImpl = {
573573

574574
state.gestureState = createGestureState(context, props, state, event);
575575

576+
state.isActive = false;
577+
dispatchChange(context, props, state);
576578
if (context.isTargetWithinResponder(hitTarget)) {
577579
// Determine whether to call preventDefault on subsequent native events.
578580
if (isModifiedTap(event)) {
@@ -582,8 +584,6 @@ const responderImpl = {
582584
} else {
583585
dispatchCancel(context, props, state);
584586
}
585-
state.isActive = false;
586-
dispatchChange(context, props, state);
587587
}
588588

589589
if (!hasPointerEvents) {
@@ -601,9 +601,9 @@ const responderImpl = {
601601
case 'dragstart': {
602602
if (state.isActive && isActivePointer(event, state)) {
603603
state.gestureState = createGestureState(context, props, state, event);
604-
dispatchCancel(context, props, state);
605604
state.isActive = false;
606605
dispatchChange(context, props, state);
606+
dispatchCancel(context, props, state);
607607
}
608608
break;
609609
}
@@ -620,9 +620,9 @@ const responderImpl = {
620620
context.isTargetWithinNode(state.responderTarget, nativeEvent.target)
621621
) {
622622
state.gestureState = createGestureState(context, props, state, event);
623-
dispatchCancel(context, props, state);
624623
state.isActive = false;
625624
dispatchChange(context, props, state);
625+
dispatchCancel(context, props, state);
626626
}
627627
break;
628628
}

packages/react-events/src/dom/__tests__/Tap-test.internal.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ function tapAndMoveOutside({
4747
// NOTE: this assumes the PointerEvent implementation calls
4848
// 'releasePointerCapture' for touch pointers
4949
if (!hasPointerEvents && pointerType === 'touch') {
50-
downTarget.pointermove({pointerType, ...coordinatesOutside});
5150
document.elementFromPoint = () => upTarget.node;
51+
downTarget.pointermove({pointerType, ...coordinatesOutside});
5252
} else {
5353
upTarget.pointermove({pointerType, ...coordinatesOutside});
5454
}
@@ -450,26 +450,41 @@ describeWithPointerEvent('Tap responder', hasPointerEvents => {
450450
});
451451

452452
describe('onTapChange', () => {
453-
let onTapChange, ref;
453+
let eventsLog, onTapChange, ref;
454+
455+
const logger = msg => () => {
456+
eventsLog.push(msg);
457+
};
454458

455459
beforeEach(() => {
460+
eventsLog = [];
456461
onTapChange = jest.fn();
457462
ref = React.createRef();
458463
const Component = () => {
459-
const listener = useTap({onTapChange});
464+
const listener = useTap({
465+
onTapChange(e) {
466+
logger('change')();
467+
onTapChange(e);
468+
},
469+
onTapStart: logger('start'),
470+
onTapEnd: logger('end'),
471+
onTapCancel: logger('cancel'),
472+
});
460473
return <div ref={ref} listeners={listener} />;
461474
};
462475
ReactDOM.render(<Component />, container);
476+
document.elementFromPoint = () => ref.current;
463477
});
464478

465479
testWithPointerType('pointer down/up', pointerType => {
466480
const target = createEventTarget(ref.current);
467481
target.pointerdown({pointerType});
468482
expect(onTapChange).toHaveBeenCalledTimes(1);
469483
expect(onTapChange).toHaveBeenCalledWith(true);
470-
target.pointerup({pointerType});
484+
target.pointerup({pointerType, x: 0, y: 0});
471485
expect(onTapChange).toHaveBeenCalledTimes(2);
472486
expect(onTapChange).toHaveBeenCalledWith(false);
487+
expect(eventsLog).toEqual(['start', 'change', 'change', 'end']);
473488
});
474489

475490
testWithPointerType('pointer cancel', pointerType => {
@@ -480,6 +495,7 @@ describeWithPointerEvent('Tap responder', hasPointerEvents => {
480495
target.pointercancel({pointerType});
481496
expect(onTapChange).toHaveBeenCalledTimes(2);
482497
expect(onTapChange).toHaveBeenCalledWith(false);
498+
expect(eventsLog).toEqual(['start', 'change', 'change', 'cancel']);
483499
});
484500

485501
testWithPointerType('pointer move outside target', pointerType => {

0 commit comments

Comments
 (0)