react-native-gesture-handler 2.1.2 → 2.3.0

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 (250) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -3
  3. package/RNGestureHandler.podspec +27 -3
  4. package/android/build.gradle +82 -9
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +47 -12
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +50 -14
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +7 -4
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +8 -8
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +6 -4
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/ScaleGestureDetector.java +558 -0
  11. package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +29 -0
  12. package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +12 -0
  13. package/android/src/main/AndroidManifest.xml +1 -1
  14. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +29 -0
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +29 -10
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +119 -55
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +9 -4
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +17 -2
  20. package/android/src/main/jni/Android.mk +53 -0
  21. package/android/src/main/jni/OnLoad.cpp +9 -0
  22. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +71 -0
  23. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +34 -0
  24. package/android/src/main/jni/cpp-adapter.cpp +41 -0
  25. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +47 -0
  26. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +22 -0
  27. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +25 -0
  28. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +16 -0
  29. package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +13 -0
  30. package/ios/Handlers/RNFlingHandler.m +2 -0
  31. package/ios/Handlers/RNPanHandler.m +2 -0
  32. package/ios/Handlers/RNPinchHandler.m +2 -0
  33. package/ios/Handlers/RNRotationHandler.m +2 -0
  34. package/ios/RNGestureHandler.h +3 -8
  35. package/ios/RNGestureHandler.m +2 -10
  36. package/ios/RNGestureHandlerActionType.h +8 -0
  37. package/ios/RNGestureHandlerButtonComponentView.h +17 -0
  38. package/ios/RNGestureHandlerButtonComponentView.mm +48 -0
  39. package/ios/RNGestureHandlerButtonManager.h +5 -0
  40. package/ios/RNGestureHandlerButtonManager.m +30 -0
  41. package/ios/RNGestureHandlerManager.h +2 -4
  42. package/ios/{RNGestureHandlerManager.m → RNGestureHandlerManager.mm} +92 -20
  43. package/ios/{RNGestureHandlerModule.m → RNGestureHandlerModule.mm} +91 -36
  44. package/ios/RNGestureHandlerRegistry.h +1 -2
  45. package/ios/RNGestureHandlerRegistry.m +2 -11
  46. package/ios/RNGestureHandlerRootViewComponentView.mm +21 -0
  47. package/lib/commonjs/ActionType.js +15 -0
  48. package/lib/commonjs/ActionType.js.map +1 -0
  49. package/lib/commonjs/GestureHandlerRootView.android.js +6 -6
  50. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  51. package/lib/commonjs/GestureHandlerRootView.js +2 -3
  52. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  53. package/lib/commonjs/RNGestureHandlerModule.js +4 -2
  54. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  55. package/lib/commonjs/RNGestureHandlerModule.web.js +1 -1
  56. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  57. package/lib/commonjs/components/DrawerLayout.js +2 -2
  58. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  59. package/lib/commonjs/components/GestureHandlerButton.js +5 -2
  60. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  61. package/lib/commonjs/components/Swipeable.js +22 -20
  62. package/lib/commonjs/components/Swipeable.js.map +1 -1
  63. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +21 -0
  64. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  65. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +21 -0
  66. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  67. package/lib/commonjs/getShadowNodeFromRef.js +24 -0
  68. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -0
  69. package/lib/commonjs/getShadowNodeFromRef.web.js +15 -0
  70. package/lib/commonjs/getShadowNodeFromRef.web.js.map +1 -0
  71. package/lib/commonjs/handlers/FlingGestureHandler.js +4 -2
  72. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -1
  73. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +8 -4
  74. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  75. package/lib/commonjs/handlers/LongPressGestureHandler.js +4 -2
  76. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  77. package/lib/commonjs/handlers/NativeViewGestureHandler.js +4 -2
  78. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  79. package/lib/commonjs/handlers/PanGestureHandler.js +4 -2
  80. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  81. package/lib/commonjs/handlers/PinchGestureHandler.js +4 -2
  82. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -1
  83. package/lib/commonjs/handlers/RotationGestureHandler.js +4 -2
  84. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -1
  85. package/lib/commonjs/handlers/TapGestureHandler.js +4 -2
  86. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -1
  87. package/lib/commonjs/handlers/createHandler.js +72 -8
  88. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  89. package/lib/commonjs/handlers/createNativeWrapper.js +6 -2
  90. package/lib/commonjs/handlers/createNativeWrapper.js.map +1 -1
  91. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  92. package/lib/commonjs/handlers/gestures/GestureDetector.js +84 -32
  93. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  94. package/lib/commonjs/handlers/gestures/eventReceiver.js +25 -8
  95. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  96. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  97. package/lib/commonjs/handlers/gestures/gesture.js +16 -1
  98. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  99. package/lib/commonjs/handlers/gestures/gestureStateManager.js +7 -4
  100. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  101. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  102. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
  103. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +4 -1
  104. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  105. package/lib/commonjs/handlers/handlersRegistry.js +42 -6
  106. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -1
  107. package/lib/commonjs/index.js +14 -106
  108. package/lib/commonjs/index.js.map +1 -1
  109. package/lib/commonjs/init.js +10 -0
  110. package/lib/commonjs/init.js.map +1 -1
  111. package/lib/commonjs/jestUtils.js +375 -0
  112. package/lib/commonjs/jestUtils.js.map +1 -0
  113. package/lib/commonjs/utils.js +38 -0
  114. package/lib/commonjs/utils.js.map +1 -1
  115. package/lib/module/ActionType.js +7 -0
  116. package/lib/module/ActionType.js.map +1 -0
  117. package/lib/module/GestureHandlerRootView.android.js +5 -6
  118. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  119. package/lib/module/GestureHandlerRootView.js +2 -3
  120. package/lib/module/GestureHandlerRootView.js.map +1 -1
  121. package/lib/module/RNGestureHandlerModule.js +3 -2
  122. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  123. package/lib/module/RNGestureHandlerModule.web.js +1 -1
  124. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  125. package/lib/module/components/DrawerLayout.js +2 -2
  126. package/lib/module/components/DrawerLayout.js.map +1 -1
  127. package/lib/module/components/GestureHandlerButton.js +4 -2
  128. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  129. package/lib/module/components/Swipeable.js +22 -20
  130. package/lib/module/components/Swipeable.js.map +1 -1
  131. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +9 -0
  132. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  133. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +9 -0
  134. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  135. package/lib/module/getShadowNodeFromRef.js +17 -0
  136. package/lib/module/getShadowNodeFromRef.js.map +1 -0
  137. package/lib/module/getShadowNodeFromRef.web.js +8 -0
  138. package/lib/module/getShadowNodeFromRef.web.js.map +1 -0
  139. package/lib/module/handlers/FlingGestureHandler.js +2 -1
  140. package/lib/module/handlers/FlingGestureHandler.js.map +1 -1
  141. package/lib/module/handlers/ForceTouchGestureHandler.js +5 -3
  142. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  143. package/lib/module/handlers/LongPressGestureHandler.js +2 -1
  144. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  145. package/lib/module/handlers/NativeViewGestureHandler.js +2 -1
  146. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  147. package/lib/module/handlers/PanGestureHandler.js +2 -1
  148. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  149. package/lib/module/handlers/PinchGestureHandler.js +2 -1
  150. package/lib/module/handlers/PinchGestureHandler.js.map +1 -1
  151. package/lib/module/handlers/RotationGestureHandler.js +2 -1
  152. package/lib/module/handlers/RotationGestureHandler.js.map +1 -1
  153. package/lib/module/handlers/TapGestureHandler.js +2 -1
  154. package/lib/module/handlers/TapGestureHandler.js.map +1 -1
  155. package/lib/module/handlers/createHandler.js +72 -9
  156. package/lib/module/handlers/createHandler.js.map +1 -1
  157. package/lib/module/handlers/createNativeWrapper.js +6 -2
  158. package/lib/module/handlers/createNativeWrapper.js.map +1 -1
  159. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  160. package/lib/module/handlers/gestures/GestureDetector.js +79 -32
  161. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  162. package/lib/module/handlers/gestures/eventReceiver.js +25 -7
  163. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  164. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  165. package/lib/module/handlers/gestures/gesture.js +16 -1
  166. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  167. package/lib/module/handlers/gestures/gestureStateManager.js +6 -4
  168. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  169. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  170. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
  171. package/lib/module/handlers/gestures/reanimatedWrapper.js +2 -1
  172. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  173. package/lib/module/handlers/handlersRegistry.js +34 -6
  174. package/lib/module/handlers/handlersRegistry.js.map +1 -1
  175. package/lib/module/index.js +1 -11
  176. package/lib/module/index.js.map +1 -1
  177. package/lib/module/init.js +6 -0
  178. package/lib/module/init.js.map +1 -1
  179. package/lib/module/jestUtils.js +350 -0
  180. package/lib/module/jestUtils.js.map +1 -0
  181. package/lib/module/utils.js +28 -0
  182. package/lib/module/utils.js.map +1 -1
  183. package/lib/typescript/ActionType.d.ts +7 -0
  184. package/lib/typescript/GestureHandlerRootView.android.d.ts +5 -2
  185. package/lib/typescript/GestureHandlerRootView.d.ts +1 -1
  186. package/lib/typescript/RNGestureHandlerModule.d.ts +3 -1
  187. package/lib/typescript/RNGestureHandlerModule.web.d.ts +2 -1
  188. package/lib/typescript/components/GestureHandlerButton.d.ts +2 -2
  189. package/lib/typescript/components/Swipeable.d.ts +12 -4
  190. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -0
  191. package/lib/typescript/getShadowNodeFromRef.web.d.ts +1 -0
  192. package/lib/typescript/handlers/FlingGestureHandler.d.ts +1 -0
  193. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -1
  194. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +3 -2
  195. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -0
  196. package/lib/typescript/handlers/PanGestureHandler.d.ts +3 -2
  197. package/lib/typescript/handlers/PinchGestureHandler.d.ts +1 -0
  198. package/lib/typescript/handlers/RotationGestureHandler.d.ts +1 -0
  199. package/lib/typescript/handlers/TapGestureHandler.d.ts +1 -0
  200. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +2 -4
  201. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +4 -1
  202. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +1 -2
  203. package/lib/typescript/handlers/gestures/gesture.d.ts +5 -0
  204. package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -2
  205. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +1 -2
  206. package/lib/typescript/handlers/handlersRegistry.d.ts +11 -3
  207. package/lib/typescript/index.d.ts +15 -11
  208. package/lib/typescript/jestUtils.d.ts +28 -0
  209. package/lib/typescript/utils.d.ts +6 -0
  210. package/lib/typescript/web/constants.d.ts +0 -1
  211. package/package.json +39 -16
  212. package/src/ActionType.ts +9 -0
  213. package/src/GestureHandlerRootView.android.tsx +14 -14
  214. package/src/GestureHandlerRootView.tsx +4 -4
  215. package/src/RNGestureHandlerModule.ts +11 -6
  216. package/src/RNGestureHandlerModule.web.ts +2 -1
  217. package/src/components/DrawerLayout.tsx +8 -2
  218. package/src/components/GestureHandlerButton.tsx +7 -4
  219. package/src/components/Swipeable.tsx +28 -22
  220. package/src/fabric/RNGestureHandlerButtonNativeComponent.js +27 -0
  221. package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +19 -0
  222. package/src/getShadowNodeFromRef.ts +19 -0
  223. package/src/getShadowNodeFromRef.web.ts +7 -0
  224. package/src/handlers/FlingGestureHandler.ts +3 -1
  225. package/src/handlers/ForceTouchGestureHandler.ts +8 -2
  226. package/src/handlers/LongPressGestureHandler.ts +5 -3
  227. package/src/handlers/NativeViewGestureHandler.ts +3 -1
  228. package/src/handlers/PanGestureHandler.ts +5 -3
  229. package/src/handlers/PinchGestureHandler.ts +3 -1
  230. package/src/handlers/RotationGestureHandler.ts +3 -1
  231. package/src/handlers/TapGestureHandler.ts +3 -1
  232. package/src/handlers/createHandler.ts +80 -5
  233. package/src/handlers/createNativeWrapper.tsx +7 -1
  234. package/src/handlers/gestureHandlerCommon.ts +2 -5
  235. package/src/handlers/gestures/GestureDetector.tsx +110 -37
  236. package/src/handlers/gestures/eventReceiver.ts +23 -19
  237. package/src/handlers/gestures/forceTouchGesture.ts +1 -1
  238. package/src/handlers/gestures/gesture.ts +21 -1
  239. package/src/handlers/gestures/gestureStateManager.ts +9 -12
  240. package/src/handlers/gestures/panGesture.ts +1 -1
  241. package/src/handlers/gestures/pinchGesture.ts +1 -1
  242. package/src/handlers/gestures/reanimatedWrapper.ts +4 -1
  243. package/src/handlers/handlersRegistry.ts +44 -6
  244. package/src/index.ts +15 -11
  245. package/src/init.ts +6 -0
  246. package/src/jestUtils.ts +506 -0
  247. package/src/utils.ts +38 -0
  248. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +0 -18
  249. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +0 -21
  250. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +0 -17
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ import { initialize } from './init';
2
2
 
3
3
  export { Directions } from './Directions';
4
4
  export { State } from './State';
5
+ export { getByGestureTestId, fireGestureHandler } from './jestUtils';
5
6
  export { default as gestureHandlerRootHOC } from './gestureHandlerRootHOC';
6
7
  export { default as GestureHandlerRootView } from './GestureHandlerRootView';
7
8
  export type {
@@ -27,6 +28,7 @@ export type {
27
28
  ForceTouchGestureHandlerEventPayload,
28
29
  ForceTouchGestureHandlerProps,
29
30
  } from './handlers/ForceTouchGestureHandler';
31
+ export type { ForceTouchGestureChangeEventPayload } from './handlers/gestures/forceTouchGesture';
30
32
  export type {
31
33
  LongPressGestureHandlerEventPayload,
32
34
  LongPressGestureHandlerProps,
@@ -35,10 +37,12 @@ export type {
35
37
  PanGestureHandlerEventPayload,
36
38
  PanGestureHandlerProps,
37
39
  } from './handlers/PanGestureHandler';
40
+ export type { PanGestureChangeEventPayload } from './handlers/gestures/panGesture';
38
41
  export type {
39
42
  PinchGestureHandlerEventPayload,
40
43
  PinchGestureHandlerProps,
41
44
  } from './handlers/PinchGestureHandler';
45
+ export type { PinchGestureChangeEventPayload } from './handlers/gestures/pinchGesture';
42
46
  export type {
43
47
  RotationGestureHandlerEventPayload,
44
48
  RotationGestureHandlerProps,
@@ -61,22 +65,22 @@ export type {
61
65
  } from './handlers/NativeViewGestureHandler';
62
66
  export { GestureDetector } from './handlers/gestures/GestureDetector';
63
67
  export { GestureObjects as Gesture } from './handlers/gestures/gestureObjects';
64
- export { TapGestureType as TapGesture } from './handlers/gestures/tapGesture';
65
- export { PanGestureType as PanGesture } from './handlers/gestures/panGesture';
66
- export { FlingGestureType as FlingGesture } from './handlers/gestures/flingGesture';
67
- export { LongPressGestureType as LongPressGesture } from './handlers/gestures/longPressGesture';
68
- export { PinchGestureType as PinchGesture } from './handlers/gestures/pinchGesture';
69
- export { RotationGestureType as RotationGesture } from './handlers/gestures/rotationGesture';
70
- export { ForceTouchGestureType as ForceTouchGesture } from './handlers/gestures/forceTouchGesture';
71
- export { NativeGestureType as NativeGesture } from './handlers/gestures/nativeGesture';
72
- export { ManualGestureType as ManualGesture } from './handlers/gestures/manualGesture';
73
- export {
68
+ export type { TapGestureType as TapGesture } from './handlers/gestures/tapGesture';
69
+ export type { PanGestureType as PanGesture } from './handlers/gestures/panGesture';
70
+ export type { FlingGestureType as FlingGesture } from './handlers/gestures/flingGesture';
71
+ export type { LongPressGestureType as LongPressGesture } from './handlers/gestures/longPressGesture';
72
+ export type { PinchGestureType as PinchGesture } from './handlers/gestures/pinchGesture';
73
+ export type { RotationGestureType as RotationGesture } from './handlers/gestures/rotationGesture';
74
+ export type { ForceTouchGestureType as ForceTouchGesture } from './handlers/gestures/forceTouchGesture';
75
+ export type { NativeGestureType as NativeGesture } from './handlers/gestures/nativeGesture';
76
+ export type { ManualGestureType as ManualGesture } from './handlers/gestures/manualGesture';
77
+ export type {
74
78
  ComposedGestureType as ComposedGesture,
75
79
  RaceGestureType as RaceGesture,
76
80
  SimultaneousGestureType as SimultaneousGesture,
77
81
  ExclusiveGestureType as ExclusiveGesture,
78
82
  } from './handlers/gestures/gestureComposition';
79
- export { GestureStateManagerType as GestureStateManager } from './handlers/gestures/gestureStateManager';
83
+ export type { GestureStateManagerType as GestureStateManager } from './handlers/gestures/gestureStateManager';
80
84
  export { NativeViewGestureHandler } from './handlers/NativeViewGestureHandler';
81
85
  export type {
82
86
  RawButtonProps,
package/src/init.ts CHANGED
@@ -1,5 +1,11 @@
1
1
  import { startListening } from './handlers/gestures/eventReceiver';
2
+ import RNGestureHandlerModule from './RNGestureHandlerModule';
3
+ import { isFabric } from './utils';
2
4
 
3
5
  export function initialize() {
4
6
  startListening();
7
+
8
+ if (isFabric()) {
9
+ RNGestureHandlerModule.install();
10
+ }
5
11
  }
@@ -0,0 +1,506 @@
1
+ import invariant from 'invariant';
2
+ import { DeviceEventEmitter } from 'react-native';
3
+ import { ReactTestInstance } from 'react-test-renderer';
4
+ import {
5
+ FlingGestureHandler,
6
+ FlingGestureHandlerEventPayload,
7
+ flingHandlerName,
8
+ } from './handlers/FlingGestureHandler';
9
+ import {
10
+ ForceTouchGestureHandler,
11
+ ForceTouchGestureHandlerEventPayload,
12
+ forceTouchHandlerName,
13
+ } from './handlers/ForceTouchGestureHandler';
14
+ import {
15
+ BaseGestureHandlerProps,
16
+ GestureEvent,
17
+ HandlerStateChangeEvent,
18
+ } from './handlers/gestureHandlerCommon';
19
+ import { FlingGesture } from './handlers/gestures/flingGesture';
20
+ import { ForceTouchGesture } from './handlers/gestures/forceTouchGesture';
21
+ import { BaseGesture, GestureType } from './handlers/gestures/gesture';
22
+ import { LongPressGesture } from './handlers/gestures/longPressGesture';
23
+ import { NativeGesture } from './handlers/gestures/nativeGesture';
24
+ import { PanGesture } from './handlers/gestures/panGesture';
25
+ import { PinchGesture } from './handlers/gestures/pinchGesture';
26
+ import { RotationGesture } from './handlers/gestures/rotationGesture';
27
+ import { TapGesture } from './handlers/gestures/tapGesture';
28
+ import { findHandlerByTestID } from './handlers/handlersRegistry';
29
+ import {
30
+ LongPressGestureHandler,
31
+ LongPressGestureHandlerEventPayload,
32
+ longPressHandlerName,
33
+ } from './handlers/LongPressGestureHandler';
34
+ import {
35
+ NativeViewGestureHandler,
36
+ NativeViewGestureHandlerPayload,
37
+ nativeViewHandlerName,
38
+ } from './handlers/NativeViewGestureHandler';
39
+ import {
40
+ PanGestureHandler,
41
+ PanGestureHandlerEventPayload,
42
+ panHandlerName,
43
+ } from './handlers/PanGestureHandler';
44
+ import {
45
+ PinchGestureHandler,
46
+ PinchGestureHandlerEventPayload,
47
+ pinchHandlerName,
48
+ } from './handlers/PinchGestureHandler';
49
+ import {
50
+ RotationGestureHandler,
51
+ RotationGestureHandlerEventPayload,
52
+ rotationHandlerName,
53
+ } from './handlers/RotationGestureHandler';
54
+ import {
55
+ TapGestureHandler,
56
+ TapGestureHandlerEventPayload,
57
+ tapHandlerName,
58
+ } from './handlers/TapGestureHandler';
59
+ import { State } from './State';
60
+ import { hasProperty, withPrevAndCurrent } from './utils';
61
+
62
+ // load fireEvent conditionally, so RNGH may be used in setups without testing-library
63
+ let fireEvent = (
64
+ _element: ReactTestInstance,
65
+ _name: string,
66
+ ..._data: any[]
67
+ ) => {
68
+ // NOOP
69
+ };
70
+
71
+ try {
72
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
73
+ fireEvent = require('@testing-library/react-native').fireEvent;
74
+ } catch (_e) {
75
+ // do nothing if not available
76
+ }
77
+
78
+ type GestureHandlerTestEvent<
79
+ TEventPayload extends Record<string, unknown> = Record<string, unknown>
80
+ > = (
81
+ | GestureEvent<TEventPayload>
82
+ | HandlerStateChangeEvent<TEventPayload>
83
+ )['nativeEvent'];
84
+
85
+ type HandlerNames = keyof DefaultEventsMapping;
86
+
87
+ type WithNumberOfPointers<T> = {
88
+ [P in keyof T]: T[P] & { numberOfPointers: number };
89
+ };
90
+ type DefaultEventsMapping = WithNumberOfPointers<{
91
+ [flingHandlerName]: FlingGestureHandlerEventPayload;
92
+ [forceTouchHandlerName]: ForceTouchGestureHandlerEventPayload;
93
+ [longPressHandlerName]: LongPressGestureHandlerEventPayload;
94
+ [nativeViewHandlerName]: NativeViewGestureHandlerPayload;
95
+ [panHandlerName]: PanGestureHandlerEventPayload;
96
+ [pinchHandlerName]: PinchGestureHandlerEventPayload;
97
+ [rotationHandlerName]: RotationGestureHandlerEventPayload;
98
+ [tapHandlerName]: TapGestureHandlerEventPayload;
99
+ }>;
100
+
101
+ const handlersDefaultEvents: DefaultEventsMapping = {
102
+ [flingHandlerName]: {
103
+ x: 0,
104
+ y: 0,
105
+ absoluteX: 0,
106
+ absoluteY: 0,
107
+ numberOfPointers: 1,
108
+ },
109
+ [forceTouchHandlerName]: {
110
+ x: 0,
111
+ y: 0,
112
+ absoluteX: 0,
113
+ absoluteY: 0,
114
+ force: 1,
115
+ numberOfPointers: 1,
116
+ },
117
+ [longPressHandlerName]: {
118
+ x: 0,
119
+ y: 0,
120
+ absoluteX: 0,
121
+ absoluteY: 0,
122
+ duration: 100,
123
+ numberOfPointers: 1,
124
+ },
125
+ [nativeViewHandlerName]: {
126
+ pointerInside: true,
127
+ numberOfPointers: 1,
128
+ },
129
+ [panHandlerName]: {
130
+ x: 0,
131
+ y: 0,
132
+ absoluteX: 0,
133
+ absoluteY: 0,
134
+ translationX: 100,
135
+ translationY: 0,
136
+ velocityX: 3,
137
+ velocityY: 0,
138
+ numberOfPointers: 1,
139
+ },
140
+ [pinchHandlerName]: {
141
+ focalX: 0,
142
+ focalY: 0,
143
+ scale: 2,
144
+ velocity: 1,
145
+ numberOfPointers: 2,
146
+ },
147
+ [rotationHandlerName]: {
148
+ anchorX: 0,
149
+ anchorY: 0,
150
+ rotation: 3.14,
151
+ velocity: 2,
152
+ numberOfPointers: 2,
153
+ },
154
+ [tapHandlerName]: {
155
+ x: 0,
156
+ y: 0,
157
+ absoluteX: 0,
158
+ absoluteY: 0,
159
+ numberOfPointers: 1,
160
+ },
161
+ };
162
+
163
+ function isGesture(
164
+ componentOrGesture: ReactTestInstance | GestureType
165
+ ): componentOrGesture is GestureType {
166
+ return componentOrGesture instanceof BaseGesture;
167
+ }
168
+
169
+ interface WrappedGestureHandlerTestEvent {
170
+ nativeEvent: GestureHandlerTestEvent;
171
+ }
172
+ function wrapWithNativeEvent(
173
+ event: GestureHandlerTestEvent
174
+ ): WrappedGestureHandlerTestEvent {
175
+ return { nativeEvent: event };
176
+ }
177
+
178
+ function fillOldStateChanges(
179
+ previousEvent: GestureHandlerTestEvent | null,
180
+ currentEvent: Omit<GestureHandlerTestEvent, 'oldState'>
181
+ ): GestureHandlerTestEvent {
182
+ const isFirstEvent = previousEvent === null;
183
+ if (isFirstEvent) {
184
+ return {
185
+ oldState: State.UNDETERMINED,
186
+ ...currentEvent,
187
+ } as GestureHandlerTestEvent;
188
+ }
189
+
190
+ const isGestureStateEvent = previousEvent.state !== currentEvent.state;
191
+ if (isGestureStateEvent) {
192
+ return {
193
+ oldState: previousEvent?.state,
194
+ ...currentEvent,
195
+ } as GestureHandlerTestEvent;
196
+ } else {
197
+ return currentEvent as GestureHandlerTestEvent;
198
+ }
199
+ }
200
+
201
+ type EventWithStates = Partial<
202
+ Pick<GestureHandlerTestEvent, 'oldState' | 'state'>
203
+ >;
204
+ function validateStateTransitions(
205
+ previousEvent: EventWithStates | null,
206
+ currentEvent: EventWithStates
207
+ ) {
208
+ function stringify(event: Record<string, unknown> | null) {
209
+ return JSON.stringify(event, null, 2);
210
+ }
211
+ function errorMsgWithBothEvents(description: string) {
212
+ return `${description}, invalid event: ${stringify(
213
+ currentEvent
214
+ )}, previous event: ${stringify(previousEvent)}`;
215
+ }
216
+
217
+ function errorMsgWithCurrentEvent(description: string) {
218
+ return `${description}, invalid event: ${stringify(currentEvent)}`;
219
+ }
220
+
221
+ invariant(
222
+ hasProperty(currentEvent, 'state'),
223
+ errorMsgWithCurrentEvent('every event must have state')
224
+ );
225
+
226
+ const isFirstEvent = previousEvent === null;
227
+ if (isFirstEvent) {
228
+ invariant(
229
+ currentEvent.state === State.BEGAN,
230
+ errorMsgWithCurrentEvent('first event must have BEGAN state')
231
+ );
232
+ }
233
+
234
+ if (previousEvent !== null) {
235
+ if (previousEvent.state !== currentEvent.state) {
236
+ invariant(
237
+ hasProperty(currentEvent, 'oldState'),
238
+ errorMsgWithCurrentEvent(
239
+ 'when state changes, oldState field should be present'
240
+ )
241
+ );
242
+ invariant(
243
+ currentEvent.oldState === previousEvent.state,
244
+ errorMsgWithBothEvents(
245
+ "when state changes, oldState should be the same as previous event' state"
246
+ )
247
+ );
248
+ }
249
+ }
250
+
251
+ return currentEvent;
252
+ }
253
+
254
+ type EventWithoutStates = Omit<GestureHandlerTestEvent, 'oldState' | 'state'>;
255
+ interface HandlerInfo {
256
+ handlerType: HandlerNames;
257
+ handlerTag: number;
258
+ }
259
+ function fillMissingDefaultsFor({
260
+ handlerType,
261
+ handlerTag,
262
+ }: HandlerInfo): (
263
+ event: Partial<GestureHandlerTestEvent>
264
+ ) => EventWithoutStates {
265
+ return (event) => {
266
+ return {
267
+ ...handlersDefaultEvents[handlerType],
268
+ ...event,
269
+ handlerTag,
270
+ };
271
+ };
272
+ }
273
+
274
+ function isDiscreteHandler(handlerType: HandlerNames) {
275
+ return (
276
+ handlerType === 'TapGestureHandler' ||
277
+ handlerType === 'LongPressGestureHandler'
278
+ );
279
+ }
280
+
281
+ function fillMissingStatesTransitions(
282
+ events: EventWithoutStates[],
283
+ isDiscreteHandler: boolean
284
+ ): EventWithoutStates[] {
285
+ type Event = EventWithoutStates | null;
286
+ const _events = [...events];
287
+ const lastEvent = _events[_events.length - 1] ?? null;
288
+ const firstEvent = _events[0] ?? null;
289
+
290
+ const shouldDuplicateFirstEvent =
291
+ !isDiscreteHandler && !hasState(State.BEGAN)(firstEvent);
292
+ if (shouldDuplicateFirstEvent) {
293
+ const duplicated = { ...firstEvent, state: State.BEGAN };
294
+ // @ts-ignore badly typed, property may exist and we don't want to copy it
295
+ delete duplicated.oldState;
296
+ _events.unshift(duplicated);
297
+ }
298
+
299
+ const shouldDuplicateLastEvent =
300
+ !hasState(State.END)(lastEvent) ||
301
+ !hasState(State.FAILED)(lastEvent) ||
302
+ !hasState(State.CANCELLED)(lastEvent);
303
+
304
+ if (shouldDuplicateLastEvent) {
305
+ const duplicated = { ...lastEvent, state: State.END };
306
+ // @ts-ignore badly typed, property may exist and we don't want to copy it
307
+ delete duplicated.oldState;
308
+ _events.push(duplicated);
309
+ }
310
+
311
+ function isWithoutState(event: Event) {
312
+ return event !== null && !hasProperty(event, 'state');
313
+ }
314
+ function hasState(state: State) {
315
+ return (event: Event) => event !== null && event.state === state;
316
+ }
317
+ function noEventsLeft(event: Event) {
318
+ return event === null;
319
+ }
320
+
321
+ function trueFn() {
322
+ return true;
323
+ }
324
+ interface Args {
325
+ shouldConsumeEvent?: (event: Event) => boolean;
326
+ shouldTransitionToNextState?: (nextEvent: Event) => boolean;
327
+ }
328
+ function fillEventsForCurrentState({
329
+ shouldConsumeEvent = trueFn,
330
+ shouldTransitionToNextState = trueFn,
331
+ }: Args) {
332
+ function peekCurrentEvent(): Event {
333
+ return _events[0] ?? null;
334
+ }
335
+ function peekNextEvent(): Event {
336
+ return _events[1] ?? null;
337
+ }
338
+ function consumeCurrentEvent() {
339
+ _events.shift();
340
+ }
341
+ const currentEvent = peekCurrentEvent();
342
+ const nextEvent = peekNextEvent();
343
+ const currentRequiredState = REQUIRED_EVENTS[currentStateIdx];
344
+
345
+ let eventData = {};
346
+ const shouldUseEvent = shouldConsumeEvent(currentEvent);
347
+ if (shouldUseEvent) {
348
+ eventData = currentEvent!;
349
+ consumeCurrentEvent();
350
+ }
351
+ transformedEvents.push({ state: currentRequiredState, ...eventData });
352
+ if (shouldTransitionToNextState(nextEvent)) {
353
+ currentStateIdx++;
354
+ }
355
+ }
356
+
357
+ const REQUIRED_EVENTS = [State.BEGAN, State.ACTIVE, State.END];
358
+
359
+ let currentStateIdx = 0;
360
+ const transformedEvents: EventWithoutStates[] = [];
361
+ let hasAllStates;
362
+ let iterations = 0;
363
+ do {
364
+ const nextRequiredState = REQUIRED_EVENTS[currentStateIdx];
365
+ if (nextRequiredState === State.BEGAN) {
366
+ fillEventsForCurrentState({
367
+ shouldConsumeEvent: (e: Event) =>
368
+ isWithoutState(e) || hasState(State.BEGAN)(e),
369
+ });
370
+ } else if (nextRequiredState === State.ACTIVE) {
371
+ const shouldConsumeEvent = (e: Event) =>
372
+ isWithoutState(e) || hasState(State.ACTIVE)(e);
373
+ const shouldTransitionToNextState = (nextEvent: Event) =>
374
+ noEventsLeft(nextEvent) ||
375
+ hasState(State.END)(nextEvent) ||
376
+ hasState(State.FAILED)(nextEvent) ||
377
+ hasState(State.CANCELLED)(nextEvent);
378
+
379
+ fillEventsForCurrentState({
380
+ shouldConsumeEvent,
381
+ shouldTransitionToNextState,
382
+ });
383
+ } else if (nextRequiredState === State.END) {
384
+ fillEventsForCurrentState({});
385
+ }
386
+ hasAllStates = currentStateIdx === REQUIRED_EVENTS.length;
387
+
388
+ invariant(
389
+ iterations++ <= 500,
390
+ 'exceeded max number of iterations, please report a bug in RNGH repository with your test case'
391
+ );
392
+ } while (!hasAllStates);
393
+
394
+ return transformedEvents;
395
+ }
396
+
397
+ type EventEmitter = (
398
+ eventName: string,
399
+ args: { nativeEvent: GestureHandlerTestEvent }
400
+ ) => void;
401
+ interface HandlerData {
402
+ emitEvent: EventEmitter;
403
+ handlerType: HandlerNames;
404
+ handlerTag: number;
405
+ }
406
+ function getHandlerData(
407
+ componentOrGesture: ReactTestInstance | GestureType
408
+ ): HandlerData {
409
+ if (isGesture(componentOrGesture)) {
410
+ const gesture = componentOrGesture;
411
+ return {
412
+ emitEvent: (eventName, args) => {
413
+ DeviceEventEmitter.emit(eventName, args.nativeEvent);
414
+ },
415
+ handlerType: gesture.handlerName as HandlerNames,
416
+ handlerTag: gesture.handlerTag,
417
+ };
418
+ }
419
+ const gestureHandlerComponent = componentOrGesture;
420
+ return {
421
+ emitEvent: (eventName, args) => {
422
+ fireEvent(gestureHandlerComponent, eventName, args);
423
+ },
424
+ handlerType: gestureHandlerComponent.props.handlerType as HandlerNames,
425
+ handlerTag: gestureHandlerComponent.props.handlerTag as number,
426
+ };
427
+ }
428
+ type AllGestures =
429
+ | TapGesture
430
+ | PanGesture
431
+ | LongPressGesture
432
+ | RotationGesture
433
+ | PinchGesture
434
+ | FlingGesture
435
+ | ForceTouchGesture
436
+ | NativeGesture;
437
+
438
+ type AllHandlers =
439
+ | TapGestureHandler
440
+ | PanGestureHandler
441
+ | LongPressGestureHandler
442
+ | RotationGestureHandler
443
+ | PinchGestureHandler
444
+ | FlingGestureHandler
445
+ | ForceTouchGestureHandler
446
+ | NativeViewGestureHandler;
447
+
448
+ // prettier-ignore
449
+ type ClassComponentConstructor<P> = new (props: P) => React.Component<P, any, any>;
450
+
451
+ type ExtractPayloadFromProps<T> = T extends BaseGestureHandlerProps<
452
+ infer TPayload
453
+ >
454
+ ? TPayload
455
+ : never;
456
+
457
+ type ExtractConfig<T> = T extends BaseGesture<infer TGesturePayload>
458
+ ? TGesturePayload
459
+ : T extends ClassComponentConstructor<infer THandlerProps>
460
+ ? ExtractPayloadFromProps<THandlerProps>
461
+ : Record<string, unknown>;
462
+
463
+ export function fireGestureHandler<THandler extends AllGestures | AllHandlers>(
464
+ componentOrGesture: ReactTestInstance | GestureType,
465
+ eventList: Partial<GestureHandlerTestEvent<ExtractConfig<THandler>>>[] = []
466
+ ): void {
467
+ const { emitEvent, handlerType, handlerTag } = getHandlerData(
468
+ componentOrGesture
469
+ );
470
+
471
+ let _ = fillMissingStatesTransitions(
472
+ eventList,
473
+ isDiscreteHandler(handlerType)
474
+ );
475
+ _ = _.map(fillMissingDefaultsFor({ handlerTag, handlerType }));
476
+ _ = withPrevAndCurrent(_, fillOldStateChanges);
477
+ _ = withPrevAndCurrent(_, validateStateTransitions);
478
+ // @ts-ignore TODO
479
+ _ = _.map(wrapWithNativeEvent);
480
+
481
+ const events = (_ as unknown) as WrappedGestureHandlerTestEvent[];
482
+
483
+ const firstEvent = events.shift()!;
484
+
485
+ emitEvent('onGestureHandlerStateChange', firstEvent);
486
+ let lastSentEvent = firstEvent;
487
+ for (const event of events) {
488
+ const hasChangedState =
489
+ lastSentEvent.nativeEvent.state !== event.nativeEvent.state;
490
+
491
+ if (hasChangedState) {
492
+ emitEvent('onGestureHandlerStateChange', event);
493
+ } else {
494
+ emitEvent('onGestureHandlerEvent', event);
495
+ }
496
+ lastSentEvent = event;
497
+ }
498
+ }
499
+
500
+ export function getByGestureTestId(testID: string) {
501
+ const handler = findHandlerByTestID(testID);
502
+ if (handler === null) {
503
+ throw new Error(`Handler with id: '${testID}' cannot be found`);
504
+ }
505
+ return handler;
506
+ }
package/src/utils.ts CHANGED
@@ -5,3 +5,41 @@ export function toArray<T>(object: T | T[]): T[] {
5
5
 
6
6
  return object;
7
7
  }
8
+
9
+ export type withPrevAndCurrentMapFn<T, Transformed> = (
10
+ previous: Transformed | null,
11
+ current: T
12
+ ) => Transformed;
13
+ export function withPrevAndCurrent<T, Transformed>(
14
+ array: T[],
15
+ mapFn: withPrevAndCurrentMapFn<T, Transformed>
16
+ ): Transformed[] {
17
+ const previousArr: (null | Transformed)[] = [null];
18
+ const currentArr = [...array];
19
+ const transformedArr: Transformed[] = [];
20
+ currentArr.forEach((current, i) => {
21
+ const previous = previousArr[i];
22
+ const transformed = mapFn(previous, current);
23
+ previousArr.push(transformed);
24
+ transformedArr.push(transformed);
25
+ });
26
+ return transformedArr;
27
+ }
28
+
29
+ // eslint-disable-next-line @typescript-eslint/ban-types
30
+ export function hasProperty(object: object, key: string) {
31
+ return Object.prototype.hasOwnProperty.call(object, key);
32
+ }
33
+
34
+ export function isJestEnv(): boolean {
35
+ return hasProperty(global, 'process') && !!process.env.JEST_WORKER_ID;
36
+ }
37
+
38
+ export function tagMessage(msg: string) {
39
+ return `[react-native-gesture-handler] ${msg}`;
40
+ }
41
+
42
+ export function isFabric(): boolean {
43
+ // @ts-expect-error nativeFabricUIManager is not yet included in the RN types
44
+ return !!global?.nativeFabricUIManager;
45
+ }
@@ -1,18 +0,0 @@
1
- package com.swmansion.gesturehandler
2
-
3
- abstract class BaseGestureHandlerInteractionController : GestureHandlerInteractionController {
4
- override fun shouldWaitForHandlerFailure(
5
- handler: GestureHandler<*>,
6
- otherHandler: GestureHandler<*>,
7
- ) = false
8
-
9
- override fun shouldRequireHandlerToWaitForFailure(
10
- handler: GestureHandler<*>,
11
- otherHandler: GestureHandler<*>,
12
- ) = false
13
-
14
- override fun shouldRecognizeSimultaneously(
15
- handler: GestureHandler<*>,
16
- otherHandler: GestureHandler<*>,
17
- ) = false
18
- }
@@ -1,21 +0,0 @@
1
- package com.swmansion.gesturehandler
2
-
3
- import android.view.View
4
- import java.util.*
5
-
6
- class GestureHandlerRegistryImpl : GestureHandlerRegistry {
7
- private val handlers = WeakHashMap<View?, ArrayList<GestureHandler<*>>>()
8
- fun <T : GestureHandler<*>> registerHandlerForView(view: View?, handler: T): T {
9
- var listToAdd = handlers[view]
10
- if (listToAdd == null) {
11
- listToAdd = ArrayList(1)
12
- listToAdd.add(handler)
13
- handlers[view] = listToAdd
14
- } else {
15
- listToAdd.add(handler)
16
- }
17
- return handler
18
- }
19
-
20
- override fun getHandlersForView(view: View) = handlers[view]
21
- }
@@ -1,17 +0,0 @@
1
- package com.swmansion.gesturehandler.react
2
-
3
- import com.facebook.react.ReactPackage
4
- import com.facebook.react.bridge.NativeModule
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.uimanager.ViewManager
7
- import java.util.*
8
-
9
- class RNGestureHandlerPackage : ReactPackage {
10
- override fun createNativeModules(reactContext: ReactApplicationContext) =
11
- listOf<NativeModule>(RNGestureHandlerModule(reactContext))
12
-
13
- override fun createViewManagers(reactContext: ReactApplicationContext) =
14
- listOf<ViewManager<*, *>>(
15
- RNGestureHandlerRootViewManager(),
16
- RNGestureHandlerButtonViewManager())
17
- }