react-native-gesture-handler 2.6.1 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. package/lib/commonjs/RNGestureHandlerModule.macos.js +2 -4
  2. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  3. package/lib/commonjs/components/GestureComponents.js +6 -4
  4. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  5. package/lib/commonjs/components/Swipeable.js +4 -4
  6. package/lib/commonjs/components/Swipeable.js.map +1 -1
  7. package/lib/commonjs/handlers/gestures/GestureDetector.js +4 -2
  8. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  9. package/lib/commonjs/utils.js +10 -6
  10. package/lib/commonjs/utils.js.map +1 -1
  11. package/lib/commonjs/web/handlers/GestureHandler.js +48 -0
  12. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  13. package/lib/module/RNGestureHandlerModule.macos.js +2 -4
  14. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  15. package/lib/module/components/GestureComponents.js +6 -4
  16. package/lib/module/components/GestureComponents.js.map +1 -1
  17. package/lib/module/components/Swipeable.js +4 -4
  18. package/lib/module/components/Swipeable.js.map +1 -1
  19. package/lib/module/handlers/gestures/GestureDetector.js +5 -3
  20. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  21. package/lib/module/utils.js +7 -6
  22. package/lib/module/utils.js.map +1 -1
  23. package/lib/module/web/handlers/GestureHandler.js +48 -0
  24. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  25. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
  26. package/lib/typescript/components/Swipeable.d.ts +3 -3
  27. package/lib/typescript/utils.d.ts +4 -0
  28. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -0
  29. package/package.json +1 -1
  30. package/src/RNGestureHandlerModule.macos.ts +3 -3
  31. package/src/components/GestureComponents.tsx +12 -16
  32. package/src/components/Swipeable.tsx +11 -7
  33. package/src/handlers/gestures/GestureDetector.tsx +8 -3
  34. package/src/utils.ts +6 -6
  35. package/src/web/handlers/GestureHandler.ts +59 -0
@@ -1,3 +1,7 @@
1
+ export declare const REACT_NATIVE_VERSION: {
2
+ major: number;
3
+ minor: number;
4
+ };
1
5
  export declare function toArray<T>(object: T | T[]): T[];
2
6
  export declare type withPrevAndCurrentMapFn<T, Transformed> = (previous: Transformed | null, current: T) => Transformed;
3
7
  export declare function withPrevAndCurrent<T, Transformed>(array: T[], mapFn: withPrevAndCurrentMapFn<T, Transformed>): Transformed[];
@@ -67,6 +67,7 @@ export default abstract class GestureHandler {
67
67
  sendEvent: (newState: State, oldState: State) => void;
68
68
  private transformEventData;
69
69
  private transformTouchEvent;
70
+ private cancelTouches;
70
71
  protected transformNativeEvent(): {};
71
72
  updateGestureConfig({ enabled, ...props }: Config): void;
72
73
  protected checkCustomActivationCriteria(criterias: string[]): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gesture-handler",
3
- "version": "2.6.1",
3
+ "version": "2.6.2",
4
4
  "description": "Experimental implementation of a new declarative API for gesture handling in react-native",
5
5
  "scripts": {
6
6
  "prepare": "bob build",
@@ -46,11 +46,11 @@ export const HammerGestures = {
46
46
  };
47
47
 
48
48
  export default {
49
- handleSetJSResponder(tag: number, blockNativeResponder: boolean) {
50
- console.warn('handleSetJSResponder: ', tag, blockNativeResponder);
49
+ handleSetJSResponder(_tag: number, _blockNativeResponder: boolean) {
50
+ // NO-OP
51
51
  },
52
52
  handleClearJSResponder() {
53
- console.warn('handleClearJSResponder: ');
53
+ // NO-OP
54
54
  },
55
55
  createGestureHandler<T>(
56
56
  handlerName: keyof typeof Gestures,
@@ -57,14 +57,12 @@ export const ScrollView = React.forwardRef<
57
57
  waitFor={[...toArray(waitFor ?? []), refreshControlGestureRef]}
58
58
  // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref
59
59
  refreshControl={
60
- refreshControl ? (
61
- <RefreshControl
62
- {...refreshControl.props}
63
- ref={refreshControlGestureRef}
64
- />
65
- ) : (
66
- refreshControl
67
- )
60
+ refreshControl
61
+ ? React.cloneElement(refreshControl, {
62
+ // @ts-ignore for reasons unknown to me, `ref` doesn't exist on the type inferred by TS
63
+ ref: refreshControlGestureRef,
64
+ })
65
+ : undefined
68
66
  }
69
67
  />
70
68
  );
@@ -129,14 +127,12 @@ export const FlatList = React.forwardRef((props, ref) => {
129
127
  )}
130
128
  // @ts-ignore we don't pass `refreshing` prop as we only want to override the ref
131
129
  refreshControl={
132
- refreshControl ? (
133
- <RefreshControl
134
- {...refreshControl.props}
135
- ref={refreshControlGestureRef}
136
- />
137
- ) : (
138
- refreshControl
139
- )
130
+ refreshControl
131
+ ? React.cloneElement(refreshControl, {
132
+ // @ts-ignore for reasons unknown to me, `ref` doesn't exist on the type inferred by TS
133
+ ref: refreshControlGestureRef,
134
+ })
135
+ : undefined
140
136
  }
141
137
  />
142
138
  );
@@ -106,12 +106,15 @@ export interface SwipeableProps
106
106
  /**
107
107
  * Called when action panel gets open (either right or left).
108
108
  */
109
- onSwipeableOpen?: (direction: 'left' | 'right') => void;
109
+ onSwipeableOpen?: (direction: 'left' | 'right', swipeable: Swipeable) => void;
110
110
 
111
111
  /**
112
112
  * Called when action panel is closed.
113
113
  */
114
- onSwipeableClose?: (direction: 'left' | 'right') => void;
114
+ onSwipeableClose?: (
115
+ direction: 'left' | 'right',
116
+ swipeable: Swipeable
117
+ ) => void;
115
118
 
116
119
  /**
117
120
  * @deprecated Use `direction` argument of onSwipeableWillOpen()
@@ -161,7 +164,8 @@ export interface SwipeableProps
161
164
  * */
162
165
  renderRightActions?: (
163
166
  progressAnimatedValue: Animated.AnimatedInterpolation,
164
- dragAnimatedValue: Animated.AnimatedInterpolation
167
+ dragAnimatedValue: Animated.AnimatedInterpolation,
168
+ swipeable: Swipeable
165
169
  ) => React.ReactNode;
166
170
 
167
171
  useNativeAnimations?: boolean;
@@ -381,13 +385,13 @@ export default class Swipeable extends Component<
381
385
  if (finished) {
382
386
  if (toValue > 0) {
383
387
  this.props.onSwipeableLeftOpen?.();
384
- this.props.onSwipeableOpen?.('left');
388
+ this.props.onSwipeableOpen?.('left', this);
385
389
  } else if (toValue < 0) {
386
390
  this.props.onSwipeableRightOpen?.();
387
- this.props.onSwipeableOpen?.('right');
391
+ this.props.onSwipeableOpen?.('right', this);
388
392
  } else {
389
393
  const closingDirection = fromValue > 0 ? 'left' : 'right';
390
- this.props.onSwipeableClose?.(closingDirection);
394
+ this.props.onSwipeableClose?.(closingDirection, this);
391
395
  }
392
396
  }
393
397
  });
@@ -463,7 +467,7 @@ export default class Swipeable extends Component<
463
467
  styles.rightActions,
464
468
  { transform: [{ translateX: this.rightActionTranslate! }] },
465
469
  ]}>
466
- {renderRightActions(this.showRightAction!, this.transX!)}
470
+ {renderRightActions(this.showRightAction!, this.transX!, this)}
467
471
  <View
468
472
  onLayout={({ nativeEvent }) =>
469
473
  this.setState({ rightOffset: nativeEvent.layout.x })
@@ -35,7 +35,7 @@ import { State } from '../../State';
35
35
  import { TouchEventType } from '../../TouchEventType';
36
36
  import { ComposedGesture } from './gestureComposition';
37
37
  import { ActionType } from '../../ActionType';
38
- import { isFabric, tagMessage } from '../../utils';
38
+ import { isFabric, REACT_NATIVE_VERSION, tagMessage } from '../../utils';
39
39
  import { getShadowNodeFromRef } from '../../getShadowNodeFromRef';
40
40
  import { Platform } from 'react-native';
41
41
  import type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';
@@ -539,8 +539,13 @@ function validateDetectorChildren(ref: any) {
539
539
  // / \
540
540
  // NativeView NativeView
541
541
  if (__DEV__ && Platform.OS !== 'web') {
542
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
543
- const wrapType = ref._reactInternals.elementType;
542
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
543
+ const wrapType =
544
+ REACT_NATIVE_VERSION.minor > 63 || REACT_NATIVE_VERSION.major > 0
545
+ ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
546
+ ref._reactInternals.elementType
547
+ : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
548
+ ref._reactInternalFiber.elementType;
544
549
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
545
550
  let instance = RNRenderer.findHostInstance_DEPRECATED(ref)
546
551
  ._internalFiberInstanceHandleDEV;
package/src/utils.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import pack from 'react-native/package.json';
2
2
 
3
- const rnVersion = pack.version;
3
+ const [majorStr, minorStr] = pack.version.split('.');
4
+ export const REACT_NATIVE_VERSION = {
5
+ major: parseInt(majorStr, 10),
6
+ minor: parseInt(minorStr, 10),
7
+ };
4
8
 
5
9
  export function toArray<T>(object: T | T[]): T[] {
6
10
  if (!Array.isArray(object)) {
@@ -52,12 +56,8 @@ export function isFabric(): boolean {
52
56
  }
53
57
 
54
58
  export function shouldUseCodegenNativeComponent(): boolean {
55
- const [majorStr, minorStr] = rnVersion.split('.');
56
- const major = Number.parseInt(majorStr);
57
- const minor = Number.parseInt(minorStr);
58
-
59
59
  // use codegenNativeComponent starting with RN 0.68
60
- return minor >= 68 || major > 0;
60
+ return REACT_NATIVE_VERSION.minor >= 68 || REACT_NATIVE_VERSION.major > 0;
61
61
  }
62
62
 
63
63
  export function isRemoteDebuggingEnabled(): boolean {
@@ -121,6 +121,15 @@ export default abstract class GestureHandler {
121
121
  return;
122
122
  }
123
123
 
124
+ if (
125
+ this.tracker.getTrackedPointersCount() > 0 &&
126
+ (newState === State.END ||
127
+ newState === State.CANCELLED ||
128
+ newState === State.FAILED)
129
+ ) {
130
+ this.cancelTouches();
131
+ }
132
+
124
133
  const oldState = this.currentState;
125
134
  this.currentState = newState;
126
135
 
@@ -507,6 +516,56 @@ export default abstract class GestureHandler {
507
516
  };
508
517
  }
509
518
 
519
+ private cancelTouches(): void {
520
+ const rect = this.view.getBoundingClientRect();
521
+
522
+ const all: PointerData[] = [];
523
+ const changed: PointerData[] = [];
524
+
525
+ const trackerData = this.tracker.getData();
526
+
527
+ if (trackerData.size === 0) {
528
+ return;
529
+ }
530
+
531
+ trackerData.forEach((element: TrackerElement, key: number): void => {
532
+ const id: number = this.tracker.getMappedTouchEventId(key);
533
+
534
+ all.push({
535
+ id: id,
536
+ x: element.lastX - rect.left,
537
+ y: element.lastY - rect.top,
538
+ absoluteX: element.lastX,
539
+ absoluteY: element.lastY,
540
+ });
541
+
542
+ changed.push({
543
+ id: id,
544
+ x: element.lastX - rect.left,
545
+ y: element.lastY - rect.top,
546
+ absoluteX: element.lastX,
547
+ absoluteY: element.lastY,
548
+ });
549
+ });
550
+
551
+ const cancelEvent: ResultTouchEvent = {
552
+ nativeEvent: {
553
+ handlerTag: this.handlerTag,
554
+ state: this.currentState,
555
+ eventType: TouchEventType.CANCELLED,
556
+ changedTouches: changed,
557
+ allTouches: all,
558
+ numberOfTouches: all.length,
559
+ },
560
+ timeStamp: Date.now(),
561
+ };
562
+
563
+ const { onGestureHandlerEvent }: PropsRef = this.propsRef
564
+ .current as PropsRef;
565
+
566
+ invokeNullableMethod(onGestureHandlerEvent, cancelEvent);
567
+ }
568
+
510
569
  protected transformNativeEvent() {
511
570
  return {};
512
571
  }