react-native-gesture-handler 2.2.0 → 2.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -1
  3. package/RNGestureHandler.podspec +27 -3
  4. package/android/build.gradle +81 -8
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +5 -1
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +14 -12
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +2 -4
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/ScaleGestureDetector.java +558 -0
  9. package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +29 -0
  10. package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +12 -0
  11. package/android/src/main/AndroidManifest.xml +1 -1
  12. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +29 -0
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +40 -13
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +111 -47
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +9 -4
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +17 -2
  18. package/android/src/main/jni/Android.mk +53 -0
  19. package/android/src/main/jni/OnLoad.cpp +9 -0
  20. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +71 -0
  21. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +34 -0
  22. package/android/src/main/jni/cpp-adapter.cpp +41 -0
  23. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +47 -0
  24. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +22 -0
  25. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +25 -0
  26. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +16 -0
  27. package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +13 -0
  28. package/ios/Handlers/RNFlingHandler.m +2 -0
  29. package/ios/Handlers/RNPanHandler.m +2 -0
  30. package/ios/Handlers/RNPinchHandler.m +2 -0
  31. package/ios/Handlers/RNRotationHandler.m +2 -0
  32. package/ios/RNGestureHandler.h +3 -8
  33. package/ios/RNGestureHandler.m +2 -10
  34. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  35. package/ios/RNGestureHandlerActionType.h +8 -0
  36. package/ios/RNGestureHandlerButtonComponentView.h +17 -0
  37. package/ios/RNGestureHandlerButtonComponentView.mm +48 -0
  38. package/ios/RNGestureHandlerButtonManager.h +5 -0
  39. package/ios/RNGestureHandlerButtonManager.m +30 -0
  40. package/ios/RNGestureHandlerManager.h +2 -4
  41. package/ios/{RNGestureHandlerManager.m → RNGestureHandlerManager.mm} +92 -20
  42. package/ios/{RNGestureHandlerModule.m → RNGestureHandlerModule.mm} +91 -36
  43. package/ios/RNGestureHandlerRegistry.h +1 -2
  44. package/ios/RNGestureHandlerRegistry.m +2 -11
  45. package/ios/RNGestureHandlerRootViewComponentView.mm +21 -0
  46. package/jest-utils/package.json +6 -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/components/touchables/TouchableOpacity.js +3 -1
  64. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  65. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +21 -0
  66. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  67. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +21 -0
  68. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  69. package/lib/commonjs/getShadowNodeFromRef.js +24 -0
  70. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -0
  71. package/lib/commonjs/getShadowNodeFromRef.web.js +15 -0
  72. package/lib/commonjs/getShadowNodeFromRef.web.js.map +1 -0
  73. package/lib/commonjs/handlers/FlingGestureHandler.js +4 -2
  74. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -1
  75. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +8 -4
  76. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  77. package/lib/commonjs/handlers/LongPressGestureHandler.js +4 -2
  78. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  79. package/lib/commonjs/handlers/NativeViewGestureHandler.js +4 -2
  80. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  81. package/lib/commonjs/handlers/PanGestureHandler.js +4 -2
  82. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  83. package/lib/commonjs/handlers/PinchGestureHandler.js +4 -2
  84. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -1
  85. package/lib/commonjs/handlers/RotationGestureHandler.js +4 -2
  86. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -1
  87. package/lib/commonjs/handlers/TapGestureHandler.js +4 -2
  88. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -1
  89. package/lib/commonjs/handlers/createHandler.js +63 -9
  90. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  91. package/lib/commonjs/handlers/createNativeWrapper.js +6 -2
  92. package/lib/commonjs/handlers/createNativeWrapper.js.map +1 -1
  93. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  94. package/lib/commonjs/handlers/gestures/GestureDetector.js +84 -32
  95. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  96. package/lib/commonjs/handlers/gestures/eventReceiver.js +25 -8
  97. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  98. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  99. package/lib/commonjs/handlers/gestures/gesture.js +16 -1
  100. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  101. package/lib/commonjs/handlers/gestures/gestureStateManager.js +7 -4
  102. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  103. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  104. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
  105. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +4 -1
  106. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  107. package/lib/commonjs/handlers/handlersRegistry.js +42 -6
  108. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -1
  109. package/lib/commonjs/index.js.map +1 -1
  110. package/lib/commonjs/init.js +10 -0
  111. package/lib/commonjs/init.js.map +1 -1
  112. package/lib/commonjs/jestUtils/index.js +20 -0
  113. package/lib/commonjs/jestUtils/index.js.map +1 -0
  114. package/lib/commonjs/jestUtils/jestUtils.js +375 -0
  115. package/lib/commonjs/jestUtils/jestUtils.js.map +1 -0
  116. package/lib/commonjs/utils.js +38 -0
  117. package/lib/commonjs/utils.js.map +1 -1
  118. package/lib/module/ActionType.js +7 -0
  119. package/lib/module/ActionType.js.map +1 -0
  120. package/lib/module/GestureHandlerRootView.android.js +5 -6
  121. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  122. package/lib/module/GestureHandlerRootView.js +2 -3
  123. package/lib/module/GestureHandlerRootView.js.map +1 -1
  124. package/lib/module/RNGestureHandlerModule.js +3 -2
  125. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  126. package/lib/module/RNGestureHandlerModule.web.js +1 -1
  127. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  128. package/lib/module/components/DrawerLayout.js +2 -2
  129. package/lib/module/components/DrawerLayout.js.map +1 -1
  130. package/lib/module/components/GestureHandlerButton.js +4 -2
  131. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  132. package/lib/module/components/Swipeable.js +22 -20
  133. package/lib/module/components/Swipeable.js.map +1 -1
  134. package/lib/module/components/touchables/TouchableOpacity.js +4 -2
  135. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  136. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +9 -0
  137. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -0
  138. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +9 -0
  139. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -0
  140. package/lib/module/getShadowNodeFromRef.js +17 -0
  141. package/lib/module/getShadowNodeFromRef.js.map +1 -0
  142. package/lib/module/getShadowNodeFromRef.web.js +8 -0
  143. package/lib/module/getShadowNodeFromRef.web.js.map +1 -0
  144. package/lib/module/handlers/FlingGestureHandler.js +2 -1
  145. package/lib/module/handlers/FlingGestureHandler.js.map +1 -1
  146. package/lib/module/handlers/ForceTouchGestureHandler.js +5 -3
  147. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  148. package/lib/module/handlers/LongPressGestureHandler.js +2 -1
  149. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  150. package/lib/module/handlers/NativeViewGestureHandler.js +2 -1
  151. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  152. package/lib/module/handlers/PanGestureHandler.js +2 -1
  153. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  154. package/lib/module/handlers/PinchGestureHandler.js +2 -1
  155. package/lib/module/handlers/PinchGestureHandler.js.map +1 -1
  156. package/lib/module/handlers/RotationGestureHandler.js +2 -1
  157. package/lib/module/handlers/RotationGestureHandler.js.map +1 -1
  158. package/lib/module/handlers/TapGestureHandler.js +2 -1
  159. package/lib/module/handlers/TapGestureHandler.js.map +1 -1
  160. package/lib/module/handlers/createHandler.js +62 -10
  161. package/lib/module/handlers/createHandler.js.map +1 -1
  162. package/lib/module/handlers/createNativeWrapper.js +6 -2
  163. package/lib/module/handlers/createNativeWrapper.js.map +1 -1
  164. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  165. package/lib/module/handlers/gestures/GestureDetector.js +79 -32
  166. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  167. package/lib/module/handlers/gestures/eventReceiver.js +25 -7
  168. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  169. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  170. package/lib/module/handlers/gestures/gesture.js +16 -1
  171. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  172. package/lib/module/handlers/gestures/gestureStateManager.js +6 -4
  173. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  174. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  175. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
  176. package/lib/module/handlers/gestures/reanimatedWrapper.js +2 -1
  177. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  178. package/lib/module/handlers/handlersRegistry.js +34 -6
  179. package/lib/module/handlers/handlersRegistry.js.map +1 -1
  180. package/lib/module/index.js.map +1 -1
  181. package/lib/module/init.js +6 -0
  182. package/lib/module/init.js.map +1 -1
  183. package/lib/module/jestUtils/index.js +2 -0
  184. package/lib/module/jestUtils/index.js.map +1 -0
  185. package/lib/module/jestUtils/jestUtils.js +350 -0
  186. package/lib/module/jestUtils/jestUtils.js.map +1 -0
  187. package/lib/module/utils.js +28 -0
  188. package/lib/module/utils.js.map +1 -1
  189. package/lib/typescript/ActionType.d.ts +7 -0
  190. package/lib/typescript/GestureHandlerRootView.android.d.ts +5 -2
  191. package/lib/typescript/GestureHandlerRootView.d.ts +1 -1
  192. package/lib/typescript/RNGestureHandlerModule.d.ts +3 -1
  193. package/lib/typescript/RNGestureHandlerModule.web.d.ts +2 -1
  194. package/lib/typescript/components/GestureHandlerButton.d.ts +2 -2
  195. package/lib/typescript/components/Swipeable.d.ts +12 -4
  196. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +5 -1
  197. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -0
  198. package/lib/typescript/getShadowNodeFromRef.web.d.ts +1 -0
  199. package/lib/typescript/handlers/FlingGestureHandler.d.ts +1 -0
  200. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -1
  201. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +1 -0
  202. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -0
  203. package/lib/typescript/handlers/PanGestureHandler.d.ts +1 -0
  204. package/lib/typescript/handlers/PinchGestureHandler.d.ts +1 -0
  205. package/lib/typescript/handlers/RotationGestureHandler.d.ts +1 -0
  206. package/lib/typescript/handlers/TapGestureHandler.d.ts +1 -0
  207. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +2 -4
  208. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +4 -1
  209. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +1 -2
  210. package/lib/typescript/handlers/gestures/gesture.d.ts +5 -0
  211. package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -2
  212. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +1 -2
  213. package/lib/typescript/handlers/handlersRegistry.d.ts +11 -3
  214. package/lib/typescript/index.d.ts +3 -0
  215. package/lib/typescript/jestUtils/index.d.ts +1 -0
  216. package/lib/typescript/jestUtils/jestUtils.d.ts +28 -0
  217. package/lib/typescript/utils.d.ts +6 -0
  218. package/lib/typescript/web/constants.d.ts +0 -1
  219. package/package.json +40 -16
  220. package/src/ActionType.ts +9 -0
  221. package/src/GestureHandlerRootView.android.tsx +14 -14
  222. package/src/GestureHandlerRootView.tsx +4 -4
  223. package/src/RNGestureHandlerModule.ts +11 -6
  224. package/src/RNGestureHandlerModule.web.ts +2 -1
  225. package/src/components/DrawerLayout.tsx +8 -2
  226. package/src/components/GestureHandlerButton.tsx +7 -4
  227. package/src/components/Swipeable.tsx +28 -22
  228. package/src/components/touchables/TouchableOpacity.tsx +6 -2
  229. package/src/fabric/RNGestureHandlerButtonNativeComponent.js +27 -0
  230. package/src/fabric/RNGestureHandlerRootViewNativeComponent.js +19 -0
  231. package/src/getShadowNodeFromRef.ts +19 -0
  232. package/src/getShadowNodeFromRef.web.ts +7 -0
  233. package/src/handlers/FlingGestureHandler.ts +3 -1
  234. package/src/handlers/ForceTouchGestureHandler.ts +8 -2
  235. package/src/handlers/LongPressGestureHandler.ts +3 -1
  236. package/src/handlers/NativeViewGestureHandler.ts +3 -1
  237. package/src/handlers/PanGestureHandler.ts +3 -1
  238. package/src/handlers/PinchGestureHandler.ts +3 -1
  239. package/src/handlers/RotationGestureHandler.ts +3 -1
  240. package/src/handlers/TapGestureHandler.ts +3 -1
  241. package/src/handlers/createHandler.ts +69 -7
  242. package/src/handlers/createNativeWrapper.tsx +7 -1
  243. package/src/handlers/gestureHandlerCommon.ts +2 -5
  244. package/src/handlers/gestures/GestureDetector.tsx +110 -37
  245. package/src/handlers/gestures/eventReceiver.ts +23 -19
  246. package/src/handlers/gestures/forceTouchGesture.ts +1 -1
  247. package/src/handlers/gestures/gesture.ts +21 -1
  248. package/src/handlers/gestures/gestureStateManager.ts +9 -12
  249. package/src/handlers/gestures/panGesture.ts +1 -1
  250. package/src/handlers/gestures/pinchGesture.ts +1 -1
  251. package/src/handlers/gestures/reanimatedWrapper.ts +4 -1
  252. package/src/handlers/handlersRegistry.ts +44 -6
  253. package/src/index.ts +3 -0
  254. package/src/init.ts +6 -0
  255. package/src/jestUtils/index.ts +1 -0
  256. package/src/jestUtils/jestUtils.ts +506 -0
  257. package/src/utils.ts +38 -0
  258. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +0 -18
  259. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +0 -21
  260. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +0 -17
@@ -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
- }