react-native-gesture-handler 2.9.0 → 2.10.1

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 (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 +65 -16
  12. package/ios/RNGestureHandlerModule.mm +20 -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.1",
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
  }