react-native-gesture-handler 2.22.0-rc.1 → 2.22.1
Sign up to get free protection for your applications and to get access to all the features.
- package/android/package77/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +85 -0
- package/android/packageDeprecated/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +85 -0
- package/lib/commonjs/components/ReanimatedSwipeable.js +80 -47
- package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/commonjs/handlers/createNativeWrapper.js +17 -6
- package/lib/commonjs/handlers/createNativeWrapper.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +6 -0
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/components/ReanimatedSwipeable.js +81 -48
- package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/module/handlers/createNativeWrapper.js +17 -6
- package/lib/module/handlers/createNativeWrapper.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +6 -0
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +1 -0
- package/package.json +3 -1
- package/src/components/ReanimatedSwipeable.tsx +101 -51
- package/src/handlers/createNativeWrapper.tsx +10 -4
- package/src/web/handlers/LongPressGestureHandler.ts +6 -0
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "react-native-gesture-handler",
|
3
|
-
"version": "2.22.
|
3
|
+
"version": "2.22.1",
|
4
4
|
"description": "Declarative API exposing native platform touch and gesture system to React Native",
|
5
5
|
"scripts": {
|
6
6
|
"prepare": "bob build && husky install",
|
@@ -39,6 +39,8 @@
|
|
39
39
|
"android/common/src/main/java/",
|
40
40
|
"android/reanimated/src/main/java/",
|
41
41
|
"android/noreanimated/src/main/java/",
|
42
|
+
"android/package77/",
|
43
|
+
"android/packageDeprecated/",
|
42
44
|
"apple/",
|
43
45
|
"Swipeable/",
|
44
46
|
"ReanimatedSwipeable/",
|
@@ -18,9 +18,13 @@ import {
|
|
18
18
|
import type { PanGestureHandlerProps } from '../handlers/PanGestureHandler';
|
19
19
|
import type { PanGestureHandlerEventPayload } from '../handlers/GestureHandlerEventPayload';
|
20
20
|
import Animated, {
|
21
|
+
ReduceMotion,
|
21
22
|
SharedValue,
|
22
23
|
interpolate,
|
24
|
+
measure,
|
23
25
|
runOnJS,
|
26
|
+
runOnUI,
|
27
|
+
useAnimatedRef,
|
24
28
|
useAnimatedStyle,
|
25
29
|
useSharedValue,
|
26
30
|
withSpring,
|
@@ -256,20 +260,9 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
256
260
|
const leftWidth = useSharedValue<number>(0);
|
257
261
|
const rightWidth = useSharedValue<number>(0);
|
258
262
|
|
259
|
-
// used for synchronizing layout measurements between JS and UI
|
260
|
-
const rightOffset = useSharedValue<number | null>(null);
|
261
|
-
|
262
263
|
const showLeftProgress = useSharedValue<number>(0);
|
263
264
|
const showRightProgress = useSharedValue<number>(0);
|
264
265
|
|
265
|
-
const updateRightElementWidth = useCallback(() => {
|
266
|
-
'worklet';
|
267
|
-
if (rightOffset.value === null) {
|
268
|
-
rightOffset.value = rowWidth.value;
|
269
|
-
}
|
270
|
-
rightWidth.value = Math.max(0, rowWidth.value - rightOffset.value);
|
271
|
-
}, [rightOffset, rightWidth, rowWidth]);
|
272
|
-
|
273
266
|
const updateAnimatedEvent = useCallback(() => {
|
274
267
|
'worklet';
|
275
268
|
|
@@ -371,11 +364,12 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
371
364
|
'worklet';
|
372
365
|
|
373
366
|
const translationSpringConfig = {
|
374
|
-
|
375
|
-
|
376
|
-
stiffness:
|
367
|
+
mass: 2,
|
368
|
+
damping: 1000,
|
369
|
+
stiffness: 700,
|
377
370
|
velocity: velocityX,
|
378
371
|
overshootClamping: true,
|
372
|
+
reduceMotion: ReduceMotion.System,
|
379
373
|
...animationOptions,
|
380
374
|
};
|
381
375
|
|
@@ -411,16 +405,17 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
411
405
|
}
|
412
406
|
);
|
413
407
|
|
414
|
-
const progressTarget = toValue === 0 ? 0 : 1;
|
408
|
+
const progressTarget = toValue === 0 ? 0 : 1 * Math.sign(toValue);
|
409
|
+
|
410
|
+
showLeftProgress.value = withSpring(
|
411
|
+
Math.max(progressTarget, 0),
|
412
|
+
progressSpringConfig
|
413
|
+
);
|
415
414
|
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
showRightProgress.value =
|
421
|
-
rightWidth.value > 0
|
422
|
-
? withSpring(progressTarget, progressSpringConfig)
|
423
|
-
: 0;
|
415
|
+
showRightProgress.value = withSpring(
|
416
|
+
Math.max(-progressTarget, 0),
|
417
|
+
progressSpringConfig
|
418
|
+
);
|
424
419
|
|
425
420
|
dispatchImmediateEvents(frozenRowState, toValue);
|
426
421
|
|
@@ -439,20 +434,66 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
439
434
|
]
|
440
435
|
);
|
441
436
|
|
437
|
+
const leftLayoutRef = useAnimatedRef();
|
438
|
+
const leftWrapperLayoutRef = useAnimatedRef();
|
439
|
+
const rightLayoutRef = useAnimatedRef();
|
440
|
+
|
441
|
+
const updateElementWidths = useCallback(() => {
|
442
|
+
'worklet';
|
443
|
+
const leftLayout = measure(leftLayoutRef);
|
444
|
+
const leftWrapperLayout = measure(leftWrapperLayoutRef);
|
445
|
+
const rightLayout = measure(rightLayoutRef);
|
446
|
+
leftWidth.value =
|
447
|
+
(leftLayout?.pageX ?? 0) - (leftWrapperLayout?.pageX ?? 0);
|
448
|
+
|
449
|
+
rightWidth.value =
|
450
|
+
rowWidth.value -
|
451
|
+
(rightLayout?.pageX ?? rowWidth.value) +
|
452
|
+
(leftWrapperLayout?.pageX ?? 0);
|
453
|
+
}, [
|
454
|
+
leftLayoutRef,
|
455
|
+
leftWrapperLayoutRef,
|
456
|
+
rightLayoutRef,
|
457
|
+
leftWidth,
|
458
|
+
rightWidth,
|
459
|
+
rowWidth.value,
|
460
|
+
]);
|
461
|
+
|
442
462
|
const swipeableMethods = useMemo<SwipeableMethods>(
|
443
463
|
() => ({
|
444
464
|
close() {
|
445
465
|
'worklet';
|
446
|
-
|
466
|
+
if (_WORKLET) {
|
467
|
+
animateRow(0);
|
468
|
+
return;
|
469
|
+
}
|
470
|
+
runOnUI(() => {
|
471
|
+
animateRow(0);
|
472
|
+
})();
|
447
473
|
},
|
448
474
|
openLeft() {
|
449
475
|
'worklet';
|
450
|
-
|
476
|
+
if (_WORKLET) {
|
477
|
+
updateElementWidths();
|
478
|
+
animateRow(leftWidth.value);
|
479
|
+
return;
|
480
|
+
}
|
481
|
+
runOnUI(() => {
|
482
|
+
updateElementWidths();
|
483
|
+
animateRow(leftWidth.value);
|
484
|
+
})();
|
451
485
|
},
|
452
486
|
openRight() {
|
453
487
|
'worklet';
|
454
|
-
|
455
|
-
|
488
|
+
if (_WORKLET) {
|
489
|
+
updateElementWidths();
|
490
|
+
animateRow(-rightWidth.value);
|
491
|
+
return;
|
492
|
+
}
|
493
|
+
runOnUI(() => {
|
494
|
+
updateElementWidths();
|
495
|
+
animateRow(-rightWidth.value);
|
496
|
+
})();
|
456
497
|
},
|
457
498
|
reset() {
|
458
499
|
'worklet';
|
@@ -463,14 +504,14 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
463
504
|
},
|
464
505
|
}),
|
465
506
|
[
|
507
|
+
animateRow,
|
508
|
+
updateElementWidths,
|
466
509
|
leftWidth,
|
467
|
-
|
468
|
-
rowWidth,
|
510
|
+
rightWidth,
|
469
511
|
userDrag,
|
470
512
|
showLeftProgress,
|
471
513
|
appliedTranslation,
|
472
514
|
rowState,
|
473
|
-
animateRow,
|
474
515
|
]
|
475
516
|
);
|
476
517
|
|
@@ -481,49 +522,61 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
481
522
|
[rowWidth]
|
482
523
|
);
|
483
524
|
|
525
|
+
// As stated in `Dimensions.get` docstring, this function should be called on every render
|
526
|
+
// since dimensions may change (e.g. orientation change)
|
527
|
+
|
528
|
+
const leftActionAnimation = useAnimatedStyle(() => {
|
529
|
+
return {
|
530
|
+
opacity: showLeftProgress.value === 0 ? 0 : 1,
|
531
|
+
};
|
532
|
+
});
|
533
|
+
|
484
534
|
const leftElement = useCallback(
|
485
535
|
() => (
|
486
|
-
<Animated.View
|
536
|
+
<Animated.View
|
537
|
+
ref={leftWrapperLayoutRef}
|
538
|
+
style={[styles.leftActions, leftActionAnimation]}>
|
487
539
|
{renderLeftActions?.(
|
488
540
|
showLeftProgress,
|
489
541
|
appliedTranslation,
|
490
542
|
swipeableMethods
|
491
543
|
)}
|
492
|
-
<View
|
493
|
-
onLayout={({ nativeEvent }) =>
|
494
|
-
(leftWidth.value = nativeEvent.layout.x)
|
495
|
-
}
|
496
|
-
/>
|
544
|
+
<Animated.View ref={leftLayoutRef} />
|
497
545
|
</Animated.View>
|
498
546
|
),
|
499
547
|
[
|
500
548
|
appliedTranslation,
|
501
|
-
|
549
|
+
leftActionAnimation,
|
550
|
+
leftLayoutRef,
|
551
|
+
leftWrapperLayoutRef,
|
502
552
|
renderLeftActions,
|
503
553
|
showLeftProgress,
|
504
554
|
swipeableMethods,
|
505
555
|
]
|
506
556
|
);
|
507
557
|
|
558
|
+
const rightActionAnimation = useAnimatedStyle(() => {
|
559
|
+
return {
|
560
|
+
opacity: showRightProgress.value === 0 ? 0 : 1,
|
561
|
+
};
|
562
|
+
});
|
563
|
+
|
508
564
|
const rightElement = useCallback(
|
509
565
|
() => (
|
510
|
-
<Animated.View style={[styles.rightActions]}>
|
566
|
+
<Animated.View style={[styles.rightActions, rightActionAnimation]}>
|
511
567
|
{renderRightActions?.(
|
512
568
|
showRightProgress,
|
513
569
|
appliedTranslation,
|
514
570
|
swipeableMethods
|
515
571
|
)}
|
516
|
-
<View
|
517
|
-
onLayout={({ nativeEvent }) => {
|
518
|
-
rightOffset.value = nativeEvent.layout.x;
|
519
|
-
}}
|
520
|
-
/>
|
572
|
+
<Animated.View ref={rightLayoutRef} />
|
521
573
|
</Animated.View>
|
522
574
|
),
|
523
575
|
[
|
524
576
|
appliedTranslation,
|
525
577
|
renderRightActions,
|
526
|
-
|
578
|
+
rightActionAnimation,
|
579
|
+
rightLayoutRef,
|
527
580
|
showRightProgress,
|
528
581
|
swipeableMethods,
|
529
582
|
]
|
@@ -535,8 +588,6 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
535
588
|
const { velocityX } = event;
|
536
589
|
userDrag.value = event.translationX;
|
537
590
|
|
538
|
-
updateRightElementWidth();
|
539
|
-
|
540
591
|
const leftThresholdProp = leftThreshold ?? leftWidth.value / 2;
|
541
592
|
const rightThresholdProp = rightThreshold ?? rightWidth.value / 2;
|
542
593
|
|
@@ -574,7 +625,6 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
574
625
|
rightWidth,
|
575
626
|
rowState,
|
576
627
|
userDrag,
|
577
|
-
updateRightElementWidth,
|
578
628
|
]
|
579
629
|
);
|
580
630
|
|
@@ -603,9 +653,7 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
603
653
|
.enabled(enabled !== false)
|
604
654
|
.enableTrackpadTwoFingerGesture(enableTrackpadTwoFingerGesture)
|
605
655
|
.activeOffsetX([-dragOffsetFromRightEdge, dragOffsetFromLeftEdge])
|
606
|
-
.onStart(
|
607
|
-
updateRightElementWidth();
|
608
|
-
})
|
656
|
+
.onStart(updateElementWidths)
|
609
657
|
.onUpdate(
|
610
658
|
(event: GestureUpdateEvent<PanGestureHandlerEventPayload>) => {
|
611
659
|
userDrag.value = event.translationX;
|
@@ -650,7 +698,7 @@ const Swipeable = forwardRef<SwipeableMethods, SwipeableProps>(
|
|
650
698
|
onSwipeableOpenStartDrag,
|
651
699
|
rowState,
|
652
700
|
updateAnimatedEvent,
|
653
|
-
|
701
|
+
updateElementWidths,
|
654
702
|
userDrag,
|
655
703
|
]
|
656
704
|
);
|
@@ -700,9 +748,11 @@ const styles = StyleSheet.create({
|
|
700
748
|
leftActions: {
|
701
749
|
...StyleSheet.absoluteFillObject,
|
702
750
|
flexDirection: I18nManager.isRTL ? 'row-reverse' : 'row',
|
751
|
+
overflow: 'hidden',
|
703
752
|
},
|
704
753
|
rightActions: {
|
705
754
|
...StyleSheet.absoluteFillObject,
|
706
755
|
flexDirection: I18nManager.isRTL ? 'row' : 'row-reverse',
|
756
|
+
overflow: 'hidden',
|
707
757
|
},
|
708
758
|
});
|
@@ -29,17 +29,23 @@ export default function createNativeWrapper<P>(
|
|
29
29
|
P & NativeViewGestureHandlerProps
|
30
30
|
>((props, ref) => {
|
31
31
|
// Filter out props that should be passed to gesture handler wrapper
|
32
|
-
const gestureHandlerProps = Object.keys(props).reduce(
|
32
|
+
const { gestureHandlerProps, childProps } = Object.keys(props).reduce(
|
33
33
|
(res, key) => {
|
34
34
|
// TS being overly protective with it's types, see https://github.com/microsoft/TypeScript/issues/26255#issuecomment-458013731 for more info
|
35
35
|
const allowedKeys: readonly string[] = NATIVE_WRAPPER_PROPS_FILTER;
|
36
36
|
if (allowedKeys.includes(key)) {
|
37
37
|
// @ts-ignore FIXME(TS)
|
38
|
-
res[key] = props[key];
|
38
|
+
res.gestureHandlerProps[key] = props[key];
|
39
|
+
} else {
|
40
|
+
// @ts-ignore FIXME(TS)
|
41
|
+
res.childProps[key] = props[key];
|
39
42
|
}
|
40
43
|
return res;
|
41
44
|
},
|
42
|
-
{
|
45
|
+
{
|
46
|
+
gestureHandlerProps: { ...config }, // Watch out not to modify config
|
47
|
+
childProps: { enabled: props.enabled } as P,
|
48
|
+
}
|
43
49
|
);
|
44
50
|
const _ref = useRef<React.ComponentType<P>>();
|
45
51
|
const _gestureHandlerRef = useRef<React.ComponentType<P>>();
|
@@ -63,7 +69,7 @@ export default function createNativeWrapper<P>(
|
|
63
69
|
{...gestureHandlerProps}
|
64
70
|
// @ts-ignore TODO(TS)
|
65
71
|
ref={_gestureHandlerRef}>
|
66
|
-
<Component {...
|
72
|
+
<Component {...childProps} ref={_ref} />
|
67
73
|
</NativeViewGestureHandler>
|
68
74
|
);
|
69
75
|
});
|
@@ -101,6 +101,12 @@ export default class LongPressGestureHandler extends GestureHandler {
|
|
101
101
|
this.checkDistanceFail();
|
102
102
|
}
|
103
103
|
|
104
|
+
protected onPointerOutOfBounds(event: AdaptedEvent): void {
|
105
|
+
super.onPointerOutOfBounds(event);
|
106
|
+
this.tracker.track(event);
|
107
|
+
this.checkDistanceFail();
|
108
|
+
}
|
109
|
+
|
104
110
|
protected onPointerUp(event: AdaptedEvent): void {
|
105
111
|
super.onPointerUp(event);
|
106
112
|
this.tracker.removeFromTracker(event.pointerId);
|