react-native-gesture-handler 2.3.2 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/RNGestureHandler.podspec +2 -1
  2. package/android/build.gradle +38 -6
  3. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +14 -2
  4. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +10 -0
  5. package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +17 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +3 -41
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +6 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +10 -54
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +2 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +6 -0
  11. package/ios/RNGHTouchEventType.h +9 -0
  12. package/ios/RNGestureHandler.h +2 -2
  13. package/ios/RNGestureHandler.m +21 -8
  14. package/ios/RNGestureHandlerButton.h +1 -0
  15. package/ios/RNGestureHandlerButton.m +9 -1
  16. package/ios/RNGestureHandlerButtonComponentView.mm +14 -1
  17. package/ios/RNGestureHandlerButtonManager.m +4 -1
  18. package/ios/RNGestureHandlerEvents.h +2 -2
  19. package/ios/RNGestureHandlerEvents.m +2 -2
  20. package/ios/RNGestureHandlerManager.h +2 -0
  21. package/ios/RNGestureHandlerManager.mm +30 -20
  22. package/ios/RNGestureHandlerModule.mm +18 -0
  23. package/ios/RNGestureHandlerPointerTracker.h +2 -2
  24. package/ios/RNGestureHandlerPointerTracker.m +9 -6
  25. package/ios/RNGestureHandlerRegistry.h +1 -0
  26. package/ios/RNGestureHandlerRegistry.m +10 -0
  27. package/lib/commonjs/GestureHandlerRootView.android.js +7 -1
  28. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  29. package/lib/commonjs/GestureHandlerRootView.js +6 -0
  30. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  31. package/lib/commonjs/GestureHandlerRootView.web.js +19 -0
  32. package/lib/commonjs/GestureHandlerRootView.web.js.map +1 -0
  33. package/lib/commonjs/RNGestureHandlerModule.js +5 -0
  34. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  35. package/lib/commonjs/RNGestureHandlerModule.web.js +4 -1
  36. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  37. package/lib/commonjs/{EventType.js → TouchEventType.js} +4 -4
  38. package/lib/commonjs/TouchEventType.js.map +1 -0
  39. package/lib/commonjs/components/DrawerLayout.js +38 -11
  40. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  41. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  42. package/lib/commonjs/components/GestureHandlerButton.js +1 -1
  43. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  44. package/lib/commonjs/components/touchables/GenericTouchable.js +2 -0
  45. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  46. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +4 -6
  47. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  48. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +4 -6
  49. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  50. package/lib/commonjs/getShadowNodeFromRef.js +12 -9
  51. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  52. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +2 -1
  53. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  54. package/lib/commonjs/handlers/createHandler.js +25 -20
  55. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  56. package/lib/commonjs/handlers/gestureHandlerCommon.js +18 -1
  57. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  58. package/lib/commonjs/handlers/gestures/GestureDetector.js +120 -80
  59. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  60. package/lib/commonjs/handlers/gestures/eventReceiver.js +6 -5
  61. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  62. package/lib/commonjs/handlers/gestures/gesture.js +24 -4
  63. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  64. package/lib/commonjs/init.js +10 -1
  65. package/lib/commonjs/init.js.map +1 -1
  66. package/lib/commonjs/mocks.js +2 -0
  67. package/lib/commonjs/mocks.js.map +1 -1
  68. package/lib/commonjs/utils.js +23 -1
  69. package/lib/commonjs/utils.js.map +1 -1
  70. package/lib/commonjs/web/GestureHandler.js +4 -1
  71. package/lib/commonjs/web/GestureHandler.js.map +1 -1
  72. package/lib/commonjs/web/utils.js.map +1 -1
  73. package/lib/module/GestureHandlerRootView.android.js +7 -2
  74. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  75. package/lib/module/GestureHandlerRootView.js +5 -0
  76. package/lib/module/GestureHandlerRootView.js.map +1 -1
  77. package/lib/module/GestureHandlerRootView.web.js +6 -0
  78. package/lib/module/GestureHandlerRootView.web.js.map +1 -0
  79. package/lib/module/RNGestureHandlerModule.js +5 -0
  80. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  81. package/lib/module/RNGestureHandlerModule.web.js +4 -1
  82. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  83. package/lib/module/{EventType.js → TouchEventType.js} +2 -2
  84. package/lib/module/TouchEventType.js.map +1 -0
  85. package/lib/module/components/DrawerLayout.js +38 -11
  86. package/lib/module/components/DrawerLayout.js.map +1 -1
  87. package/lib/module/components/GestureButtons.js.map +1 -1
  88. package/lib/module/components/GestureHandlerButton.js +2 -2
  89. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  90. package/lib/module/components/touchables/GenericTouchable.js +2 -0
  91. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  92. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +5 -7
  93. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  94. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +5 -8
  95. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  96. package/lib/module/getShadowNodeFromRef.js +11 -8
  97. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  98. package/lib/module/handlers/ForceTouchGestureHandler.js +1 -1
  99. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  100. package/lib/module/handlers/createHandler.js +25 -22
  101. package/lib/module/handlers/createHandler.js.map +1 -1
  102. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  103. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  104. package/lib/module/handlers/gestures/GestureDetector.js +120 -81
  105. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  106. package/lib/module/handlers/gestures/eventReceiver.js +6 -7
  107. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  108. package/lib/module/handlers/gestures/gesture.js +23 -4
  109. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  110. package/lib/module/init.js +6 -1
  111. package/lib/module/init.js.map +1 -1
  112. package/lib/module/mocks.js +2 -0
  113. package/lib/module/mocks.js.map +1 -1
  114. package/lib/module/utils.js +17 -1
  115. package/lib/module/utils.js.map +1 -1
  116. package/lib/module/web/GestureHandler.js +4 -1
  117. package/lib/module/web/GestureHandler.js.map +1 -1
  118. package/lib/module/web/utils.js.map +1 -1
  119. package/lib/typescript/GestureHandlerRootView.web.d.ts +5 -0
  120. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -0
  121. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -0
  122. package/lib/typescript/{EventType.d.ts → TouchEventType.d.ts} +2 -2
  123. package/lib/typescript/components/DrawerLayout.d.ts +3 -0
  124. package/lib/typescript/components/GestureButtons.d.ts +18 -6
  125. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +13 -0
  126. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +5 -0
  127. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
  128. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  129. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +6 -3
  130. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -4
  131. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
  132. package/lib/typescript/handlers/gestures/gesture.d.ts +5 -0
  133. package/lib/typescript/init.d.ts +1 -0
  134. package/lib/typescript/mocks.d.ts +1 -0
  135. package/lib/typescript/utils.d.ts +2 -0
  136. package/lib/typescript/web/GestureHandler.d.ts +1 -1
  137. package/package.json +4 -2
  138. package/src/GestureHandlerRootView.android.tsx +8 -2
  139. package/src/GestureHandlerRootView.tsx +6 -0
  140. package/src/GestureHandlerRootView.web.tsx +12 -0
  141. package/src/RNGestureHandlerModule.ts +7 -0
  142. package/src/RNGestureHandlerModule.web.ts +2 -0
  143. package/src/{EventType.ts → TouchEventType.ts} +2 -2
  144. package/src/components/DrawerLayout.tsx +34 -10
  145. package/src/components/GestureButtons.tsx +21 -7
  146. package/src/components/GestureHandlerButton.tsx +2 -2
  147. package/src/components/touchables/GenericTouchable.tsx +2 -0
  148. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +27 -0
  149. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +12 -0
  150. package/src/getShadowNodeFromRef.ts +12 -9
  151. package/src/handlers/ForceTouchGestureHandler.ts +3 -2
  152. package/src/handlers/createHandler.ts +30 -26
  153. package/src/handlers/gestureHandlerCommon.ts +21 -2
  154. package/src/handlers/gestures/GestureDetector.tsx +164 -105
  155. package/src/handlers/gestures/eventReceiver.ts +6 -6
  156. package/src/handlers/gestures/gesture.ts +29 -2
  157. package/src/init.ts +8 -1
  158. package/src/mocks.ts +2 -0
  159. package/src/utils.ts +20 -0
  160. package/src/web/GestureHandler.ts +7 -1
  161. package/src/web/utils.ts +1 -1
  162. package/ios/RNTouchEventType.h +0 -9
  163. package/lib/commonjs/EventType.js.map +0 -1
  164. package/lib/module/EventType.js.map +0 -1
  165. package/src/fabric/RNGestureHandlerButtonNativeComponent.js +0 -27
  166. package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +0 -19
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { State } from '../State';
3
- import { EventType } from '../EventType';
3
+ import { TouchEventType } from '../TouchEventType';
4
4
  import { ValueOf } from '../typeUtils';
5
- export declare const baseGestureHandlerProps: readonly ["id", "enabled", "shouldCancelWhenOutside", "hitSlop", "waitFor", "simultaneousHandlers", "onBegan", "onFailed", "onCancelled", "onActivated", "onEnded", "onGestureEvent", "onHandlerStateChange"];
5
+ export declare const baseGestureHandlerProps: readonly ["id", "enabled", "shouldCancelWhenOutside", "hitSlop", "cancelsTouchesInView", "waitFor", "simultaneousHandlers", "onBegan", "onFailed", "onCancelled", "onActivated", "onEnded", "onGestureEvent", "onHandlerStateChange"];
6
6
  export declare const baseGestureHandlerWithMonitorProps: string[];
7
7
  export interface GestureEventPayload {
8
8
  handlerTag: number;
@@ -30,7 +30,7 @@ export declare type GestureTouchEvent = {
30
30
  handlerTag: number;
31
31
  numberOfTouches: number;
32
32
  state: ValueOf<typeof State>;
33
- eventType: EventType;
33
+ eventType: TouchEventType;
34
34
  allTouches: TouchData[];
35
35
  changedTouches: TouchData[];
36
36
  };
@@ -46,6 +46,7 @@ export declare type BaseGestureHandlerProps<ExtraEventPayloadT extends Record<st
46
46
  waitFor?: React.Ref<unknown> | React.Ref<unknown>[];
47
47
  simultaneousHandlers?: React.Ref<unknown> | React.Ref<unknown>[];
48
48
  testID?: string;
49
+ cancelsTouchesInView?: boolean;
49
50
  onBegan?: (event: HandlerStateChangeEvent) => void;
50
51
  onFailed?: (event: HandlerStateChangeEvent) => void;
51
52
  onCancelled?: (event: HandlerStateChangeEvent) => void;
@@ -53,8 +54,10 @@ export declare type BaseGestureHandlerProps<ExtraEventPayloadT extends Record<st
53
54
  onEnded?: (event: HandlerStateChangeEvent) => void;
54
55
  onGestureEvent?: (event: GestureEvent<ExtraEventPayloadT>) => void;
55
56
  onHandlerStateChange?: (event: HandlerStateChangeEvent<ExtraEventPayloadT>) => void;
57
+ children?: React.ReactNode;
56
58
  };
57
59
  export declare function filterConfig(props: Record<string, unknown>, validProps: string[], defaults?: Record<string, unknown>): {
58
60
  [x: string]: unknown;
59
61
  };
60
62
  export declare function findNodeHandle(node: null | number | React.Component<any, any> | React.ComponentClass<any>): null | number | React.Component<any, any> | React.ComponentClass<any>;
63
+ export declare function scheduleFlushOperations(): void;
@@ -2,9 +2,6 @@ import React from 'react';
2
2
  import { GestureType, HandlerCallbacks } from './gesture';
3
3
  import { SharedValue } from './reanimatedWrapper';
4
4
  import { ComposedGesture } from './gestureComposition';
5
- declare global {
6
- function isFormsStackingContext(node: unknown): boolean | null;
7
- }
8
5
  export declare type GestureConfigReference = {
9
6
  config: GestureType[];
10
7
  animatedEventHandler: unknown;
@@ -14,6 +11,7 @@ export declare type GestureConfigReference = {
14
11
  };
15
12
  interface GestureDetectorProps {
16
13
  gesture?: ComposedGesture | GestureType;
14
+ children?: React.ReactNode;
17
15
  }
18
- export declare const GestureDetector: React.FunctionComponent<GestureDetectorProps>;
16
+ export declare const GestureDetector: (props: GestureDetectorProps) => JSX.Element;
19
17
  export {};
@@ -1,2 +1,4 @@
1
+ import { GestureTouchEvent, GestureUpdateEvent, GestureStateChangeEvent } from '../gestureHandlerCommon';
2
+ export declare function onGestureHandlerEvent(event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent): void;
1
3
  export declare function startListening(): void;
2
4
  export declare function stopListening(): void;
@@ -18,9 +18,11 @@ export interface BaseGestureConfig extends CommonGestureConfig, Record<string, u
18
18
  manualActivation?: boolean;
19
19
  runOnJS?: boolean;
20
20
  testId?: string;
21
+ cancelsTouchesInView?: boolean;
21
22
  }
22
23
  declare type TouchEventHandlerType = (event: GestureTouchEvent, stateManager: GestureStateManagerType) => void;
23
24
  export declare type HandlerCallbacks<EventPayloadT extends Record<string, unknown>> = {
25
+ gestureId: number;
24
26
  handlerTag: number;
25
27
  onBegin?: (event: GestureStateChangeEvent<EventPayloadT>) => void;
26
28
  onStart?: (event: GestureStateChangeEvent<EventPayloadT>) => void;
@@ -67,10 +69,12 @@ export declare abstract class Gesture {
67
69
  abstract prepare(): void;
68
70
  }
69
71
  export declare abstract class BaseGesture<EventPayloadT extends Record<string, unknown>> extends Gesture {
72
+ private gestureId;
70
73
  handlerTag: number;
71
74
  handlerName: string;
72
75
  config: BaseGestureConfig;
73
76
  handlers: HandlerCallbacks<EventPayloadT>;
77
+ constructor();
74
78
  private addDependency;
75
79
  withRef(ref: React.MutableRefObject<GestureType | undefined>): this;
76
80
  protected isWorklet(callback: Function): boolean;
@@ -89,6 +93,7 @@ export declare abstract class BaseGesture<EventPayloadT extends Record<string, u
89
93
  simultaneousWithExternalGesture(...gestures: Exclude<GestureRef, number>[]): this;
90
94
  requireExternalGestureToFail(...gestures: Exclude<GestureRef, number>[]): this;
91
95
  withTestId(id: string): this;
96
+ cancelsTouchesInView(value: boolean): this;
92
97
  initialize(): void;
93
98
  toGestureArray(): GestureType[];
94
99
  prepare(): void;
@@ -1 +1,2 @@
1
1
  export declare function initialize(): void;
2
+ export declare function maybeInitializeFabric(): void;
@@ -25,6 +25,7 @@ declare const _default: {
25
25
  readonly createGestureHandler: () => void;
26
26
  readonly dropGestureHandler: () => void;
27
27
  readonly updateGestureHandler: () => void;
28
+ readonly flushOperations: () => void;
28
29
  readonly Directions: {
29
30
  readonly RIGHT: 1;
30
31
  readonly LEFT: 2;
@@ -5,3 +5,5 @@ export declare function hasProperty(object: object, key: string): boolean;
5
5
  export declare function isJestEnv(): boolean;
6
6
  export declare function tagMessage(msg: string): string;
7
7
  export declare function isFabric(): boolean;
8
+ export declare function shouldUseCodegenNativeComponent(): boolean;
9
+ export declare function isRemoteDebuggingEnabled(): boolean;
@@ -109,7 +109,7 @@ declare abstract class GestureHandler {
109
109
  nativeEvent: {
110
110
  handlerTag: any;
111
111
  target: any;
112
- oldState: State;
112
+ oldState: State | undefined;
113
113
  numberOfPointers: number;
114
114
  state: State;
115
115
  pointerInside: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gesture-handler",
3
- "version": "2.3.2",
3
+ "version": "2.4.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",
@@ -31,6 +31,8 @@
31
31
  "android/lib/build.gradle",
32
32
  "android/lib/src/main/java/",
33
33
  "android/common/src/main/java/",
34
+ "android/reanimated/src/main/java/",
35
+ "android/noreanimated/src/main/java/",
34
36
  "ios/",
35
37
  "Swipeable/",
36
38
  "jest-utils/",
@@ -109,7 +111,7 @@
109
111
  "react-native": "*"
110
112
  },
111
113
  "lint-staged": {
112
- "*.{ts,tsx}": [
114
+ "./src/*.{ts,tsx}": [
113
115
  "prettier --write"
114
116
  ]
115
117
  },
@@ -2,9 +2,10 @@
2
2
  import * as React from 'react';
3
3
  import { PropsWithChildren } from 'react';
4
4
  import { requireNativeComponent, ViewProps } from 'react-native';
5
- import { isFabric } from './utils';
5
+ import { maybeInitializeFabric } from './init';
6
+ import { shouldUseCodegenNativeComponent } from './utils';
6
7
 
7
- const GestureHandlerRootViewNativeComponent = isFabric()
8
+ const GestureHandlerRootViewNativeComponent = shouldUseCodegenNativeComponent()
8
9
  ? require('./fabric/RNGestureHandlerRootViewNativeComponent').default
9
10
  : requireNativeComponent('RNGestureHandlerRootView');
10
11
 
@@ -14,5 +15,10 @@ export interface GestureHandlerRootViewProps
14
15
  export default function GestureHandlerRootView(
15
16
  props: GestureHandlerRootViewProps
16
17
  ) {
18
+ // try initialize fabric on the first render, at this point we can
19
+ // reliably check if fabric is enabled (the function contains a flag
20
+ // to make sure it's called only once)
21
+ maybeInitializeFabric();
22
+
17
23
  return <GestureHandlerRootViewNativeComponent {...props} />;
18
24
  }
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { PropsWithChildren } from 'react';
3
3
  import { View, ViewProps } from 'react-native';
4
+ import { maybeInitializeFabric } from './init';
4
5
 
5
6
  export interface GestureHandlerRootViewProps
6
7
  extends PropsWithChildren<ViewProps> {}
@@ -8,5 +9,10 @@ export interface GestureHandlerRootViewProps
8
9
  export default function GestureHandlerRootView(
9
10
  props: GestureHandlerRootViewProps
10
11
  ) {
12
+ // try initialize fabric on the first render, at this point we can
13
+ // reliably check if fabric is enabled (the function contains a flag
14
+ // to make sure it's called only once)
15
+ maybeInitializeFabric();
16
+
11
17
  return <View {...props} />;
12
18
  }
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ import { View, ViewProps } from 'react-native';
4
+
5
+ export interface GestureHandlerRootViewProps
6
+ extends PropsWithChildren<ViewProps> {}
7
+
8
+ export default function GestureHandlerRootView(
9
+ props: GestureHandlerRootViewProps
10
+ ) {
11
+ return <View {...props} />;
12
+ }
@@ -16,6 +16,12 @@ if (RNGestureHandlerModule == null) {
16
16
  );
17
17
  }
18
18
 
19
+ if (RNGestureHandlerModule.flushOperations === undefined) {
20
+ RNGestureHandlerModule.flushOperations = () => {
21
+ // NO-OP if not defined
22
+ };
23
+ }
24
+
19
25
  export type RNGestureHandlerModuleProps = {
20
26
  handleSetJSResponder: (tag: number, blockNativeResponder: boolean) => void;
21
27
  handleClearJSResponder: () => void;
@@ -35,6 +41,7 @@ export type RNGestureHandlerModuleProps = {
35
41
  ) => void;
36
42
  dropGestureHandler: (handlerTag: number) => void;
37
43
  install: () => void;
44
+ flushOperations: () => void;
38
45
  };
39
46
 
40
47
  export default RNGestureHandlerModule as RNGestureHandlerModuleProps;
@@ -59,4 +59,6 @@ export default {
59
59
  dropGestureHandler(handlerTag: number) {
60
60
  NodeManager.dropGestureHandler(handlerTag);
61
61
  },
62
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
63
+ flushOperations() {},
62
64
  };
@@ -1,4 +1,4 @@
1
- export const EventType = {
1
+ export const TouchEventType = {
2
2
  UNDETERMINED: 0,
3
3
  TOUCHES_DOWN: 1,
4
4
  TOUCHES_MOVE: 2,
@@ -7,4 +7,4 @@ export const EventType = {
7
7
  } as const;
8
8
 
9
9
  // eslint-disable-next-line @typescript-eslint/no-redeclare -- backward compatibility; it can be used as a type and as a value
10
- export type EventType = typeof EventType[keyof typeof EventType];
10
+ export type TouchEventType = typeof TouchEventType[keyof typeof TouchEventType];
@@ -148,6 +148,11 @@ export interface DrawerLayoutProps {
148
148
  onDrawerSlide?: (position: number) => void;
149
149
 
150
150
  onGestureRef?: (ref: PanGestureHandler) => void;
151
+
152
+ // implicit `children` prop has been removed in @types/react^18.0.0
153
+ children?:
154
+ | React.ReactNode
155
+ | ((openValue?: Animated.AnimatedInterpolation) => React.ReactNode);
151
156
  }
152
157
 
153
158
  export type DrawerLayoutState = {
@@ -155,6 +160,8 @@ export type DrawerLayoutState = {
155
160
  touchX: Animated.Value;
156
161
  drawerTranslation: Animated.Value;
157
162
  containerWidth: number;
163
+ drawerState: DrawerState;
164
+ drawerOpened: boolean;
158
165
  };
159
166
 
160
167
  export type DrawerMovementOption = {
@@ -189,6 +196,8 @@ export default class DrawerLayout extends Component<
189
196
  touchX,
190
197
  drawerTranslation,
191
198
  containerWidth: 0,
199
+ drawerState: IDLE,
200
+ drawerOpened: false,
192
201
  };
193
202
 
194
203
  this.updateAnimatedEvent(props, this.state);
@@ -349,6 +358,7 @@ export default class DrawerLayout extends Component<
349
358
  this.handleRelease({ nativeEvent });
350
359
  } else if (nativeEvent.state === State.ACTIVE) {
351
360
  this.emitStateChanged(DRAGGING, false);
361
+ this.setState({ drawerState: DRAGGING });
352
362
  if (this.props.keyboardDismissMode === 'on-drag') {
353
363
  Keyboard.dismiss();
354
364
  }
@@ -464,6 +474,7 @@ export default class DrawerLayout extends Component<
464
474
  const willShow = toValue !== 0;
465
475
  this.updateShowing(willShow);
466
476
  this.emitStateChanged(SETTLING, willShow);
477
+ this.setState({ drawerState: SETTLING });
467
478
  if (this.props.hideStatusBar) {
468
479
  StatusBar.setHidden(willShow, this.props.statusBarAnimation || 'slide');
469
480
  }
@@ -476,6 +487,12 @@ export default class DrawerLayout extends Component<
476
487
  }).start(({ finished }) => {
477
488
  if (finished) {
478
489
  this.emitStateChanged(IDLE, willShow);
490
+ this.setState({ drawerOpened: willShow });
491
+ if (this.state.drawerState !== DRAGGING) {
492
+ // it's possilbe that user started drag while the drawer
493
+ // was settling, don't override state in this case
494
+ this.setState({ drawerState: IDLE });
495
+ }
479
496
  if (willShow) {
480
497
  this.props.onDrawerOpen?.();
481
498
  } else {
@@ -516,11 +533,14 @@ export default class DrawerLayout extends Component<
516
533
  private renderOverlay = () => {
517
534
  /* Overlay styles */
518
535
  invariant(this.openValue, 'should be set');
519
- const overlayOpacity = this.openValue.interpolate({
520
- inputRange: [0, 1],
521
- outputRange: [0, 1],
522
- extrapolate: 'clamp',
523
- });
536
+ let overlayOpacity;
537
+
538
+ if (this.state.drawerState !== IDLE) {
539
+ overlayOpacity = this.openValue;
540
+ } else {
541
+ overlayOpacity = this.state.drawerOpened ? 1 : 0;
542
+ }
543
+
524
544
  const dynamicOverlayStyles = {
525
545
  opacity: overlayOpacity,
526
546
  backgroundColor: this.props.overlayColor,
@@ -579,11 +599,15 @@ export default class DrawerLayout extends Component<
579
599
  let drawerTranslateX: number | Animated.AnimatedInterpolation = 0;
580
600
  if (drawerSlide) {
581
601
  const closedDrawerOffset = fromLeft ? -drawerWidth! : drawerWidth!;
582
- drawerTranslateX = openValue.interpolate({
583
- inputRange: [0, 1],
584
- outputRange: [closedDrawerOffset, 0],
585
- extrapolate: 'clamp',
586
- });
602
+ if (this.state.drawerState !== IDLE) {
603
+ drawerTranslateX = openValue.interpolate({
604
+ inputRange: [0, 1],
605
+ outputRange: [closedDrawerOffset, 0],
606
+ extrapolate: 'clamp',
607
+ });
608
+ } else {
609
+ drawerTranslateX = this.state.drawerOpened ? 0 : closedDrawerOffset;
610
+ }
587
611
  }
588
612
  const drawerStyles: {
589
613
  transform: { translateX: number | Animated.AnimatedInterpolation }[];
@@ -35,6 +35,27 @@ export interface RawButtonProps extends NativeViewGestureHandlerProps {
35
35
  * Defines color of native ripple animation used since API level 21.
36
36
  */
37
37
  rippleColor?: any; // it was present in BaseButtonProps before but is used here in code
38
+
39
+ /**
40
+ * Android only.
41
+ *
42
+ * Defines radius of native ripple animation used since API level 21.
43
+ */
44
+ rippleRadius?: number | null;
45
+
46
+ /**
47
+ * Android only.
48
+ *
49
+ * Set this to true if you want the ripple animation to render outside the view bounds.
50
+ */
51
+ borderless?: boolean;
52
+
53
+ /**
54
+ * Android only.
55
+ *
56
+ * Defines whether the ripple animation should be drawn on the foreground of the view.
57
+ */
58
+ foreground?: boolean;
38
59
  }
39
60
 
40
61
  export interface BaseButtonProps extends RawButtonProps {
@@ -69,13 +90,6 @@ export interface RectButtonProps extends BaseButtonProps {
69
90
  }
70
91
 
71
92
  export interface BorderlessButtonProps extends BaseButtonProps {
72
- /**
73
- * Android only.
74
- *
75
- * Set this to false if you want the ripple animation to render only within view bounds.
76
- */
77
- borderless?: boolean;
78
-
79
93
  /**
80
94
  * iOS only.
81
95
  *
@@ -1,9 +1,9 @@
1
1
  /* eslint-disable @typescript-eslint/no-var-requires */
2
2
  import { HostComponent, requireNativeComponent } from 'react-native';
3
3
  import { RawButtonProps } from './GestureButtons';
4
- import { isFabric } from '../utils';
4
+ import { shouldUseCodegenNativeComponent } from '../utils';
5
5
 
6
- const RNGestureHandlerButtonNativeComponent = isFabric()
6
+ const RNGestureHandlerButtonNativeComponent = shouldUseCodegenNativeComponent()
7
7
  ? require('../fabric/RNGestureHandlerButtonNativeComponent').default
8
8
  : requireNativeComponent('RNGestureHandlerButton');
9
9
 
@@ -258,6 +258,8 @@ export default class GenericTouchable extends Component<
258
258
  // TODO: check if changed to no 's' correctly, also removed 2 props that are no longer available: `accessibilityComponentType` and `accessibilityTraits`,
259
259
  // would be good to check if it is ok for sure, see: https://github.com/facebook/react-native/issues/24016
260
260
  accessibilityState: this.props.accessibilityState,
261
+ accessibilityActions: this.props.accessibilityActions,
262
+ onAccessibilityAction: this.props.onAccessibilityAction,
261
263
  nativeID: this.props.nativeID,
262
264
  onLayout: this.props.onLayout,
263
265
  hitSlop: this.props.hitSlop,
@@ -0,0 +1,27 @@
1
+ // @ts-ignore TODO: remove once there is a .d.ts file with definitions
2
+ import codegenNativeComponentUntyped from 'react-native/Libraries/Utilities/codegenNativeComponent';
3
+ // @ts-ignore TODO: remove once there is a .d.ts file with definitions
4
+ import type {
5
+ Int32,
6
+ WithDefault,
7
+ // @ts-ignore TODO: remove once there is a .d.ts file with definitions
8
+ } from 'react-native/Libraries/Types/CodegenTypes';
9
+ import type { ViewProps, HostComponent } from 'react-native';
10
+ // @ts-ignore TODO: remove once there is a .d.ts file with definitions
11
+ import type { ColorValue } from 'react-native/Libraries/StyleSheet/StyleSheet';
12
+
13
+ // eslint-disable-next-line @typescript-eslint/ban-types
14
+ const codegenNativeComponent = codegenNativeComponentUntyped as <T extends {}>(
15
+ name: string
16
+ ) => HostComponent<T>;
17
+
18
+ interface NativeProps extends ViewProps {
19
+ exclusive?: WithDefault<boolean, true>;
20
+ foreground?: boolean;
21
+ borderless?: boolean;
22
+ enabled?: WithDefault<boolean, true>;
23
+ rippleColor?: ColorValue;
24
+ rippleRadius?: Int32;
25
+ }
26
+
27
+ export default codegenNativeComponent<NativeProps>('RNGestureHandlerButton');
@@ -0,0 +1,12 @@
1
+ // @ts-ignore TODO: remove once there is a .d.ts file with definitions
2
+ import codegenNativeComponentUntyped from 'react-native/Libraries/Utilities/codegenNativeComponent';
3
+ import type { ViewProps, HostComponent } from 'react-native';
4
+
5
+ // eslint-disable-next-line @typescript-eslint/ban-types
6
+ const codegenNativeComponent = codegenNativeComponentUntyped as <T extends {}>(
7
+ name: string
8
+ ) => HostComponent<T>;
9
+
10
+ interface NativeProps extends ViewProps {}
11
+
12
+ export default codegenNativeComponent<NativeProps>('RNGestureHandlerRootView');
@@ -2,17 +2,20 @@
2
2
  // attached view may get flattened on Fabric. This implementation causes errors
3
3
  // on web due to the static resolution of `require` statements by webpack breaking
4
4
  // the conditional importing. Solved by making .web file.
5
- let findHostInstance_DEPRECATED = (_ref: any) => null;
6
-
7
- try {
8
- // eslint-disable-next-line @typescript-eslint/no-var-requires
9
- findHostInstance_DEPRECATED = require('react-native/Libraries/Renderer/shims/ReactFabric')
10
- .findHostInstance_DEPRECATED;
11
- } catch (e) {
12
- // do nothing
13
- }
5
+ let findHostInstance_DEPRECATED: (ref: any) => void;
14
6
 
15
7
  export function getShadowNodeFromRef(ref: any) {
8
+ // load findHostInstance_DEPRECATED lazily because it may not be available before render
9
+ if (findHostInstance_DEPRECATED === undefined) {
10
+ try {
11
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
12
+ findHostInstance_DEPRECATED = require('react-native/Libraries/Renderer/shims/ReactFabric')
13
+ .findHostInstance_DEPRECATED;
14
+ } catch (e) {
15
+ findHostInstance_DEPRECATED = (_ref: any) => null;
16
+ }
17
+ }
18
+
16
19
  // @ts-ignore Fabric
17
20
  return findHostInstance_DEPRECATED(ref)._internalInstanceHandle.stateNode
18
21
  .node;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { PropsWithChildren } from 'react';
2
2
  import { tagMessage } from '../utils';
3
3
  import PlatformConstants from '../PlatformConstants';
4
4
  import createHandler from './createHandler';
@@ -13,7 +13,8 @@ export const forceTouchGestureHandlerProps = [
13
13
  'feedbackOnActivation',
14
14
  ] as const;
15
15
 
16
- class ForceTouchFallback extends React.Component {
16
+ // implicit `children` prop has been removed in @types/react^18.0.0
17
+ class ForceTouchFallback extends React.Component<PropsWithChildren<unknown>> {
17
18
  static forceTouchAvailable = false;
18
19
  componentDidMount() {
19
20
  console.warn(
@@ -23,9 +23,10 @@ import {
23
23
  GestureEvent,
24
24
  HandlerStateChangeEvent,
25
25
  findNodeHandle,
26
+ scheduleFlushOperations,
26
27
  } from './gestureHandlerCommon';
27
28
  import { ValueOf } from '../typeUtils';
28
- import { isFabric, isJestEnv, tagMessage } from '../utils';
29
+ import { isFabric, isJestEnv } from '../utils';
29
30
  import { ActionType } from '../ActionType';
30
31
 
31
32
  const UIManagerAny = UIManager as any;
@@ -147,17 +148,7 @@ type InternalEventHandlers = {
147
148
  onGestureHandlerStateChange?: (event: any) => void;
148
149
  };
149
150
 
150
- let showedRngh2Notice = false;
151
- function showRngh2NoticeIfNeeded() {
152
- if (!showedRngh2Notice) {
153
- console.warn(
154
- tagMessage(
155
- "Seems like you're using an old API with gesture components, check out new Gestures system!"
156
- )
157
- );
158
- showedRngh2Notice = true;
159
- }
160
- }
151
+ const UNRESOLVED_REFS_RETRY_LIMIT = 1;
161
152
 
162
153
  // TODO(TS) - make sure that BaseGestureHandlerProps doesn't need other generic parameter to work with custom properties.
163
154
  export default function createHandler<
@@ -199,9 +190,6 @@ export default function createHandler<
199
190
  }
200
191
  handlerIDToTag[props.id] = this.handlerTag;
201
192
  }
202
- if (__DEV__ && !isJestEnv()) {
203
- showRngh2NoticeIfNeeded();
204
- }
205
193
  }
206
194
 
207
195
  componentDidMount() {
@@ -212,7 +200,7 @@ export default function createHandler<
212
200
  'toggleElementInspector',
213
201
  () => {
214
202
  this.setState((_) => ({ allowTouches }));
215
- this.update();
203
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
216
204
  }
217
205
  );
218
206
  }
@@ -225,7 +213,7 @@ export default function createHandler<
225
213
  // be resolved by then.
226
214
  this.updateEnqueued = setImmediate(() => {
227
215
  this.updateEnqueued = null;
228
- this.update();
216
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
229
217
  });
230
218
  }
231
219
 
@@ -245,12 +233,13 @@ export default function createHandler<
245
233
  if (this.viewTag !== viewTag) {
246
234
  this.attachGestureHandler(viewTag as number); // TODO(TS) - check interaction between _viewTag & findNodeHandle
247
235
  }
248
- this.update();
236
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
249
237
  }
250
238
 
251
239
  componentWillUnmount() {
252
240
  this.inspectorToggleListener?.remove();
253
241
  RNGestureHandlerModule.dropGestureHandler(this.handlerTag);
242
+ scheduleFlushOperations();
254
243
  if (this.updateEnqueued) {
255
244
  clearImmediate(this.updateEnqueued);
256
245
  }
@@ -361,6 +350,8 @@ export default function createHandler<
361
350
  actionType
362
351
  );
363
352
  }
353
+
354
+ scheduleFlushOperations();
364
355
  };
365
356
 
366
357
  private updateGestureHandler = (
@@ -369,16 +360,29 @@ export default function createHandler<
369
360
  this.config = newConfig;
370
361
 
371
362
  RNGestureHandlerModule.updateGestureHandler(this.handlerTag, newConfig);
363
+ scheduleFlushOperations();
372
364
  };
373
365
 
374
- private update() {
375
- const newConfig = filterConfig(
376
- transformProps ? transformProps(this.props) : this.props,
377
- [...allowedProps, ...customNativeProps],
378
- config
379
- );
380
- if (!deepEqual(this.config, newConfig)) {
381
- this.updateGestureHandler(newConfig);
366
+ private update(remainingTries: number) {
367
+ const props: HandlerProps<U> = this.props;
368
+
369
+ // When ref is set via a function i.e. `ref={(r) => refObject.current = r}` instead of
370
+ // `ref={refObject}` it's possible that it won't be resolved in time. Seems like trying
371
+ // again is easy enough fix.
372
+ if (hasUnresolvedRefs(props) && remainingTries > 0) {
373
+ this.updateEnqueued = setImmediate(() => {
374
+ this.updateEnqueued = null;
375
+ this.update(remainingTries - 1);
376
+ });
377
+ } else {
378
+ const newConfig = filterConfig(
379
+ transformProps ? transformProps(this.props) : this.props,
380
+ [...allowedProps, ...customNativeProps],
381
+ config
382
+ );
383
+ if (!deepEqual(this.config, newConfig)) {
384
+ this.updateGestureHandler(newConfig);
385
+ }
382
386
  }
383
387
  }
384
388