react-native-gesture-handler 2.9.0 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. package/README.md +1 -0
  2. package/RNGestureHandler.podspec +1 -1
  3. package/android/build.gradle +69 -29
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +1 -1
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +39 -0
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +8 -2
  8. package/ios/Handlers/RNNativeViewHandler.mm +4 -4
  9. package/ios/RNGestureHandlerButtonComponentView.h +2 -2
  10. package/ios/RNGestureHandlerButtonComponentView.mm +2 -2
  11. package/ios/RNGestureHandlerManager.mm +9 -9
  12. package/ios/RNGestureHandlerModule.mm +16 -16
  13. package/ios/RNGestureHandlerRootViewComponentView.mm +2 -2
  14. package/ios/RNRootViewGestureRecognizer.m +3 -3
  15. package/lib/commonjs/EnableNewWebImplementation.js +35 -0
  16. package/lib/commonjs/EnableNewWebImplementation.js.map +1 -0
  17. package/lib/commonjs/GestureHandlerRootViewContext.js +15 -0
  18. package/lib/commonjs/GestureHandlerRootViewContext.js.map +1 -0
  19. package/lib/commonjs/RNGestureHandlerModule.macos.js +6 -6
  20. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  21. package/lib/commonjs/RNGestureHandlerModule.web.js +6 -6
  22. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  23. package/lib/commonjs/RNGestureHandlerModule.windows.js +6 -6
  24. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
  25. package/lib/commonjs/components/GestureComponents.web.js +6 -5
  26. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  27. package/lib/commonjs/components/GestureHandlerButton.js +3 -5
  28. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  29. package/lib/commonjs/{GestureHandlerRootView.android.js → components/GestureHandlerRootView.android.js} +8 -7
  30. package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -0
  31. package/lib/commonjs/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +8 -2
  32. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -0
  33. package/lib/commonjs/{GestureHandlerRootView.web.js → components/GestureHandlerRootView.web.js} +7 -1
  34. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -0
  35. package/lib/commonjs/components/Swipeable.js +17 -3
  36. package/lib/commonjs/components/Swipeable.js.map +1 -1
  37. package/lib/commonjs/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
  38. package/lib/commonjs/handlers/createHandler.js +21 -13
  39. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  40. package/lib/commonjs/handlers/gestureHandlerCommon.js +5 -4
  41. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  42. package/lib/commonjs/handlers/gestures/GestureDetector.js +19 -9
  43. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  44. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +22 -19
  45. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  46. package/lib/commonjs/index.js +16 -4
  47. package/lib/commonjs/index.js.map +1 -1
  48. package/lib/commonjs/utils.js +0 -6
  49. package/lib/commonjs/utils.js.map +1 -1
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -5
  51. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  52. package/lib/commonjs/web/handlers/GestureHandler.js +3 -0
  53. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  54. package/lib/commonjs/web/handlers/ManualGestureHandler.js +0 -5
  55. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
  56. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +0 -6
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  58. package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -12
  59. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  60. package/lib/commonjs/web/handlers/PinchGestureHandler.js +0 -5
  61. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  62. package/lib/commonjs/web/handlers/RotationGestureHandler.js +0 -6
  63. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  64. package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -6
  65. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  66. package/lib/commonjs/web/tools/CircularBuffer.js +59 -0
  67. package/lib/commonjs/web/tools/CircularBuffer.js.map +1 -0
  68. package/lib/commonjs/web/tools/LeastSquareSolver.js +204 -0
  69. package/lib/commonjs/web/tools/LeastSquareSolver.js.map +1 -0
  70. package/lib/commonjs/web/tools/PointerEventManager.js +27 -0
  71. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  72. package/lib/commonjs/web/tools/PointerTracker.js +11 -7
  73. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  74. package/lib/commonjs/web/tools/VelocityTracker.js +111 -0
  75. package/lib/commonjs/web/tools/VelocityTracker.js.map +1 -0
  76. package/lib/commonjs/web_hammer/GestureHandler.js +1 -1
  77. package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -1
  78. package/lib/module/EnableNewWebImplementation.js +22 -0
  79. package/lib/module/EnableNewWebImplementation.js.map +1 -0
  80. package/lib/module/GestureHandlerRootViewContext.js +3 -0
  81. package/lib/module/GestureHandlerRootViewContext.js.map +1 -0
  82. package/lib/module/RNGestureHandlerModule.macos.js +6 -6
  83. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  84. package/lib/module/RNGestureHandlerModule.web.js +6 -6
  85. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  86. package/lib/module/RNGestureHandlerModule.windows.js +6 -6
  87. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
  88. package/lib/module/components/GestureComponents.web.js +5 -6
  89. package/lib/module/components/GestureComponents.web.js.map +1 -1
  90. package/lib/module/components/GestureHandlerButton.js +1 -4
  91. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  92. package/lib/module/components/GestureHandlerRootView.android.js +14 -0
  93. package/lib/module/components/GestureHandlerRootView.android.js.map +1 -0
  94. package/lib/module/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +5 -2
  95. package/lib/module/components/GestureHandlerRootView.js.map +1 -0
  96. package/lib/module/components/GestureHandlerRootView.web.js +9 -0
  97. package/lib/module/components/GestureHandlerRootView.web.js.map +1 -0
  98. package/lib/module/components/Swipeable.js +17 -3
  99. package/lib/module/components/Swipeable.js.map +1 -1
  100. package/lib/module/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
  101. package/lib/module/handlers/createHandler.js +20 -13
  102. package/lib/module/handlers/createHandler.js.map +1 -1
  103. package/lib/module/handlers/gestureHandlerCommon.js +5 -4
  104. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  105. package/lib/module/handlers/gestures/GestureDetector.js +18 -10
  106. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  107. package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -16
  108. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  109. package/lib/module/index.js +4 -4
  110. package/lib/module/index.js.map +1 -1
  111. package/lib/module/utils.js +0 -4
  112. package/lib/module/utils.js.map +1 -1
  113. package/lib/module/web/handlers/FlingGestureHandler.js +0 -5
  114. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  115. package/lib/module/web/handlers/GestureHandler.js +3 -0
  116. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  117. package/lib/module/web/handlers/ManualGestureHandler.js +0 -5
  118. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
  119. package/lib/module/web/handlers/NativeViewGestureHandler.js +0 -6
  120. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  121. package/lib/module/web/handlers/PanGestureHandler.js +2 -9
  122. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  123. package/lib/module/web/handlers/PinchGestureHandler.js +0 -5
  124. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  125. package/lib/module/web/handlers/RotationGestureHandler.js +0 -6
  126. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  127. package/lib/module/web/handlers/TapGestureHandler.js +0 -6
  128. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  129. package/lib/module/web/tools/CircularBuffer.js +50 -0
  130. package/lib/module/web/tools/CircularBuffer.js.map +1 -0
  131. package/lib/module/web/tools/LeastSquareSolver.js +195 -0
  132. package/lib/module/web/tools/LeastSquareSolver.js.map +1 -0
  133. package/lib/module/web/tools/PointerEventManager.js +27 -0
  134. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  135. package/lib/module/web/tools/PointerTracker.js +8 -7
  136. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  137. package/lib/module/web/tools/VelocityTracker.js +98 -0
  138. package/lib/module/web/tools/VelocityTracker.js.map +1 -0
  139. package/lib/module/web_hammer/GestureHandler.js +1 -1
  140. package/lib/module/web_hammer/GestureHandler.js.map +1 -1
  141. package/lib/typescript/EnableNewWebImplementation.d.ts +3 -0
  142. package/lib/typescript/GestureHandlerRootViewContext.d.ts +3 -0
  143. package/lib/typescript/components/GestureComponents.web.d.ts +1 -1
  144. package/lib/typescript/components/Swipeable.d.ts +12 -1
  145. package/lib/typescript/{gestureHandlerRootHOC.d.ts → components/gestureHandlerRootHOC.d.ts} +1 -1
  146. package/lib/typescript/index.d.ts +4 -4
  147. package/lib/typescript/utils.d.ts +0 -1
  148. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -1
  149. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +0 -1
  150. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +0 -1
  151. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -1
  152. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +0 -1
  153. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +0 -1
  154. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -1
  155. package/lib/typescript/web/tools/CircularBuffer.d.ts +11 -0
  156. package/lib/typescript/web/tools/LeastSquareSolver.d.ts +12 -0
  157. package/lib/typescript/web/tools/PointerEventManager.d.ts +2 -0
  158. package/lib/typescript/web/tools/PointerTracker.d.ts +1 -0
  159. package/lib/typescript/web/tools/VelocityTracker.d.ts +13 -0
  160. package/package.json +3 -3
  161. package/src/EnableNewWebImplementation.ts +35 -0
  162. package/src/GestureHandlerRootViewContext.ts +3 -0
  163. package/src/RNGestureHandlerModule.macos.ts +6 -6
  164. package/src/RNGestureHandlerModule.web.ts +6 -6
  165. package/src/RNGestureHandlerModule.windows.ts +6 -6
  166. package/src/components/GestureComponents.web.tsx +5 -6
  167. package/src/components/GestureHandlerButton.tsx +2 -7
  168. package/src/components/GestureHandlerRootView.android.tsx +24 -0
  169. package/src/{GestureHandlerRootView.tsx → components/GestureHandlerRootView.tsx} +7 -2
  170. package/src/{GestureHandlerRootView.web.tsx → components/GestureHandlerRootView.web.tsx} +6 -1
  171. package/src/components/Swipeable.tsx +30 -4
  172. package/src/{gestureHandlerRootHOC.tsx → components/gestureHandlerRootHOC.tsx} +1 -1
  173. package/src/handlers/createHandler.tsx +20 -9
  174. package/src/handlers/gestureHandlerCommon.ts +5 -6
  175. package/src/handlers/gestures/GestureDetector.tsx +19 -9
  176. package/src/handlers/gestures/reanimatedWrapper.ts +21 -20
  177. package/src/index.ts +7 -3
  178. package/src/utils.ts +0 -5
  179. package/src/web/handlers/FlingGestureHandler.ts +0 -5
  180. package/src/web/handlers/GestureHandler.ts +3 -0
  181. package/src/web/handlers/ManualGestureHandler.ts +0 -5
  182. package/src/web/handlers/NativeViewGestureHandler.ts +0 -6
  183. package/src/web/handlers/PanGestureHandler.ts +2 -9
  184. package/src/web/handlers/PinchGestureHandler.ts +0 -5
  185. package/src/web/handlers/RotationGestureHandler.ts +0 -7
  186. package/src/web/handlers/TapGestureHandler.ts +0 -6
  187. package/src/web/tools/CircularBuffer.ts +42 -0
  188. package/src/web/tools/LeastSquareSolver.ts +182 -0
  189. package/src/web/tools/PointerEventManager.ts +29 -0
  190. package/src/web/tools/PointerTracker.ts +7 -7
  191. package/src/web/tools/VelocityTracker.ts +98 -0
  192. package/src/web_hammer/GestureHandler.ts +1 -1
  193. package/lib/commonjs/EnableExperimentalWebImplementation.js +0 -31
  194. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +0 -1
  195. package/lib/commonjs/GestureHandlerRootView.android.js.map +0 -1
  196. package/lib/commonjs/GestureHandlerRootView.js.map +0 -1
  197. package/lib/commonjs/GestureHandlerRootView.web.js.map +0 -1
  198. package/lib/module/EnableExperimentalWebImplementation.js +0 -20
  199. package/lib/module/EnableExperimentalWebImplementation.js.map +0 -1
  200. package/lib/module/GestureHandlerRootView.android.js +0 -14
  201. package/lib/module/GestureHandlerRootView.android.js.map +0 -1
  202. package/lib/module/GestureHandlerRootView.js.map +0 -1
  203. package/lib/module/GestureHandlerRootView.web.js +0 -6
  204. package/lib/module/GestureHandlerRootView.web.js.map +0 -1
  205. package/lib/typescript/EnableExperimentalWebImplementation.d.ts +0 -2
  206. package/src/EnableExperimentalWebImplementation.ts +0 -27
  207. package/src/GestureHandlerRootView.android.tsx +0 -24
  208. /package/lib/commonjs/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
  209. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
  210. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
  211. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
  212. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
  213. /package/lib/module/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
  214. /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
  215. /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
  216. /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
  217. /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
  218. /package/lib/typescript/{GestureHandlerRootView.android.d.ts → components/GestureHandlerRootView.android.d.ts} +0 -0
  219. /package/lib/typescript/{GestureHandlerRootView.d.ts → components/GestureHandlerRootView.d.ts} +0 -0
  220. /package/lib/typescript/{GestureHandlerRootView.web.d.ts → components/GestureHandlerRootView.web.d.ts} +0 -0
  221. /package/lib/typescript/{fabric → specs}/RNGestureHandlerButtonNativeComponent.d.ts +0 -0
  222. /package/lib/typescript/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.d.ts +0 -0
  223. /package/src/{fabric → specs}/RNGestureHandlerButtonNativeComponent.ts +0 -0
  224. /package/src/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.ts +0 -0
@@ -9,5 +9,4 @@ export default class ManualGestureHandler extends GestureHandler {
9
9
  protected onPointerOutOfBounds(event: AdaptedEvent): void;
10
10
  protected onPointerUp(event: AdaptedEvent): void;
11
11
  protected onPointerRemove(event: AdaptedEvent): void;
12
- protected onPointerCancel(event: AdaptedEvent): void;
13
12
  }
@@ -18,7 +18,6 @@ export default class NativeViewGestureHandler extends GestureHandler {
18
18
  protected onPointerUp(event: AdaptedEvent): void;
19
19
  protected onPointerRemove(event: AdaptedEvent): void;
20
20
  private onUp;
21
- protected onPointerCancel(event: AdaptedEvent): void;
22
21
  shouldRecognizeSimultaneously(handler: GestureHandler): boolean;
23
22
  shouldBeCancelledByOther(_handler: GestureHandler): boolean;
24
23
  disallowsInterruption(): boolean;
@@ -47,7 +47,6 @@ export default class PanGestureHandler extends GestureHandler {
47
47
  protected onPointerUp(event: AdaptedEvent): void;
48
48
  protected onPointerRemove(event: AdaptedEvent): void;
49
49
  protected onPointerMove(event: AdaptedEvent): void;
50
- protected onPointerCancel(event: AdaptedEvent): void;
51
50
  protected onPointerOutOfBounds(event: AdaptedEvent): void;
52
51
  private shouldActivate;
53
52
  private shouldFail;
@@ -21,7 +21,6 @@ export default class PinchGestureHandler extends GestureHandler {
21
21
  protected onPointerRemove(event: AdaptedEvent): void;
22
22
  protected onPointerMove(event: AdaptedEvent): void;
23
23
  protected onPointerOutOfBounds(event: AdaptedEvent): void;
24
- protected onPointerCancel(event: AdaptedEvent): void;
25
24
  private tryBegin;
26
25
  activate(force?: boolean): void;
27
26
  protected onReset(): void;
@@ -23,7 +23,6 @@ export default class RotationGestureHandler extends GestureHandler {
23
23
  protected onPointerOutOfBounds(event: AdaptedEvent): void;
24
24
  protected onPointerUp(event: AdaptedEvent): void;
25
25
  protected onPointerRemove(event: AdaptedEvent): void;
26
- protected onPointerCancel(event: AdaptedEvent): void;
27
26
  protected tryBegin(): void;
28
27
  activate(_force?: boolean): void;
29
28
  protected onReset(): void;
@@ -36,7 +36,6 @@ export default class TapGestureHandler extends GestureHandler {
36
36
  protected onPointerRemove(event: AdaptedEvent): void;
37
37
  protected onPointerMove(event: AdaptedEvent): void;
38
38
  protected onPointerOutOfBounds(event: AdaptedEvent): void;
39
- protected onPointerCancel(event: AdaptedEvent): void;
40
39
  private updateState;
41
40
  private trySettingPosition;
42
41
  private shouldFail;
@@ -0,0 +1,11 @@
1
+ export default class CircularBuffer<T> {
2
+ private bufferSize;
3
+ private buffer;
4
+ private index;
5
+ private actualSize;
6
+ constructor(size: number);
7
+ get size(): number;
8
+ push(element: T): void;
9
+ get(at: number): T;
10
+ clear(): void;
11
+ }
@@ -0,0 +1,12 @@
1
+ declare class PolynomialFit {
2
+ coefficients: number[];
3
+ constructor(degree: number);
4
+ }
5
+ export default class LeastSquareSolver {
6
+ private x;
7
+ private y;
8
+ private w;
9
+ constructor(x: number[], y: number[], w: number[]);
10
+ solve(degree: number): PolynomialFit | null;
11
+ }
12
+ export {};
@@ -1,6 +1,8 @@
1
1
  import { AdaptedEvent, EventTypes } from '../interfaces';
2
2
  import EventManager from './EventManager';
3
3
  export default class PointerEventManager extends EventManager {
4
+ private trackedPointers;
4
5
  setListeners(): void;
5
6
  protected mapEvent(event: PointerEvent, eventType: EventTypes): AdaptedEvent;
7
+ resetManager(): void;
6
8
  }
@@ -7,6 +7,7 @@ export interface TrackerElement {
7
7
  velocityY: number;
8
8
  }
9
9
  export default class PointerTracker {
10
+ private velocityTracker;
10
11
  private trackedPointers;
11
12
  private touchEventsIds;
12
13
  private lastMovedPointerId;
@@ -0,0 +1,13 @@
1
+ import { AdaptedEvent } from '../interfaces';
2
+ export default class VelocityTracker {
3
+ private assumePointerMoveStoppedMilliseconds;
4
+ private historySize;
5
+ private horizonMilliseconds;
6
+ private minSampleSize;
7
+ private samples;
8
+ constructor();
9
+ add(event: AdaptedEvent): void;
10
+ private getVelocityEstimate;
11
+ getVelocity(): [number, number];
12
+ reset(): void;
13
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-gesture-handler",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "Experimental implementation of a new declarative API for gesture handling in react-native",
5
5
  "scripts": {
6
6
  "prepare": "bob build && husky install",
@@ -142,11 +142,11 @@
142
142
  "eslintIgnore": [
143
143
  "node_modules/",
144
144
  "lib/",
145
- "src/fabric/*NativeComponent.js"
145
+ "src/specs/*NativeComponent.js"
146
146
  ],
147
147
  "codegenConfig": {
148
148
  "name": "rngesturehandler_codegen",
149
149
  "type": "components",
150
- "jsSrcsDir": "./src/fabric"
150
+ "jsSrcsDir": "./src/specs"
151
151
  }
152
152
  }
@@ -0,0 +1,35 @@
1
+ import { Platform } from 'react-native';
2
+
3
+ let useNewWebImplementation = true;
4
+ let getWasCalled = false;
5
+
6
+ export function enableExperimentalWebImplementation(
7
+ _shouldEnable = true
8
+ ): void {
9
+ // NO-OP since the new implementation is now the default
10
+ }
11
+
12
+ export function enableLegacyWebImplementation(
13
+ shouldUseLegacyImplementation = true
14
+ ): void {
15
+ if (
16
+ Platform.OS !== 'web' ||
17
+ useNewWebImplementation === !shouldUseLegacyImplementation
18
+ ) {
19
+ return;
20
+ }
21
+
22
+ if (getWasCalled) {
23
+ console.error(
24
+ 'Some parts of this application have already started using the new gesture handler implementation. No changes will be applied. You can try enabling legacy implementation earlier.'
25
+ );
26
+ return;
27
+ }
28
+
29
+ useNewWebImplementation = !shouldUseLegacyImplementation;
30
+ }
31
+
32
+ export function isNewWebImplementationEnabled(): boolean {
33
+ getWasCalled = true;
34
+ return useNewWebImplementation;
35
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+
3
+ export default React.createContext(false);
@@ -1,5 +1,5 @@
1
1
  import { ActionType } from './ActionType';
2
- import { isExperimentalWebImplementationEnabled } from './EnableExperimentalWebImplementation';
2
+ import { isNewWebImplementationEnabled } from './EnableNewWebImplementation';
3
3
 
4
4
  //GestureHandlers
5
5
  import InteractionManager from './web/tools/InteractionManager';
@@ -57,7 +57,7 @@ export default {
57
57
  handlerTag: number,
58
58
  config: T
59
59
  ) {
60
- if (isExperimentalWebImplementationEnabled()) {
60
+ if (isNewWebImplementationEnabled()) {
61
61
  if (!(handlerName in Gestures)) {
62
62
  throw new Error(
63
63
  `react-native-gesture-handler: ${handlerName} is not supported on web.`
@@ -92,14 +92,14 @@ export default {
92
92
  _actionType: ActionType,
93
93
  propsRef: React.RefObject<unknown>
94
94
  ) {
95
- if (isExperimentalWebImplementationEnabled()) {
95
+ if (isNewWebImplementationEnabled()) {
96
96
  NodeManager.getHandler(handlerTag).init(newView, propsRef);
97
97
  } else {
98
98
  HammerNodeManager.getHandler(handlerTag).setView(newView, propsRef);
99
99
  }
100
100
  },
101
101
  updateGestureHandler(handlerTag: number, newConfig: Config) {
102
- if (isExperimentalWebImplementationEnabled()) {
102
+ if (isNewWebImplementationEnabled()) {
103
103
  NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);
104
104
 
105
105
  InteractionManager.getInstance().configureInteractions(
@@ -111,14 +111,14 @@ export default {
111
111
  }
112
112
  },
113
113
  getGestureHandlerNode(handlerTag: number) {
114
- if (isExperimentalWebImplementationEnabled()) {
114
+ if (isNewWebImplementationEnabled()) {
115
115
  return NodeManager.getHandler(handlerTag);
116
116
  } else {
117
117
  return HammerNodeManager.getHandler(handlerTag);
118
118
  }
119
119
  },
120
120
  dropGestureHandler(handlerTag: number) {
121
- if (isExperimentalWebImplementationEnabled()) {
121
+ if (isNewWebImplementationEnabled()) {
122
122
  NodeManager.dropGestureHandler(handlerTag);
123
123
  } else {
124
124
  HammerNodeManager.dropGestureHandler(handlerTag);
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { ActionType } from './ActionType';
4
- import { isExperimentalWebImplementationEnabled } from './EnableExperimentalWebImplementation';
4
+ import { isNewWebImplementationEnabled } from './EnableNewWebImplementation';
5
5
 
6
6
  //GestureHandlers
7
7
  import InteractionManager from './web/tools/InteractionManager';
@@ -59,7 +59,7 @@ export default {
59
59
  handlerTag: number,
60
60
  config: T
61
61
  ) {
62
- if (isExperimentalWebImplementationEnabled()) {
62
+ if (isNewWebImplementationEnabled()) {
63
63
  if (!(handlerName in Gestures)) {
64
64
  throw new Error(
65
65
  `react-native-gesture-handler: ${handlerName} is not supported on web.`
@@ -101,7 +101,7 @@ export default {
101
101
  return;
102
102
  }
103
103
 
104
- if (isExperimentalWebImplementationEnabled()) {
104
+ if (isNewWebImplementationEnabled()) {
105
105
  //@ts-ignore Types should be HTMLElement or React.Component
106
106
  NodeManager.getHandler(handlerTag).init(newView, propsRef);
107
107
  } else {
@@ -110,7 +110,7 @@ export default {
110
110
  }
111
111
  },
112
112
  updateGestureHandler(handlerTag: number, newConfig: Config) {
113
- if (isExperimentalWebImplementationEnabled()) {
113
+ if (isNewWebImplementationEnabled()) {
114
114
  NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);
115
115
 
116
116
  InteractionManager.getInstance().configureInteractions(
@@ -122,14 +122,14 @@ export default {
122
122
  }
123
123
  },
124
124
  getGestureHandlerNode(handlerTag: number) {
125
- if (isExperimentalWebImplementationEnabled()) {
125
+ if (isNewWebImplementationEnabled()) {
126
126
  return NodeManager.getHandler(handlerTag);
127
127
  } else {
128
128
  return HammerNodeManager.getHandler(handlerTag);
129
129
  }
130
130
  },
131
131
  dropGestureHandler(handlerTag: number) {
132
- if (isExperimentalWebImplementationEnabled()) {
132
+ if (isNewWebImplementationEnabled()) {
133
133
  NodeManager.dropGestureHandler(handlerTag);
134
134
  } else {
135
135
  HammerNodeManager.dropGestureHandler(handlerTag);
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  import { ActionType } from './ActionType';
4
- import { isExperimentalWebImplementationEnabled } from './EnableExperimentalWebImplementation';
4
+ import { isNewWebImplementationEnabled } from './EnableNewWebImplementation';
5
5
 
6
6
  //GestureHandlers
7
7
  import InteractionManager from './web/tools/InteractionManager';
@@ -59,7 +59,7 @@ export default {
59
59
  handlerTag: number,
60
60
  config: T
61
61
  ) {
62
- if (isExperimentalWebImplementationEnabled()) {
62
+ if (isNewWebImplementationEnabled()) {
63
63
  if (!(handlerName in Gestures)) {
64
64
  throw new Error(
65
65
  `react-native-gesture-handler: ${handlerName} is not supported on web.`
@@ -101,7 +101,7 @@ export default {
101
101
  return;
102
102
  }
103
103
 
104
- if (isExperimentalWebImplementationEnabled()) {
104
+ if (isNewWebImplementationEnabled()) {
105
105
  //@ts-ignore Types should be HTMLElement or React.Component
106
106
  NodeManager.getHandler(handlerTag).init(newView, propsRef);
107
107
  } else {
@@ -110,7 +110,7 @@ export default {
110
110
  }
111
111
  },
112
112
  updateGestureHandler(handlerTag: number, newConfig: Config) {
113
- if (isExperimentalWebImplementationEnabled()) {
113
+ if (isNewWebImplementationEnabled()) {
114
114
  NodeManager.getHandler(handlerTag).updateGestureConfig(newConfig);
115
115
 
116
116
  InteractionManager.getInstance().configureInteractions(
@@ -122,14 +122,14 @@ export default {
122
122
  }
123
123
  },
124
124
  getGestureHandlerNode(handlerTag: number) {
125
- if (isExperimentalWebImplementationEnabled()) {
125
+ if (isNewWebImplementationEnabled()) {
126
126
  return NodeManager.getHandler(handlerTag);
127
127
  } else {
128
128
  return HammerNodeManager.getHandler(handlerTag);
129
129
  }
130
130
  },
131
131
  dropGestureHandler(handlerTag: number) {
132
- if (isExperimentalWebImplementationEnabled()) {
132
+ if (isNewWebImplementationEnabled()) {
133
133
  NodeManager.dropGestureHandler(handlerTag);
134
134
  } else {
135
135
  HammerNodeManager.dropGestureHandler(handlerTag);
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import {
3
- DrawerLayoutAndroid as RNDrawerLayoutAndroid,
4
3
  FlatList as RNFlatList,
5
4
  Switch as RNSwitch,
6
5
  TextInput as RNTextInput,
@@ -21,11 +20,11 @@ export const Switch = createNativeWrapper(RNSwitch, {
21
20
  disallowInterruption: true,
22
21
  });
23
22
  export const TextInput = createNativeWrapper(RNTextInput);
24
- export const DrawerLayoutAndroid = createNativeWrapper(RNDrawerLayoutAndroid, {
25
- disallowInterruption: true,
26
- });
27
- // @ts-ignore -- TODO(TS) to investigate if it's needed
28
- DrawerLayoutAndroid.positions = RNDrawerLayoutAndroid.positions;
23
+ export const DrawerLayoutAndroid = () => {
24
+ console.warn('DrawerLayoutAndroid is not supported on web!');
25
+ return <View />;
26
+ };
27
+
29
28
  // RefreshControl is implemented as a functional component, rendering a View
30
29
  // NativeViewGestureHandler needs to set a ref on its child, which cannot be done
31
30
  // on functional components
@@ -1,10 +1,5 @@
1
- /* eslint-disable @typescript-eslint/no-var-requires */
2
- import { HostComponent, requireNativeComponent } from 'react-native';
1
+ import { HostComponent } from 'react-native';
3
2
  import { RawButtonProps } from './GestureButtons';
4
- import { shouldUseCodegenNativeComponent } from '../utils';
5
-
6
- const RNGestureHandlerButtonNativeComponent = shouldUseCodegenNativeComponent()
7
- ? require('../fabric/RNGestureHandlerButtonNativeComponent').default
8
- : requireNativeComponent('RNGestureHandlerButton');
3
+ import RNGestureHandlerButtonNativeComponent from '../specs/RNGestureHandlerButtonNativeComponent';
9
4
 
10
5
  export default RNGestureHandlerButtonNativeComponent as HostComponent<RawButtonProps>;
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { PropsWithChildren } from 'react';
3
+ import { ViewProps } from 'react-native';
4
+ import { maybeInitializeFabric } from '../init';
5
+ import GestureHandlerRootViewContext from '../GestureHandlerRootViewContext';
6
+ import GestureHandlerRootViewNativeComponent from '../specs/RNGestureHandlerRootViewNativeComponent';
7
+
8
+ export interface GestureHandlerRootViewProps
9
+ extends PropsWithChildren<ViewProps> {}
10
+
11
+ export default function GestureHandlerRootView(
12
+ props: GestureHandlerRootViewProps
13
+ ) {
14
+ // try initialize fabric on the first render, at this point we can
15
+ // reliably check if fabric is enabled (the function contains a flag
16
+ // to make sure it's called only once)
17
+ maybeInitializeFabric();
18
+
19
+ return (
20
+ <GestureHandlerRootViewContext.Provider value>
21
+ <GestureHandlerRootViewNativeComponent {...props} />
22
+ </GestureHandlerRootViewContext.Provider>
23
+ );
24
+ }
@@ -1,7 +1,8 @@
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
+ import { maybeInitializeFabric } from '../init';
5
+ import GestureHandlerRootViewContext from '../GestureHandlerRootViewContext';
5
6
 
6
7
  export interface GestureHandlerRootViewProps
7
8
  extends PropsWithChildren<ViewProps> {}
@@ -14,5 +15,9 @@ export default function GestureHandlerRootView(
14
15
  // to make sure it's called only once)
15
16
  maybeInitializeFabric();
16
17
 
17
- return <View {...props} />;
18
+ return (
19
+ <GestureHandlerRootViewContext.Provider value>
20
+ <View {...props} />
21
+ </GestureHandlerRootViewContext.Provider>
22
+ );
18
23
  }
@@ -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 GestureHandlerRootViewContext from '../GestureHandlerRootViewContext';
4
5
 
5
6
  export interface GestureHandlerRootViewProps
6
7
  extends PropsWithChildren<ViewProps> {}
@@ -8,5 +9,9 @@ export interface GestureHandlerRootViewProps
8
9
  export default function GestureHandlerRootView(
9
10
  props: GestureHandlerRootViewProps
10
11
  ) {
11
- return <View {...props} />;
12
+ return (
13
+ <GestureHandlerRootViewContext.Provider value>
14
+ <View {...props} />
15
+ </GestureHandlerRootViewContext.Provider>
16
+ );
12
17
  }
@@ -73,6 +73,18 @@ export interface SwipeableProps
73
73
  */
74
74
  rightThreshold?: number;
75
75
 
76
+ /**
77
+ * Distance that the panel must be dragged from the left edge to be considered
78
+ * a swipe. The default value is 10.
79
+ */
80
+ dragOffsetFromLeftEdge?: number;
81
+
82
+ /**
83
+ * Distance that the panel must be dragged from the right edge to be considered
84
+ * a swipe. The default value is 10.
85
+ */
86
+ dragOffsetFromRightEdge?: number;
87
+
76
88
  /**
77
89
  * Value indicating if the swipeable panel can be pulled further than the left
78
90
  * actions panel's width. It is set to true by default as long as the left
@@ -156,7 +168,8 @@ export interface SwipeableProps
156
168
  * */
157
169
  renderLeftActions?: (
158
170
  progressAnimatedValue: AnimatedInterpolation,
159
- dragAnimatedValue: AnimatedInterpolation
171
+ dragAnimatedValue: AnimatedInterpolation,
172
+ swipeable: Swipeable
160
173
  ) => React.ReactNode;
161
174
  /**
162
175
  *
@@ -442,9 +455,22 @@ export default class Swipeable extends Component<
442
455
  this.animateRow(this.currentOffset(), -rightWidth);
443
456
  };
444
457
 
458
+ reset = () => {
459
+ const { dragX, rowTranslation } = this.state;
460
+ dragX.setValue(0);
461
+ rowTranslation.setValue(0);
462
+ this.setState({ rowState: 0 });
463
+ };
464
+
445
465
  render() {
446
466
  const { rowState } = this.state;
447
- const { children, renderLeftActions, renderRightActions } = this.props;
467
+ const {
468
+ children,
469
+ renderLeftActions,
470
+ renderRightActions,
471
+ dragOffsetFromLeftEdge = 10,
472
+ dragOffsetFromRightEdge = 10,
473
+ } = this.props;
448
474
 
449
475
  const left = renderLeftActions && (
450
476
  <Animated.View
@@ -455,7 +481,7 @@ export default class Swipeable extends Component<
455
481
  // it for some reason
456
482
  { transform: [{ translateX: this.leftActionTranslate! }] },
457
483
  ]}>
458
- {renderLeftActions(this.showLeftAction!, this.transX!)}
484
+ {renderLeftActions(this.showLeftAction!, this.transX!, this)}
459
485
  <View
460
486
  onLayout={({ nativeEvent }) =>
461
487
  this.setState({ leftWidth: nativeEvent.layout.x })
@@ -481,7 +507,7 @@ export default class Swipeable extends Component<
481
507
 
482
508
  return (
483
509
  <PanGestureHandler
484
- activeOffsetX={[-10, 10]}
510
+ activeOffsetX={[-dragOffsetFromRightEdge, dragOffsetFromLeftEdge]}
485
511
  {...this.props}
486
512
  onGestureEvent={this.onGestureEvent}
487
513
  onHandlerStateChange={this.onHandlerStateChange}>
@@ -4,7 +4,7 @@ import hoistNonReactStatics from 'hoist-non-react-statics';
4
4
  import GestureHandlerRootView from './GestureHandlerRootView';
5
5
 
6
6
  export default function gestureHandlerRootHOC<
7
- P extends JSX.IntrinsicAttributes
7
+ P extends Record<string, unknown>
8
8
  >(
9
9
  Component: React.ComponentType<P>,
10
10
  containerStyles?: StyleProp<ViewStyle>
@@ -28,6 +28,7 @@ import { ValueOf } from '../typeUtils';
28
28
  import { isFabric, isJestEnv, tagMessage } from '../utils';
29
29
  import { ActionType } from '../ActionType';
30
30
  import { PressabilityDebugView } from './PressabilityDebugView';
31
+ import GestureHandlerRootViewContext from '../GestureHandlerRootViewContext';
31
32
 
32
33
  const UIManagerAny = UIManager as any;
33
34
 
@@ -168,13 +169,14 @@ export default function createHandler<
168
169
  HandlerState
169
170
  > {
170
171
  static displayName = name;
172
+ static contextType = GestureHandlerRootViewContext;
171
173
 
172
174
  private handlerTag: number;
173
175
  private config: Record<string, unknown>;
174
176
  private propsRef: React.MutableRefObject<unknown>;
177
+ private isMountedRef: React.MutableRefObject<boolean | null>;
175
178
  private viewNode: any;
176
179
  private viewTag?: number;
177
- private updateEnqueued: ReturnType<typeof setImmediate> | null = null;
178
180
  private inspectorToggleListener?: EmitterSubscription;
179
181
 
180
182
  constructor(props: T & InternalEventHandlers) {
@@ -182,6 +184,7 @@ export default function createHandler<
182
184
  this.handlerTag = getNextHandlerTag();
183
185
  this.config = {};
184
186
  this.propsRef = React.createRef();
187
+ this.isMountedRef = React.createRef();
185
188
  this.state = { allowTouches };
186
189
  if (props.id) {
187
190
  if (handlerIDToTag[props.id] !== undefined) {
@@ -193,6 +196,7 @@ export default function createHandler<
193
196
 
194
197
  componentDidMount() {
195
198
  const props: HandlerProps<U> = this.props;
199
+ this.isMountedRef.current = true;
196
200
 
197
201
  if (DEV_ON_ANDROID) {
198
202
  this.inspectorToggleListener = DeviceEventEmitter.addListener(
@@ -207,11 +211,10 @@ export default function createHandler<
207
211
  // If there are unresolved refs (e.g. ".current" has not yet been set)
208
212
  // passed as `simultaneousHandlers` or `waitFor`, we enqueue a call to
209
213
  // _update method that will try to update native handler props using
210
- // setImmediate. This makes it so update() function gets called after all
214
+ // queueMicrotask. This makes it so update() function gets called after all
211
215
  // react components are mounted and we expect the missing ref object to
212
216
  // be resolved by then.
213
- this.updateEnqueued = setImmediate(() => {
214
- this.updateEnqueued = null;
217
+ queueMicrotask(() => {
215
218
  this.update(UNRESOLVED_REFS_RETRY_LIMIT);
216
219
  });
217
220
  }
@@ -237,11 +240,9 @@ export default function createHandler<
237
240
 
238
241
  componentWillUnmount() {
239
242
  this.inspectorToggleListener?.remove();
243
+ this.isMountedRef.current = false;
240
244
  RNGestureHandlerModule.dropGestureHandler(this.handlerTag);
241
245
  scheduleFlushOperations();
242
- if (this.updateEnqueued) {
243
- clearImmediate(this.updateEnqueued);
244
- }
245
246
  // We can't use this.props.id directly due to TS generic type narrowing bug, see https://github.com/microsoft/TypeScript/issues/13995 for more context
246
247
  const handlerID: string | undefined = this.props.id;
247
248
  if (handlerID) {
@@ -365,14 +366,17 @@ export default function createHandler<
365
366
  };
366
367
 
367
368
  private update(remainingTries: number) {
369
+ if (!this.isMountedRef.current) {
370
+ return;
371
+ }
372
+
368
373
  const props: HandlerProps<U> = this.props;
369
374
 
370
375
  // When ref is set via a function i.e. `ref={(r) => refObject.current = r}` instead of
371
376
  // `ref={refObject}` it's possible that it won't be resolved in time. Seems like trying
372
377
  // again is easy enough fix.
373
378
  if (hasUnresolvedRefs(props) && remainingTries > 0) {
374
- this.updateEnqueued = setImmediate(() => {
375
- this.updateEnqueued = null;
379
+ queueMicrotask(() => {
376
380
  this.update(remainingTries - 1);
377
381
  });
378
382
  } else {
@@ -398,6 +402,13 @@ export default function createHandler<
398
402
  }
399
403
 
400
404
  render() {
405
+ if (__DEV__ && !this.context) {
406
+ throw new Error(
407
+ name +
408
+ ' must be used as a descendant of GestureHandlerRootView. Otherwise the gestures will not be recognized. See https://docs.swmansion.com/react-native-gesture-handler/docs/installation for more details.'
409
+ );
410
+ }
411
+
401
412
  let gestureEventHandler = this.onGestureHandlerEvent;
402
413
  // Another instance of https://github.com/microsoft/TypeScript/issues/13995
403
414
  type OnGestureEventHandlers = {
@@ -191,16 +191,15 @@ export function findNodeHandle(
191
191
  return findNodeHandleRN(node);
192
192
  }
193
193
 
194
- let scheduledFlushOperationsId: ReturnType<
195
- typeof requestAnimationFrame
196
- > | null = null;
194
+ let flushOperationsScheduled = false;
197
195
 
198
196
  export function scheduleFlushOperations() {
199
- if (scheduledFlushOperationsId === null) {
200
- scheduledFlushOperationsId = requestAnimationFrame(() => {
197
+ if (!flushOperationsScheduled) {
198
+ flushOperationsScheduled = true;
199
+ queueMicrotask(() => {
201
200
  RNGestureHandlerModule.flushOperations();
202
201
 
203
- scheduledFlushOperationsId = null;
202
+ flushOperationsScheduled = false;
204
203
  });
205
204
  }
206
205
  }