[Flare] Remove delay props from Press (#16247)
Moving working with delays into user-space.
Nicolas Gallagher committed
Jul 30, 2019 at 09:29 UTC
1912b4a0f1dc68e8f39978b9bac48d7f77b2b97c
3 files changed
+33
-697
packages/react-events/docs/Press.md
+4
-20
@@ -74,17 +74,6 @@ type PressOffset = {
74
75
## Props
76
77
-### delayPressEnd: number
78
-
79
-The duration of the delay between when the press ends and when `onPressEnd` is
80
-called.
81
-
82
-### delayPressStart: number
83
-
84
-The duration of a delay between when the press starts and when `onPressStart` is
85
-called. This delay is cut short (and `onPressStart` is called) if the press is
86
-released before the threshold is exceeded.
87
-
77
### disabled: boolean = false
78
79
Disables all `Press` events.
@@ -107,21 +96,16 @@ Called when the element changes press state (i.e., after `onPressStart` and
96
### onPressEnd: (e: PressEvent) => void
97
98
Called once the element is no longer pressed (because the press was released,
110
-cancelled, or moved beyond the hit bounds). If the press starts again before the
111
-`delayPressEnd` threshold is exceeded then the delay is reset to prevent
112
-`onPressEnd` being called during a press.
99
+cancelled, or moved beyond the hit bounds).
100
101
### onPressMove: (e: PressEvent) => void
102
116
-Called when a press moves within the hit bounds of the element. `onPressMove` is
117
-called immediately and doesn't wait for delayed `onPressStart`. Never called for
103
+Called when a press moves within the hit bounds of the element. Never called for
104
keyboard-initiated press events.
105
106
### onPressStart: (e: PressEvent) => void
107
122
-Called once the element is pressed down. If the press is released before the
123
-`delayPressStart` threshold is exceeded then the delay is cut short and
124
-`onPressStart` is called immediately.
108
+Called once the element is pressed down.
109
110
### pressRetentionOffset: PressOffset
111
@@ -142,4 +126,4 @@ Whether to `preventDefault()` native events. Native behavior is prevented by
126
default. If an anchor is the child of `Press`, internal and external navigation
127
should be performed in `onPress`. To rely on native behavior instead, set
128
`preventDefault` to `false`, but be aware that native behavior will take place
145
-immediately after interaction without respect for delays or long press.
129
+immediately after interaction.
packages/react-events/src/dom/Press.js
+26
-89
@@ -28,8 +28,6 @@ type PressListenerProps = {|
28
29
type PressProps = {|
30
disabled: boolean,
31
- delayPressEnd: number,
32
- delayPressStart: number,
31
pressRetentionOffset: {
32
top: number,
33
right: number,
@@ -53,7 +51,6 @@ type PressState = {
51
isPressWithinResponderRegion: boolean,
52
pointerType: PointerType,
53
pressTarget: null | Element | Document,
56
- pressEndTimeout: null | number,
54
pressStartTimeout: null | number,
55
responderRegionOnActivation: null | $ReadOnly<{|
56
bottom: number,
@@ -106,8 +103,6 @@ const isMac =
103
typeof window !== 'undefined' && window.navigator != null
104
? /^Mac/.test(window.navigator.platform)
105
: false;
109
-const DEFAULT_PRESS_END_DELAY_MS = 0;
110
-const DEFAULT_PRESS_START_DELAY_MS = 0;
106
const DEFAULT_PRESS_RETENTION_OFFSET = {
107
bottom: 20,
108
top: 20,
@@ -240,35 +235,6 @@ function dispatchPressChangeEvent(
235
context.dispatchEvent('onPressChange', bool, DiscreteEvent);
236
}
237
243
-function activate(event: ReactDOMResponderEvent, context, props, state) {
244
- const nativeEvent: any = event.nativeEvent;
245
- const {clientX: x, clientY: y} = state.touchEvent || nativeEvent;
246
- const wasActivePressed = state.isActivePressed;
247
- state.isActivePressed = true;
248
- if (x !== undefined && y !== undefined) {
249
- state.activationPosition = {x, y};
250
- }
251
-
252
- dispatchEvent(
253
- 'onPressStart',
254
- event,
255
- context,
256
- state,
257
- 'pressstart',
258
- DiscreteEvent,
259
- );
260
- if (!wasActivePressed) {
261
- dispatchPressChangeEvent(context, state);
262
- }
263
-}
264
-
265
-function deactivate(event: ?ReactDOMResponderEvent, context, props, state) {
266
- state.isActivePressed = false;
267
-
268
- dispatchEvent('onPressEnd', event, context, state, 'pressend', DiscreteEvent);
269
- dispatchPressChangeEvent(context, state);
270
-}
271
-
238
function dispatchPressStartEvents(
239
event: ReactDOMResponderEvent,
240
context: ReactDOMResponderContext,
@@ -277,29 +243,26 @@ function dispatchPressStartEvents(
243
): void {
244
state.isPressed = true;
245
280
- if (state.pressEndTimeout !== null) {
281
- context.clearTimeout(state.pressEndTimeout);
282
- state.pressEndTimeout = null;
283
- }
284
-
285
- const dispatch = () => {
246
+ if (!state.isActivePressStart) {
247
state.isActivePressStart = true;
287
- activate(event, context, props, state);
288
- };
248
+ const nativeEvent: any = event.nativeEvent;
249
+ const {clientX: x, clientY: y} = state.touchEvent || nativeEvent;
250
+ const wasActivePressed = state.isActivePressed;
251
+ state.isActivePressed = true;
252
+ if (x !== undefined && y !== undefined) {
253
+ state.activationPosition = {x, y};
254
+ }
255
290
- if (!state.isActivePressStart) {
291
- const delayPressStart = calculateDelayMS(
292
- props.delayPressStart,
293
- 0,
294
- DEFAULT_PRESS_START_DELAY_MS,
256
+ dispatchEvent(
257
+ 'onPressStart',
258
+ event,
259
+ context,
260
+ state,
261
+ 'pressstart',
262
+ DiscreteEvent,
263
);
296
- if (delayPressStart > 0) {
297
- state.pressStartTimeout = context.setTimeout(() => {
298
- state.pressStartTimeout = null;
299
- dispatch();
300
- }, delayPressStart);
301
- } else {
302
- dispatch();
264
+ if (!wasActivePressed) {
265
+ dispatchPressChangeEvent(context, state);
266
}
267
}
268
}
@@ -310,40 +273,20 @@ function dispatchPressEndEvents(
273
props: PressProps,
274
state: PressState,
275
): void {
313
- const wasActivePressStart = state.isActivePressStart;
314
- let activationWasForced = false;
315
-
276
state.isActivePressStart = false;
277
state.isPressed = false;
278
319
- if (!wasActivePressStart && state.pressStartTimeout !== null) {
320
- context.clearTimeout(state.pressStartTimeout);
321
- state.pressStartTimeout = null;
322
- // don't activate if a press has moved beyond the responder region
323
- if (state.isPressWithinResponderRegion && event != null) {
324
- // if we haven't yet activated (due to delays), activate now
325
- activate(event, context, props, state);
326
- activationWasForced = true;
327
- }
328
- }
329
-
279
if (state.isActivePressed) {
331
- const delayPressEnd = calculateDelayMS(
332
- props.delayPressEnd,
333
- // if activation and deactivation occur during the same event there's no
334
- // time for visual user feedback therefore a small delay is added before
335
- // deactivating.
336
- activationWasForced ? 10 : 0,
337
- DEFAULT_PRESS_END_DELAY_MS,
280
+ state.isActivePressed = false;
281
+ dispatchEvent(
282
+ 'onPressEnd',
283
+ event,
284
+ context,
285
+ state,
286
+ 'pressend',
287
+ DiscreteEvent,
288
);
339
- if (delayPressEnd > 0) {
340
- state.pressEndTimeout = context.setTimeout(() => {
341
- state.pressEndTimeout = null;
342
- deactivate(event, context, props, state);
343
- }, delayPressEnd);
344
- } else {
345
- deactivate(event, context, props, state);
346
- }
289
+ dispatchPressChangeEvent(context, state);
290
}
291
292
state.responderRegionOnDeactivation = null;
@@ -380,11 +323,6 @@ function isValidKeyboardEvent(nativeEvent: Object): boolean {
323
);
324
}
325
383
-function calculateDelayMS(delay: ?number, min = 0, fallback = 0) {
384
- const maybeNumber = delay == null ? null : delay;
385
- return Math.max(min, maybeNumber != null ? maybeNumber : fallback);
386
-}
387
-
326
// TODO: account for touch hit slop
327
function calculateResponderRegion(
328
context: ReactDOMResponderContext,
@@ -550,7 +488,6 @@ const pressResponderImpl = {
488
isPressed: false,
489
isPressWithinResponderRegion: true,
490
pointerType: '',
553
- pressEndTimeout: null,
491
pressStartTimeout: null,
492
pressTarget: null,
493
responderRegionOnActivation: null,
packages/react-events/src/dom/__tests__/Press-test.internal.js
+3
-588
@@ -16,8 +16,6 @@ let PressResponder;
16
let usePressListener;
17
let Scheduler;
18
19
-const DEFAULT_LONG_PRESS_DELAY = 500;
20
-
19
const createEvent = (type, data) => {
20
const event = document.createEvent('CustomEvent');
21
event.initCustomEvent(type, true, true);
@@ -262,129 +260,6 @@ describe('Event responder: Press', () => {
260
expect.objectContaining({pointerType: 'touch', type: 'pressstart'}),
261
);
262
});
265
-
266
- describe('delayPressStart', () => {
267
- it('can be configured', () => {
268
- const Component = () => {
269
- usePressListener({
270
- onPressStart,
271
- });
272
- return (
273
- <div
274
- ref={ref}
275
- responders={<PressResponder delayPressStart={2000} />}
276
- />
277
- );
278
- };
279
- ReactDOM.render(<Component />, container);
280
-
281
- ref.current.dispatchEvent(createEvent('pointerdown'));
282
- jest.advanceTimersByTime(1999);
283
- expect(onPressStart).not.toBeCalled();
284
- jest.advanceTimersByTime(1);
285
- expect(onPressStart).toHaveBeenCalledTimes(1);
286
- });
287
-
288
- it('is cut short if the press is released during a delay', () => {
289
- const Component = () => {
290
- usePressListener({
291
- onPressStart,
292
- });
293
- return (
294
- <div
295
- ref={ref}
296
- responders={<PressResponder delayPressStart={2000} />}
297
- />
298
- );
299
- };
300
- ReactDOM.render(<Component />, container);
301
-
302
- ref.current.getBoundingClientRect = () => ({
303
- top: 50,
304
- left: 50,
305
- bottom: 500,
306
- right: 500,
307
- });
308
-
309
- ref.current.dispatchEvent(createEvent('pointerdown'));
310
- jest.advanceTimersByTime(499);
311
- expect(onPressStart).toHaveBeenCalledTimes(0);
312
- ref.current.dispatchEvent(
313
- createEvent('pointerup', {
314
- clientX: 55,
315
- clientY: 55,
316
- }),
317
- );
318
- expect(onPressStart).toHaveBeenCalledTimes(1);
319
- jest.runAllTimers();
320
- expect(onPressStart).toHaveBeenCalledTimes(1);
321
- });
322
-
323
- it('onPressStart is called synchronously if delay is 0ms', () => {
324
- const Component = () => {
325
- usePressListener({
326
- onPressStart,
327
- });
328
- return (
329
- <div
330
- ref={ref}
331
- responders={<PressResponder delayPressStart={0} />}
332
- />
333
- );
334
- };
335
- ReactDOM.render(<Component />, container);
336
-
337
- ref.current.dispatchEvent(createEvent('pointerdown'));
338
- expect(onPressStart).toHaveBeenCalledTimes(1);
339
- });
340
-
341
- it('onPressStart should not be called if pointerCancel is fired before delayPressStart is finished', () => {
342
- const Component = () => {
343
- usePressListener({
344
- onPressStart,
345
- });
346
- return (
347
- <div
348
- ref={ref}
349
- responders={<PressResponder delayPressStart={500} />}
350
- />
351
- );
352
- };
353
- ReactDOM.render(<Component />, container);
354
-
355
- ref.current.dispatchEvent(createEvent('pointerdown'));
356
- jest.advanceTimersByTime(499);
357
- expect(onPressStart).toHaveBeenCalledTimes(0);
358
- ref.current.dispatchEvent(createEvent('pointercancel'));
359
- jest.runAllTimers();
360
- expect(onPressStart).toHaveBeenCalledTimes(0);
361
- });
362
- });
363
-
364
- describe('delayPressEnd', () => {
365
- it('onPressStart called each time a press is initiated', () => {
366
- // This test makes sure that onPressStart is called each time a press
367
- // starts, even if a delayPressEnd is delaying the deactivation of the
368
- // previous press.
369
- const Component = () => {
370
- usePressListener({
371
- onPressStart,
372
- });
373
- return (
374
- <div
375
- ref={ref}
376
- responders={<PressResponder delayPressEnd={2000} />}
377
- />
378
- );
379
- };
380
- ReactDOM.render(<Component />, container);
381
-
382
- ref.current.dispatchEvent(createEvent('pointerdown'));
383
- ref.current.dispatchEvent(createEvent('pointerup'));
384
- ref.current.dispatchEvent(createEvent('pointerdown'));
385
- expect(onPressStart).toHaveBeenCalledTimes(2);
386
- });
387
- });
263
});
264
265
describe('onPressEnd', () => {
@@ -549,71 +424,6 @@ describe('Event responder: Press', () => {
424
expect.objectContaining({pointerType: 'touch', type: 'pressend'}),
425
);
426
});
552
-
553
- describe('delayPressEnd', () => {
554
- it('can be configured', () => {
555
- const Component = () => {
556
- usePressListener({
557
- onPressEnd,
558
- });
559
- return (
560
- <div
561
- ref={ref}
562
- responders={<PressResponder delayPressEnd={2000} />}
563
- />
564
- );
565
- };
566
- ReactDOM.render(<Component />, container);
567
-
568
- ref.current.dispatchEvent(createEvent('pointerdown'));
569
- ref.current.dispatchEvent(createEvent('pointerup'));
570
- jest.advanceTimersByTime(1999);
571
- expect(onPressEnd).not.toBeCalled();
572
- jest.advanceTimersByTime(1);
573
- expect(onPressEnd).toHaveBeenCalledTimes(1);
574
- });
575
-
576
- it('is reset if "pointerdown" is dispatched during a delay', () => {
577
- const Component = () => {
578
- usePressListener({
579
- onPressEnd,
580
- });
581
- return (
582
- <div
583
- ref={ref}
584
- responders={<PressResponder delayPressEnd={500} />}
585
- />
586
- );
587
- };
588
- ReactDOM.render(<Component />, container);
589
-
590
- ref.current.dispatchEvent(createEvent('pointerdown'));
591
- ref.current.dispatchEvent(createEvent('pointerup'));
592
- jest.advanceTimersByTime(499);
593
- ref.current.dispatchEvent(createEvent('pointerdown'));
594
- jest.advanceTimersByTime(1);
595
- expect(onPressEnd).not.toBeCalled();
596
- ref.current.dispatchEvent(createEvent('pointerup'));
597
- jest.runAllTimers();
598
- expect(onPressEnd).toHaveBeenCalledTimes(1);
599
- });
600
- });
601
-
602
- it('onPressEnd is called synchronously if delay is 0ms', () => {
603
- const Component = () => {
604
- usePressListener({
605
- onPressEnd,
606
- });
607
- return (
608
- <div ref={ref} responders={<PressResponder delayPressEnd={0} />} />
609
- );
610
- };
611
- ReactDOM.render(<Component />, container);
612
-
613
- ref.current.dispatchEvent(createEvent('pointerdown'));
614
- ref.current.dispatchEvent(createEvent('pointerup'));
615
- expect(onPressEnd).toHaveBeenCalledTimes(1);
616
- });
427
});
428
429
describe('onPressChange', () => {
@@ -648,111 +458,6 @@ describe('Event responder: Press', () => {
458
expect(onPressChange).toHaveBeenCalledTimes(2);
459
expect(onPressChange).toHaveBeenCalledWith(false);
460
});
651
-
652
- it('is called after delayed onPressStart', () => {
653
- const Component = () => {
654
- usePressListener({
655
- onPressChange,
656
- });
657
- return (
658
- <div
659
- ref={ref}
660
- responders={<PressResponder delayPressStart={500} />}
661
- />
662
- );
663
- };
664
- ReactDOM.render(<Component />, container);
665
-
666
- ref.current.dispatchEvent(createEvent('pointerdown'));
667
- jest.advanceTimersByTime(499);
668
- expect(onPressChange).not.toBeCalled();
669
- jest.advanceTimersByTime(1);
670
- expect(onPressChange).toHaveBeenCalledTimes(1);
671
- expect(onPressChange).toHaveBeenCalledWith(true);
672
- });
673
-
674
- it('is called after delayPressStart is cut short', () => {
675
- const Component = () => {
676
- usePressListener({
677
- onPressChange,
678
- });
679
- return (
680
- <div
681
- ref={ref}
682
- responders={<PressResponder delayPressStart={500} />}
683
- />
684
- );
685
- };
686
- ReactDOM.render(<Component />, container);
687
-
688
- ref.current.getBoundingClientRect = () => ({
689
- top: 50,
690
- left: 50,
691
- bottom: 500,
692
- right: 500,
693
- });
694
-
695
- ref.current.dispatchEvent(createEvent('pointerdown'));
696
- jest.advanceTimersByTime(100);
697
- ref.current.dispatchEvent(
698
- createEvent('pointerup', {
699
- clientX: 55,
700
- clientY: 55,
701
- }),
702
- );
703
- jest.advanceTimersByTime(10);
704
- expect(onPressChange).toHaveBeenCalledWith(true);
705
- expect(onPressChange).toHaveBeenCalledWith(false);
706
- expect(onPressChange).toHaveBeenCalledTimes(2);
707
- });
708
-
709
- it('is called after delayed onPressEnd', () => {
710
- const Component = () => {
711
- usePressListener({
712
- onPressChange,
713
- });
714
- return (
715
- <div ref={ref} responders={<PressResponder delayPressEnd={500} />} />
716
- );
717
- };
718
- ReactDOM.render(<Component />, container);
719
-
720
- ref.current.dispatchEvent(createEvent('pointerdown'));
721
- expect(onPressChange).toHaveBeenCalledTimes(1);
722
- expect(onPressChange).toHaveBeenCalledWith(true);
723
- ref.current.dispatchEvent(createEvent('pointerup'));
724
- jest.advanceTimersByTime(499);
725
- expect(onPressChange).toHaveBeenCalledTimes(1);
726
- jest.advanceTimersByTime(1);
727
- expect(onPressChange).toHaveBeenCalledTimes(2);
728
- expect(onPressChange).toHaveBeenCalledWith(false);
729
- });
730
-
731
- // No PointerEvent fallbacks
732
- it('is called after "mousedown" and "mouseup" events', () => {
733
- ref.current.dispatchEvent(createEvent('mousedown'));
734
- expect(onPressChange).toHaveBeenCalledTimes(1);
735
- expect(onPressChange).toHaveBeenCalledWith(true);
736
- ref.current.dispatchEvent(createEvent('mouseup'));
737
- expect(onPressChange).toHaveBeenCalledTimes(2);
738
- expect(onPressChange).toHaveBeenCalledWith(false);
739
- });
740
- it('is called after "touchstart" and "touchend" events', () => {
741
- ref.current.dispatchEvent(
742
- createTouchEvent('touchstart', 0, {
743
- target: ref.current,
744
- }),
745
- );
746
- expect(onPressChange).toHaveBeenCalledTimes(1);
747
- expect(onPressChange).toHaveBeenCalledWith(true);
748
- ref.current.dispatchEvent(
749
- createTouchEvent('touchend', 0, {
750
- target: ref.current,
751
- }),
752
- );
753
- expect(onPressChange).toHaveBeenCalledTimes(2);
754
- expect(onPressChange).toHaveBeenCalledWith(false);
755
- });
461
});
462
463
describe('onPress', () => {
@@ -854,24 +559,6 @@ describe('Event responder: Press', () => {
559
expect(onPress).not.toBeCalled();
560
});
561
857
- it('is always called immediately after press is released', () => {
858
- const Component = () => {
859
- usePressListener({
860
- onPress,
861
- });
862
- return (
863
- <div ref={ref} responders={<PressResponder delayPressEnd={500} />} />
864
- );
865
- };
866
- ReactDOM.render(<Component />, container);
867
-
868
- ref.current.dispatchEvent(createEvent('pointerdown'));
869
- ref.current.dispatchEvent(
870
- createEvent('pointerup', {clientX: 10, clientY: 10}),
871
- );
872
- expect(onPress).toHaveBeenCalledTimes(1);
873
- });
874
-
562
it('is called with modifier keys', () => {
563
ref.current.dispatchEvent(
564
createEvent('pointerdown', {metaKey: true, pointerType: 'mouse'}),
@@ -1062,7 +749,7 @@ describe('Event responder: Press', () => {
749
* │ HitRect X │ <= Move to X and release
750
* └──────────────────┘
751
*/
1065
- it('no delay and "onPress*" events are called immediately', () => {
752
+ it('"onPress*" events are called immediately', () => {
753
let events = [];
754
const ref = React.createRef();
755
const createEventHandler = msg => () => {
@@ -1099,7 +786,7 @@ describe('Event responder: Press', () => {
786
]);
787
});
788
1102
- it('no delay and "onPress*" events are correctly called with target change', () => {
789
+ it('"onPress*" events are correctly called with target change', () => {
790
let events = [];
791
const outerRef = React.createRef();
792
const innerRef = React.createRef();
@@ -1149,47 +836,6 @@ describe('Event responder: Press', () => {
836
]);
837
});
838
1152
- it('delay and "onPressMove" is called before "onPress*" events', () => {
1153
- let events = [];
1154
- const ref = React.createRef();
1155
- const createEventHandler = msg => () => {
1156
- events.push(msg);
1157
- };
1158
-
1159
- const Component = () => {
1160
- usePressListener({
1161
- onPress: createEventHandler('onPress'),
1162
- onPressChange: createEventHandler('onPressChange'),
1163
- onPressMove: createEventHandler('onPressMove'),
1164
- onPressStart: createEventHandler('onPressStart'),
1165
- onPressEnd: createEventHandler('onPressEnd'),
1166
- });
1167
- return (
1168
- <div
1169
- ref={ref}
1170
- responders={<PressResponder delayPressStart={500} />}
1171
- />
1172
- );
1173
- };
1174
- ReactDOM.render(<Component />, container);
1175
-
1176
- ref.current.getBoundingClientRect = getBoundingClientRectMock;
1177
- ref.current.dispatchEvent(createEvent('pointerdown'));
1178
- ref.current.dispatchEvent(
1179
- createEvent('pointermove', coordinatesInside),
1180
- );
1181
- jest.advanceTimersByTime(499);
1182
- expect(events).toEqual(['onPressMove']);
1183
- events = [];
1184
-
1185
- jest.advanceTimersByTime(1);
1186
- expect(events).toEqual(['onPressStart', 'onPressChange']);
1187
- events = [];
1188
-
1189
- ref.current.dispatchEvent(createEvent('pointerup', coordinatesInside));
1190
- expect(events).toEqual(['onPressEnd', 'onPressChange', 'onPress']);
1191
- });
1192
-
839
it('press retention offset can be configured', () => {
840
let events = [];
841
const ref = React.createRef();
@@ -1359,46 +1005,6 @@ describe('Event responder: Press', () => {
1005
'onPressChange',
1006
]);
1007
});
1362
-
1363
- it('"onPress*" events are not called after delay expires', () => {
1364
- let events = [];
1365
- const ref = React.createRef();
1366
- const createEventHandler = msg => () => {
1367
- events.push(msg);
1368
- };
1369
-
1370
- const Component = () => {
1371
- usePressListener({
1372
- onPress: createEventHandler('onPress'),
1373
- onPressChange: createEventHandler('onPressChange'),
1374
- onPressMove: createEventHandler('onPressMove'),
1375
- onPressStart: createEventHandler('onPressStart'),
1376
- onPressEnd: createEventHandler('onPressEnd'),
1377
- });
1378
- return (
1379
- <div
1380
- ref={ref}
1381
- responders={
1382
- <PressResponder delayPressStart={500} delayPressEnd={500} />
1383
- }
1384
- />
1385
- );
1386
- };
1387
- ReactDOM.render(<Component />, container);
1388
-
1389
- ref.current.getBoundingClientRect = getBoundingClientRectMock;
1390
- ref.current.dispatchEvent(createEvent('pointerdown'));
1391
- ref.current.dispatchEvent(
1392
- createEvent('pointermove', coordinatesInside),
1393
- );
1394
- container.dispatchEvent(createEvent('pointermove', coordinatesOutside));
1395
- jest.runAllTimers();
1396
- expect(events).toEqual(['onPressMove']);
1397
- events = [];
1398
- container.dispatchEvent(createEvent('pointerup', coordinatesOutside));
1399
- jest.runAllTimers();
1400
- expect(events).toEqual([]);
1401
- });
1008
});
1009
1010
it('"onPress" is not called on release with mouse', () => {
@@ -1643,7 +1249,7 @@ describe('Event responder: Press', () => {
1249
* │ HitRect X │ <= Move to X and release
1250
* └──────────────────┘
1251
*/
1646
- it('no delay and "onPress*" events are called immediately', () => {
1252
+ it('"onPress*" events are called immediately', () => {
1253
let events = [];
1254
const ref = React.createRef();
1255
const createEventHandler = msg => () => {
@@ -1693,60 +1299,6 @@ describe('Event responder: Press', () => {
1299
]);
1300
});
1301
1696
- it('delay and "onPressMove" is called before "onPress*" events', () => {
1697
- let events = [];
1698
- const ref = React.createRef();
1699
- const createEventHandler = msg => () => {
1700
- events.push(msg);
1701
- };
1702
-
1703
- const Component = () => {
1704
- usePressListener({
1705
- onPress: createEventHandler('onPress'),
1706
- onPressChange: createEventHandler('onPressChange'),
1707
- onPressMove: createEventHandler('onPressMove'),
1708
- onPressStart: createEventHandler('onPressStart'),
1709
- onPressEnd: createEventHandler('onPressEnd'),
1710
- });
1711
- return (
1712
- <div
1713
- ref={ref}
1714
- responders={<PressResponder delayPressStart={500} />}
1715
- />
1716
- );
1717
- };
1718
- ReactDOM.render(<Component />, container);
1719
-
1720
- document.elementFromPoint = () => ref.current;
1721
- ref.current.getBoundingClientRect = getBoundingClientRectMock;
1722
- ref.current.dispatchEvent(
1723
- createTouchEvent('touchstart', 0, {
1724
- target: ref.current,
1725
- }),
1726
- );
1727
- ref.current.dispatchEvent(
1728
- createTouchEvent('touchmove', 0, {
1729
- ...coordinatesInside,
1730
- target: ref.current,
1731
- }),
1732
- );
1733
- jest.advanceTimersByTime(499);
1734
- expect(events).toEqual(['onPressMove']);
1735
- events = [];
1736
-
1737
- jest.advanceTimersByTime(1);
1738
- expect(events).toEqual(['onPressStart', 'onPressChange']);
1739
- events = [];
1740
-
1741
- ref.current.dispatchEvent(
1742
- createTouchEvent('touchend', 0, {
1743
- ...coordinatesInside,
1744
- target: ref.current,
1745
- }),
1746
- );
1747
- expect(events).toEqual(['onPressEnd', 'onPressChange', 'onPress']);
1748
- });
1749
-
1302
it('press retention offset can be configured', () => {
1303
let events = [];
1304
const ref = React.createRef();
@@ -1976,65 +1528,6 @@ describe('Event responder: Press', () => {
1528
'onPressChange',
1529
]);
1530
});
1979
-
1980
- it('"onPress*" events are not called after delay expires', () => {
1981
- let events = [];
1982
- const ref = React.createRef();
1983
- const createEventHandler = msg => () => {
1984
- events.push(msg);
1985
- };
1986
-
1987
- const Component = () => {
1988
- usePressListener({
1989
- onPress: createEventHandler('onPress'),
1990
- onPressChange: createEventHandler('onPressChange'),
1991
- onPressMove: createEventHandler('onPressMove'),
1992
- onPressStart: createEventHandler('onPressStart'),
1993
- onPressEnd: createEventHandler('onPressEnd'),
1994
- });
1995
- return (
1996
- <div
1997
- ref={ref}
1998
- responders={
1999
- <PressResponder delayPressStart={500} delayPressEnd={500} />
2000
- }
2001
- />
2002
- );
2003
- };
2004
- ReactDOM.render(<Component />, container);
2005
-
2006
- document.elementFromPoint = () => ref.current;
2007
- ref.current.getBoundingClientRect = getBoundingClientRectMock;
2008
- ref.current.dispatchEvent(
2009
- createTouchEvent('touchstart', 0, {
2010
- target: ref.current,
2011
- }),
2012
- );
2013
- ref.current.dispatchEvent(
2014
- createTouchEvent('touchmove', 0, {
2015
- ...coordinatesInside,
2016
- target: ref.current,
2017
- }),
2018
- );
2019
- document.elementFromPoint = () => container;
2020
- container.dispatchEvent(
2021
- createTouchEvent('touchmove', 0, {
2022
- ...coordinatesOutside,
2023
- target: container,
2024
- }),
2025
- );
2026
- jest.runAllTimers();
2027
- expect(events).toEqual(['onPressMove']);
2028
- events = [];
2029
- container.dispatchEvent(
2030
- createTouchEvent('touchend', 0, {
2031
- ...coordinatesOutside,
2032
- target: container,
2033
- }),
2034
- );
2035
- jest.runAllTimers();
2036
- expect(events).toEqual([]);
2037
- });
1531
});
1532
1533
it('"onPress" is called on re-entry to hit rect for touch', () => {
@@ -2106,82 +1599,6 @@ describe('Event responder: Press', () => {
1599
});
1600
});
1601
2109
- describe('delayed and multiple events', () => {
2110
- it('dispatches in the correct order', () => {
2111
- let events;
2112
- const ref = React.createRef();
2113
- const createEventHandler = msg => () => {
2114
- events.push(msg);
2115
- };
2116
-
2117
- const Component = () => {
2118
- usePressListener({
2119
- onPress: createEventHandler('onPress'),
2120
- onPressChange: createEventHandler('onPressChange'),
2121
- onPressMove: createEventHandler('onPressMove'),
2122
- onPressStart: createEventHandler('onPressStart'),
2123
- onPressEnd: createEventHandler('onPressEnd'),
2124
- });
2125
- return (
2126
- <div
2127
- ref={ref}
2128
- responders={
2129
- <PressResponder delayPressStart={250} delayPressEnd={250} />
2130
- }
2131
- />
2132
- );
2133
- };
2134
- ReactDOM.render(<Component />, container);
2135
-
2136
- ref.current.getBoundingClientRect = () => ({
2137
- top: 0,
2138
- left: 0,
2139
- bottom: 100,
2140
- right: 100,
2141
- });
2142
-
2143
- // 1
2144
- events = [];
2145
- ref.current.dispatchEvent(createEvent('pointerdown'));
2146
- ref.current.dispatchEvent(
2147
- createEvent('pointerup', {clientX: 10, clientY: 10}),
2148
- );
2149
- ref.current.dispatchEvent(createEvent('pointerdown'));
2150
- ref.current.dispatchEvent(
2151
- createEvent('pointerup', {clientX: 10, clientY: 10}),
2152
- );
2153
- jest.runAllTimers();
2154
-
2155
- expect(events).toEqual([
2156
- 'onPressStart',
2157
- 'onPressChange',
2158
- 'onPress',
2159
- 'onPressStart',
2160
- 'onPress',
2161
- 'onPressEnd',
2162
- 'onPressChange',
2163
- ]);
2164
-
2165
- // 2
2166
- events = [];
2167
- ref.current.dispatchEvent(createEvent('pointerdown'));
2168
- jest.advanceTimersByTime(250);
2169
- jest.advanceTimersByTime(500);
2170
- ref.current.dispatchEvent(
2171
- createEvent('pointerup', {clientX: 10, clientY: 10}),
2172
- );
2173
- jest.runAllTimers();
2174
-
2175
- expect(events).toEqual([
2176
- 'onPressStart',
2177
- 'onPressChange',
2178
- 'onPress',
2179
- 'onPressEnd',
2180
- 'onPressChange',
2181
- ]);
2182
- });
2183
- });
2184
-
1602
describe('nested responders', () => {
1603
it('dispatch events in the correct order', () => {
1604
const events = [];
@@ -2701,7 +2118,6 @@ describe('Event responder: Press', () => {
2118
ReactDOM.render(<Component />, container);
2119
2120
ref.current.dispatchEvent(createEvent('pointerdown'));
2704
- jest.advanceTimersByTime(DEFAULT_LONG_PRESS_DELAY);
2121
ref.current.dispatchEvent(createEvent('pointermove'));
2122
ref.current.dispatchEvent(createEvent('pointerup'));
2123
ref.current.dispatchEvent(createEvent('pointerdown'));
@@ -2757,7 +2173,6 @@ describe('Event responder: Press', () => {
2173
clientY: 31,
2174
}),
2175
);
2760
- jest.advanceTimersByTime(DEFAULT_LONG_PRESS_DELAY);
2176
ref.current.dispatchEvent(
2177
createEvent('pointermove', {
2178
pointerType: 'mouse',