Skip to content

Commit 031eba7

Browse files
author
Nicolas Gallagher
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

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

‎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-
letonTapChange,ref;
453+
leteventsLog,onTapChange,ref;
454+
455+
constlogger=msg=>()=>{
456+
eventsLog.push(msg);
457+
};
454458

455459
beforeEach(()=>{
460+
eventsLog=[];
456461
onTapChange=jest.fn();
457462
ref=React.createRef();
458463
constComponent=()=>{
459-
constlistener=useTap({onTapChange});
464+
constlistener=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<divref={ref}listeners={listener}/>;
461474
};
462475
ReactDOM.render(<Component/>,container);
476+
document.elementFromPoint=()=>ref.current;
463477
});
464478

465479
testWithPointerType('pointer down/up',pointerType=>{
466480
consttarget=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)