react-native-gesture-handler 1.10.3 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +7 -6
  2. package/android/build.gradle +49 -1
  3. package/android/common/src/main/java/com/swmansion/common/GestureHandlerStateManager.kt +5 -0
  4. package/android/gradle.properties +19 -0
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.kt +18 -0
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/Extensions.kt +11 -0
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +96 -0
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +713 -0
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.kt +8 -0
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +562 -0
  11. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.kt +8 -0
  12. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.kt +21 -0
  13. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +49 -0
  14. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +97 -0
  15. package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +11 -0
  16. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +129 -0
  17. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.kt +9 -0
  18. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +289 -0
  19. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +88 -0
  20. package/android/lib/src/main/java/com/swmansion/gesturehandler/{PointerEventsConfig.java → PointerEventsConfig.kt} +3 -5
  21. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.kt +125 -0
  22. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +79 -0
  23. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +167 -0
  24. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.kt +10 -0
  25. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +348 -0
  26. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +57 -0
  27. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +59 -0
  28. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +8 -0
  29. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +61 -0
  30. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +686 -0
  31. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.kt +17 -0
  32. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +95 -0
  33. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +132 -0
  34. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.kt +5 -0
  35. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +68 -0
  36. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +34 -0
  37. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +66 -0
  38. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +69 -0
  39. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +51 -0
  40. package/ios/Handlers/RNFlingHandler.m +78 -5
  41. package/ios/Handlers/RNForceTouchHandler.m +29 -4
  42. package/ios/Handlers/RNLongPressHandler.m +105 -3
  43. package/ios/Handlers/RNManualHandler.h +4 -0
  44. package/ios/Handlers/RNManualHandler.m +73 -0
  45. package/ios/Handlers/RNNativeViewHandler.m +30 -2
  46. package/ios/Handlers/RNPanHandler.m +64 -4
  47. package/ios/Handlers/RNPinchHandler.m +61 -2
  48. package/ios/Handlers/RNRotationHandler.m +60 -1
  49. package/ios/Handlers/RNTapHandler.m +55 -8
  50. package/ios/RNGestureHandler.h +18 -4
  51. package/ios/RNGestureHandler.m +123 -13
  52. package/ios/RNGestureHandlerEvents.h +9 -0
  53. package/ios/RNGestureHandlerEvents.m +34 -0
  54. package/ios/RNGestureHandlerManager.h +7 -0
  55. package/ios/RNGestureHandlerManager.m +62 -34
  56. package/ios/RNGestureHandlerModule.m +39 -3
  57. package/ios/RNGestureHandlerPointerTracker.h +25 -0
  58. package/ios/RNGestureHandlerPointerTracker.m +237 -0
  59. package/ios/RNGestureHandlerRegistry.h +1 -0
  60. package/ios/RNGestureHandlerRegistry.m +10 -0
  61. package/ios/RNGestureHandlerStateManager.h +5 -0
  62. package/ios/RNManualActivationRecognizer.h +10 -0
  63. package/ios/RNManualActivationRecognizer.m +80 -0
  64. package/ios/RNRootViewGestureRecognizer.m +1 -1
  65. package/ios/RNTouchEventType.h +9 -0
  66. package/lib/commonjs/EventType.js +16 -0
  67. package/lib/commonjs/EventType.js.map +1 -0
  68. package/lib/commonjs/GestureHandlerRootView.android.js +1 -13
  69. package/lib/commonjs/GestureHandlerRootView.android.js.map +1 -1
  70. package/lib/commonjs/GestureHandlerRootView.js +11 -3
  71. package/lib/commonjs/GestureHandlerRootView.js.map +1 -1
  72. package/lib/commonjs/RNGestureHandlerModule.js +3 -1
  73. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  74. package/lib/commonjs/RNGestureHandlerModule.web.js +2 -2
  75. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  76. package/lib/commonjs/components/DrawerLayout.js +41 -37
  77. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  78. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  79. package/lib/commonjs/components/GestureComponents.js +31 -12
  80. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  81. package/lib/commonjs/components/Swipeable.js +10 -6
  82. package/lib/commonjs/components/Swipeable.js.map +1 -1
  83. package/lib/commonjs/components/touchables/GenericTouchable.js +2 -1
  84. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  85. package/lib/commonjs/components/touchables/TouchableOpacity.js +1 -1
  86. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  87. package/lib/commonjs/gestureHandlerRootHOC.js +1 -1
  88. package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
  89. package/lib/commonjs/handlers/FlingGestureHandler.js +23 -0
  90. package/lib/commonjs/handlers/FlingGestureHandler.js.map +1 -0
  91. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +44 -0
  92. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -0
  93. package/lib/commonjs/handlers/LongPressGestureHandler.js +23 -0
  94. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -0
  95. package/lib/commonjs/handlers/NativeViewGestureHandler.js +6 -4
  96. package/lib/commonjs/handlers/NativeViewGestureHandler.js.map +1 -1
  97. package/lib/commonjs/handlers/PanGestureHandler.js +121 -0
  98. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -0
  99. package/lib/commonjs/handlers/PinchGestureHandler.js +21 -0
  100. package/lib/commonjs/handlers/PinchGestureHandler.js.map +1 -0
  101. package/lib/commonjs/handlers/RotationGestureHandler.js +21 -0
  102. package/lib/commonjs/handlers/RotationGestureHandler.js.map +1 -0
  103. package/lib/commonjs/handlers/TapGestureHandler.js +23 -0
  104. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -0
  105. package/lib/commonjs/handlers/createHandler.js +52 -83
  106. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  107. package/lib/commonjs/handlers/gestureHandlerCommon.js +80 -0
  108. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -0
  109. package/lib/commonjs/handlers/gestures/GestureDetector.js +440 -0
  110. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -0
  111. package/lib/commonjs/handlers/gestures/eventReceiver.js +135 -0
  112. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -0
  113. package/lib/commonjs/handlers/gestures/flingGesture.js +34 -0
  114. package/lib/commonjs/handlers/gestures/flingGesture.js.map +1 -0
  115. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +65 -0
  116. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -0
  117. package/lib/commonjs/handlers/gestures/gesture.js +193 -0
  118. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -0
  119. package/lib/commonjs/handlers/gestures/gestureComposition.js +94 -0
  120. package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -0
  121. package/lib/commonjs/handlers/gestures/gestureObjects.js +85 -0
  122. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -0
  123. package/lib/commonjs/handlers/gestures/gestureStateManager.js +58 -0
  124. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -0
  125. package/lib/commonjs/handlers/gestures/longPressGesture.js +34 -0
  126. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -0
  127. package/lib/commonjs/handlers/gestures/manualGesture.js +31 -0
  128. package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -0
  129. package/lib/commonjs/handlers/gestures/nativeGesture.js +34 -0
  130. package/lib/commonjs/handlers/gestures/nativeGesture.js.map +1 -0
  131. package/lib/commonjs/handlers/gestures/panGesture.js +144 -0
  132. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -0
  133. package/lib/commonjs/handlers/gestures/pinchGesture.js +45 -0
  134. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -0
  135. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +24 -0
  136. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -0
  137. package/lib/commonjs/handlers/gestures/rotationGesture.js +45 -0
  138. package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -0
  139. package/lib/commonjs/handlers/gestures/tapGesture.js +59 -0
  140. package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -0
  141. package/lib/commonjs/handlers/handlersRegistry.js +31 -0
  142. package/lib/commonjs/handlers/handlersRegistry.js.map +1 -0
  143. package/lib/commonjs/index.js +146 -8
  144. package/lib/commonjs/index.js.map +1 -1
  145. package/lib/commonjs/init.js +13 -0
  146. package/lib/commonjs/init.js.map +1 -0
  147. package/lib/commonjs/mocks.js +31 -2
  148. package/lib/commonjs/mocks.js.map +1 -1
  149. package/lib/commonjs/utils.js +15 -0
  150. package/lib/commonjs/utils.js.map +1 -0
  151. package/lib/commonjs/web/Errors.js +1 -1
  152. package/lib/commonjs/web/Errors.js.map +1 -1
  153. package/lib/commonjs/web/GestureHandler.js +4 -6
  154. package/lib/commonjs/web/GestureHandler.js.map +1 -1
  155. package/lib/commonjs/web/NodeManager.js +8 -2
  156. package/lib/commonjs/web/NodeManager.js.map +1 -1
  157. package/lib/module/EventType.js +8 -0
  158. package/lib/module/EventType.js.map +1 -0
  159. package/lib/module/GestureHandlerRootView.android.js +2 -14
  160. package/lib/module/GestureHandlerRootView.android.js.map +1 -1
  161. package/lib/module/GestureHandlerRootView.js +5 -1
  162. package/lib/module/GestureHandlerRootView.js.map +1 -1
  163. package/lib/module/RNGestureHandlerModule.js +3 -1
  164. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  165. package/lib/module/RNGestureHandlerModule.web.js +2 -2
  166. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  167. package/lib/module/components/DrawerLayout.js +43 -40
  168. package/lib/module/components/DrawerLayout.js.map +1 -1
  169. package/lib/module/components/GestureButtons.js.map +1 -1
  170. package/lib/module/components/GestureComponents.js +29 -11
  171. package/lib/module/components/GestureComponents.js.map +1 -1
  172. package/lib/module/components/Swipeable.js +9 -6
  173. package/lib/module/components/Swipeable.js.map +1 -1
  174. package/lib/module/components/touchables/GenericTouchable.js +2 -1
  175. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  176. package/lib/module/components/touchables/TouchableOpacity.js +1 -1
  177. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  178. package/lib/module/gestureHandlerRootHOC.js +1 -1
  179. package/lib/module/gestureHandlerRootHOC.js.map +1 -1
  180. package/lib/module/handlers/FlingGestureHandler.js +10 -0
  181. package/lib/module/handlers/FlingGestureHandler.js.map +1 -0
  182. package/lib/module/handlers/ForceTouchGestureHandler.js +29 -0
  183. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -0
  184. package/lib/module/handlers/LongPressGestureHandler.js +10 -0
  185. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -0
  186. package/lib/module/handlers/NativeViewGestureHandler.js +4 -3
  187. package/lib/module/handlers/NativeViewGestureHandler.js.map +1 -1
  188. package/lib/module/handlers/PanGestureHandler.js +106 -0
  189. package/lib/module/handlers/PanGestureHandler.js.map +1 -0
  190. package/lib/module/handlers/PinchGestureHandler.js +9 -0
  191. package/lib/module/handlers/PinchGestureHandler.js.map +1 -0
  192. package/lib/module/handlers/RotationGestureHandler.js +9 -0
  193. package/lib/module/handlers/RotationGestureHandler.js.map +1 -0
  194. package/lib/module/handlers/TapGestureHandler.js +10 -0
  195. package/lib/module/handlers/TapGestureHandler.js.map +1 -0
  196. package/lib/module/handlers/createHandler.js +41 -76
  197. package/lib/module/handlers/createHandler.js.map +1 -1
  198. package/lib/module/handlers/gestureHandlerCommon.js +66 -0
  199. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -0
  200. package/lib/module/handlers/gestures/GestureDetector.js +402 -0
  201. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -0
  202. package/lib/module/handlers/gestures/eventReceiver.js +120 -0
  203. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -0
  204. package/lib/module/handlers/gestures/flingGesture.js +24 -0
  205. package/lib/module/handlers/gestures/flingGesture.js.map +1 -0
  206. package/lib/module/handlers/gestures/forceTouchGesture.js +56 -0
  207. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -0
  208. package/lib/module/handlers/gestures/gesture.js +175 -0
  209. package/lib/module/handlers/gestures/gesture.js.map +1 -0
  210. package/lib/module/handlers/gestures/gestureComposition.js +79 -0
  211. package/lib/module/handlers/gestures/gestureComposition.js.map +1 -0
  212. package/lib/module/handlers/gestures/gestureObjects.js +67 -0
  213. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -0
  214. package/lib/module/handlers/gestures/gestureStateManager.js +48 -0
  215. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -0
  216. package/lib/module/handlers/gestures/longPressGesture.js +24 -0
  217. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -0
  218. package/lib/module/handlers/gestures/manualGesture.js +22 -0
  219. package/lib/module/handlers/gestures/manualGesture.js.map +1 -0
  220. package/lib/module/handlers/gestures/nativeGesture.js +24 -0
  221. package/lib/module/handlers/gestures/nativeGesture.js.map +1 -0
  222. package/lib/module/handlers/gestures/panGesture.js +135 -0
  223. package/lib/module/handlers/gestures/panGesture.js.map +1 -0
  224. package/lib/module/handlers/gestures/pinchGesture.js +36 -0
  225. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -0
  226. package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -0
  227. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -0
  228. package/lib/module/handlers/gestures/rotationGesture.js +36 -0
  229. package/lib/module/handlers/gestures/rotationGesture.js.map +1 -0
  230. package/lib/module/handlers/gestures/tapGesture.js +49 -0
  231. package/lib/module/handlers/gestures/tapGesture.js.map +1 -0
  232. package/lib/module/handlers/handlersRegistry.js +16 -0
  233. package/lib/module/handlers/handlersRegistry.js.map +1 -0
  234. package/lib/module/index.js +22 -1
  235. package/lib/module/index.js.map +1 -1
  236. package/lib/module/init.js +5 -0
  237. package/lib/module/init.js.map +1 -0
  238. package/lib/module/mocks.js +31 -2
  239. package/lib/module/mocks.js.map +1 -1
  240. package/lib/module/utils.js +8 -0
  241. package/lib/module/utils.js.map +1 -0
  242. package/lib/module/web/Errors.js +1 -1
  243. package/lib/module/web/Errors.js.map +1 -1
  244. package/lib/module/web/GestureHandler.js +4 -6
  245. package/lib/module/web/GestureHandler.js.map +1 -1
  246. package/lib/module/web/NodeManager.js +8 -2
  247. package/lib/module/web/NodeManager.js.map +1 -1
  248. package/lib/typescript/EventType.d.ts +8 -0
  249. package/lib/typescript/GestureHandlerRootView.android.d.ts +2 -4
  250. package/lib/typescript/GestureHandlerRootView.d.ts +5 -2
  251. package/lib/typescript/RNGestureHandlerModule.d.ts +1 -1
  252. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
  253. package/lib/typescript/components/DrawerLayout.d.ts +50 -1
  254. package/lib/typescript/components/GestureButtons.d.ts +36 -0
  255. package/lib/typescript/components/GestureComponents.d.ts +8 -35
  256. package/lib/typescript/components/Swipeable.d.ts +73 -6
  257. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -2
  258. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +1 -0
  259. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +1 -0
  260. package/lib/typescript/handlers/FlingGestureHandler.d.ts +33 -0
  261. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +43 -0
  262. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +55 -0
  263. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +19 -4
  264. package/lib/typescript/handlers/PanGestureHandler.d.ts +137 -0
  265. package/lib/typescript/handlers/PinchGestureHandler.d.ts +28 -0
  266. package/lib/typescript/handlers/RotationGestureHandler.d.ts +28 -0
  267. package/lib/typescript/handlers/TapGestureHandler.d.ts +56 -0
  268. package/lib/typescript/handlers/createHandler.d.ts +1 -1
  269. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +62 -0
  270. package/lib/typescript/handlers/gestureHandlerTypesCompat.d.ts +8 -1
  271. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +16 -0
  272. package/lib/typescript/handlers/gestures/eventReceiver.d.ts +2 -0
  273. package/lib/typescript/handlers/gestures/flingGesture.d.ts +9 -0
  274. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +16 -0
  275. package/lib/typescript/handlers/gestures/gesture.d.ts +97 -0
  276. package/lib/typescript/handlers/gestures/gestureComposition.d.ts +21 -0
  277. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +39 -0
  278. package/lib/typescript/handlers/gestures/gestureStateManager.d.ts +9 -0
  279. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +9 -0
  280. package/lib/typescript/handlers/gestures/manualGesture.d.ts +7 -0
  281. package/lib/typescript/handlers/gestures/nativeGesture.d.ts +9 -0
  282. package/lib/typescript/handlers/gestures/panGesture.d.ts +26 -0
  283. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +12 -0
  284. package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +14 -0
  285. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +12 -0
  286. package/lib/typescript/handlers/gestures/tapGesture.d.ts +14 -0
  287. package/lib/typescript/handlers/handlersRegistry.d.ts +6 -0
  288. package/lib/typescript/index.d.ts +29 -2
  289. package/lib/typescript/init.d.ts +1 -0
  290. package/lib/typescript/mocks.d.ts +21 -2
  291. package/lib/typescript/utils.d.ts +1 -0
  292. package/lib/typescript/web/FlingGestureHandler.d.ts +0 -1
  293. package/lib/typescript/web/GestureHandler.d.ts +0 -1
  294. package/lib/typescript/web/PanGestureHandler.d.ts +0 -1
  295. package/lib/typescript/web/PinchGestureHandler.d.ts +0 -1
  296. package/lib/typescript/web/PressGestureHandler.d.ts +0 -1
  297. package/lib/typescript/web/RotationGestureHandler.d.ts +0 -1
  298. package/lib/typescript/web/TapGestureHandler.d.ts +0 -1
  299. package/package.json +8 -5
  300. package/src/EventType.ts +10 -0
  301. package/src/GestureHandlerRootView.android.tsx +9 -25
  302. package/src/GestureHandlerRootView.tsx +11 -2
  303. package/src/RNGestureHandlerModule.ts +5 -1
  304. package/src/RNGestureHandlerModule.web.ts +1 -0
  305. package/src/components/DrawerLayout.tsx +114 -41
  306. package/src/components/GestureButtons.tsx +45 -5
  307. package/src/components/GestureComponents.tsx +47 -41
  308. package/src/components/Swipeable.tsx +108 -21
  309. package/src/components/touchables/GenericTouchable.tsx +2 -1
  310. package/src/components/touchables/TouchableOpacity.tsx +1 -1
  311. package/src/handlers/FlingGestureHandler.ts +57 -0
  312. package/src/handlers/ForceTouchGestureHandler.ts +83 -0
  313. package/src/handlers/LongPressGestureHandler.ts +84 -0
  314. package/src/handlers/NativeViewGestureHandler.ts +31 -7
  315. package/src/handlers/PanGestureHandler.ts +321 -0
  316. package/src/handlers/PinchGestureHandler.ts +46 -0
  317. package/src/handlers/RotationGestureHandler.ts +46 -0
  318. package/src/handlers/TapGestureHandler.ts +90 -0
  319. package/src/handlers/createHandler.ts +54 -79
  320. package/src/handlers/gestureHandlerCommon.ts +185 -0
  321. package/src/handlers/gestureHandlerTypesCompat.ts +19 -5
  322. package/src/handlers/gestures/GestureDetector.tsx +519 -0
  323. package/src/handlers/gestures/eventReceiver.ts +151 -0
  324. package/src/handlers/gestures/flingGesture.ts +27 -0
  325. package/src/handlers/gestures/forceTouchGesture.ts +74 -0
  326. package/src/handlers/gestures/gesture.ts +292 -0
  327. package/src/handlers/gestures/gestureComposition.ts +109 -0
  328. package/src/handlers/gestures/gestureObjects.ts +79 -0
  329. package/src/handlers/gestures/gestureStateManager.ts +60 -0
  330. package/src/handlers/gestures/longPressGesture.ts +27 -0
  331. package/src/handlers/gestures/manualGesture.ts +31 -0
  332. package/src/handlers/gestures/nativeGesture.ts +27 -0
  333. package/src/handlers/gestures/panGesture.ts +147 -0
  334. package/src/handlers/gestures/pinchGesture.ts +51 -0
  335. package/src/handlers/gestures/reanimatedWrapper.ts +45 -0
  336. package/src/handlers/gestures/rotationGesture.ts +51 -0
  337. package/src/handlers/gestures/tapGesture.ts +52 -0
  338. package/src/handlers/handlersRegistry.ts +22 -0
  339. package/src/index.ts +57 -17
  340. package/src/init.ts +5 -0
  341. package/src/mocks.ts +42 -2
  342. package/src/utils.ts +7 -0
  343. package/src/web/GestureHandler.ts +1 -2
  344. package/src/web/NodeManager.ts +5 -0
  345. package/android/lib/src/main/java/com/swmansion/gesturehandler/BaseGestureHandlerInteractionController.java +0 -23
  346. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.java +0 -110
  347. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.java +0 -531
  348. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerInteractionController.java +0 -8
  349. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.java +0 -543
  350. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistry.java +0 -10
  351. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerRegistryImpl.java +0 -29
  352. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.java +0 -53
  353. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.java +0 -81
  354. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.java +0 -110
  355. package/android/lib/src/main/java/com/swmansion/gesturehandler/OnTouchEventListener.java +0 -8
  356. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.java +0 -312
  357. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.java +0 -109
  358. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureDetector.java +0 -169
  359. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.java +0 -96
  360. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.java +0 -172
  361. package/android/lib/src/main/java/com/swmansion/gesturehandler/ViewConfigurationHelper.java +0 -10
  362. package/android/src/main/java/com/facebook/react/views/modal/RNGHModalUtils.java +0 -21
  363. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.java +0 -296
  364. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.java +0 -72
  365. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.java +0 -77
  366. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.java +0 -8
  367. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.java +0 -86
  368. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.java +0 -731
  369. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerPackage.java +0 -31
  370. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.java +0 -101
  371. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.java +0 -151
  372. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootInterface.java +0 -7
  373. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.java +0 -76
  374. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.java +0 -49
  375. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.java +0 -82
  376. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.java +0 -61
  377. package/lib/commonjs/handlers/gestureHandlers.js +0 -236
  378. package/lib/commonjs/handlers/gestureHandlers.js.map +0 -1
  379. package/lib/module/handlers/gestureHandlers.js +0 -216
  380. package/lib/module/handlers/gestureHandlers.js.map +0 -1
  381. package/lib/typescript/handlers/gestureHandlers.d.ts +0 -158
  382. package/src/handlers/gestureHandlers.ts +0 -511
@@ -0,0 +1,519 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import {
3
+ GestureType,
4
+ HandlerCallbacks,
5
+ BaseGesture,
6
+ GestureRef,
7
+ CALLBACK_TYPE,
8
+ } from './gesture';
9
+ import { Reanimated, SharedValue } from './reanimatedWrapper';
10
+ import { registerHandler, unregisterHandler } from '../handlersRegistry';
11
+ import RNGestureHandlerModule from '../../RNGestureHandlerModule';
12
+ import {
13
+ baseGestureHandlerWithMonitorProps,
14
+ filterConfig,
15
+ findNodeHandle,
16
+ GestureTouchEvent,
17
+ GestureUpdateEvent,
18
+ GestureStateChangeEvent,
19
+ } from '../gestureHandlerCommon';
20
+ import {
21
+ GestureStateManager,
22
+ GestureStateManagerType,
23
+ } from './gestureStateManager';
24
+ import { flingGestureHandlerProps } from '../FlingGestureHandler';
25
+ import { forceTouchGestureHandlerProps } from '../ForceTouchGestureHandler';
26
+ import { longPressGestureHandlerProps } from '../LongPressGestureHandler';
27
+ import {
28
+ panGestureHandlerProps,
29
+ panGestureHandlerCustomNativeProps,
30
+ } from '../PanGestureHandler';
31
+ import { tapGestureHandlerProps } from '../TapGestureHandler';
32
+ import { State } from '../../State';
33
+ import { EventType } from '../../EventType';
34
+ import { ComposedGesture } from './gestureComposition';
35
+
36
+ const ALLOWED_PROPS = [
37
+ ...baseGestureHandlerWithMonitorProps,
38
+ ...tapGestureHandlerProps,
39
+ ...panGestureHandlerProps,
40
+ ...panGestureHandlerCustomNativeProps,
41
+ ...longPressGestureHandlerProps,
42
+ ...forceTouchGestureHandlerProps,
43
+ ...flingGestureHandlerProps,
44
+ ];
45
+
46
+ export type GestureConfigReference = {
47
+ config: GestureType[];
48
+ animatedEventHandler: unknown;
49
+ animatedHandlers: SharedValue<
50
+ HandlerCallbacks<Record<string, unknown>>[] | null
51
+ > | null;
52
+ firstExecution: boolean;
53
+ useAnimated: boolean;
54
+ };
55
+
56
+ function convertToHandlerTag(ref: GestureRef): number {
57
+ if (typeof ref === 'number') {
58
+ return ref;
59
+ } else if (ref instanceof BaseGesture) {
60
+ return ref.handlerTag;
61
+ } else {
62
+ // @ts-ignore in this case it should be a ref either to gesture object or
63
+ // a gesture handler component, in both cases handlerTag property exists
64
+ return ref.current?.handlerTag ?? -1;
65
+ }
66
+ }
67
+
68
+ function extractValidHandlerTags(interactionGroup: GestureRef[] | undefined) {
69
+ return (
70
+ interactionGroup?.map(convertToHandlerTag)?.filter((tag) => tag > 0) ?? []
71
+ );
72
+ }
73
+
74
+ function dropHandlers(preparedGesture: GestureConfigReference) {
75
+ for (const handler of preparedGesture.config) {
76
+ RNGestureHandlerModule.dropGestureHandler(handler.handlerTag);
77
+
78
+ unregisterHandler(handler.handlerTag);
79
+ }
80
+ }
81
+
82
+ interface AttachHandlersConfig {
83
+ preparedGesture: GestureConfigReference;
84
+ gestureConfig: ComposedGesture | GestureType | undefined;
85
+ gesture: GestureType[];
86
+ viewTag: number;
87
+ useAnimated: boolean;
88
+ }
89
+
90
+ function attachHandlers({
91
+ preparedGesture,
92
+ gestureConfig,
93
+ gesture,
94
+ viewTag,
95
+ useAnimated,
96
+ }: AttachHandlersConfig) {
97
+ if (!preparedGesture.firstExecution) {
98
+ gestureConfig?.initialize();
99
+ } else {
100
+ preparedGesture.firstExecution = false;
101
+ }
102
+
103
+ // use setImmediate to extract handlerTags, because all refs should be initialized
104
+ // when it's ran
105
+ setImmediate(() => {
106
+ gestureConfig?.prepare();
107
+ });
108
+
109
+ for (const handler of gesture) {
110
+ RNGestureHandlerModule.createGestureHandler(
111
+ handler.handlerName,
112
+ handler.handlerTag,
113
+ filterConfig(handler.config, ALLOWED_PROPS)
114
+ );
115
+
116
+ registerHandler(handler.handlerTag, handler);
117
+
118
+ // use setImmediate to extract handlerTags, because all refs should be initialized
119
+ // when it's ran
120
+ setImmediate(() => {
121
+ let requireToFail: number[] = [];
122
+ if (handler.config.requireToFail) {
123
+ requireToFail = extractValidHandlerTags(handler.config.requireToFail);
124
+ }
125
+
126
+ let simultaneousWith: number[] = [];
127
+ if (handler.config.simultaneousWith) {
128
+ simultaneousWith = extractValidHandlerTags(
129
+ handler.config.simultaneousWith
130
+ );
131
+ }
132
+
133
+ RNGestureHandlerModule.updateGestureHandler(
134
+ handler.handlerTag,
135
+ filterConfig(handler.config, ALLOWED_PROPS, {
136
+ simultaneousHandlers: simultaneousWith,
137
+ waitFor: requireToFail,
138
+ })
139
+ );
140
+ });
141
+ }
142
+ preparedGesture.config = gesture;
143
+
144
+ for (const gesture of preparedGesture.config) {
145
+ RNGestureHandlerModule.attachGestureHandler(
146
+ gesture.handlerTag,
147
+ viewTag,
148
+ !useAnimated // send direct events when using animatedGesture, device events otherwise
149
+ );
150
+ }
151
+
152
+ if (preparedGesture.animatedHandlers) {
153
+ preparedGesture.animatedHandlers.value = (gesture.map(
154
+ (g) => g.handlers
155
+ ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];
156
+ }
157
+ }
158
+
159
+ function updateHandlers(
160
+ preparedGesture: GestureConfigReference,
161
+ gestureConfig: ComposedGesture | GestureType | undefined,
162
+ gesture: GestureType[]
163
+ ) {
164
+ gestureConfig?.prepare();
165
+
166
+ for (let i = 0; i < gesture.length; i++) {
167
+ const handler = preparedGesture.config[i];
168
+
169
+ gesture[i].handlerTag = handler.handlerTag;
170
+ gesture[i].handlers.handlerTag = handler.handlerTag;
171
+ }
172
+
173
+ // use setImmediate to extract handlerTags, because when it's ran, all refs should be updated
174
+ // and handlerTags in BaseGesture references should be updated in the loop above (we need to wait
175
+ // in case of external relations)
176
+ setImmediate(() => {
177
+ for (let i = 0; i < gesture.length; i++) {
178
+ const handler = preparedGesture.config[i];
179
+
180
+ handler.config = gesture[i].config;
181
+ handler.handlers = gesture[i].handlers;
182
+ handler.handlers.handlerTag = handler.handlerTag;
183
+
184
+ const requireToFail = extractValidHandlerTags(
185
+ handler.config.requireToFail
186
+ );
187
+
188
+ const simultaneousWith = extractValidHandlerTags(
189
+ handler.config.simultaneousWith
190
+ );
191
+
192
+ RNGestureHandlerModule.updateGestureHandler(
193
+ handler.handlerTag,
194
+ filterConfig(handler.config, ALLOWED_PROPS, {
195
+ simultaneousHandlers: simultaneousWith,
196
+ waitFor: requireToFail,
197
+ })
198
+ );
199
+
200
+ registerHandler(handler.handlerTag, handler);
201
+ }
202
+
203
+ if (preparedGesture.animatedHandlers) {
204
+ preparedGesture.animatedHandlers.value = (preparedGesture.config.map(
205
+ (g) => g.handlers
206
+ ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];
207
+ }
208
+ });
209
+ }
210
+
211
+ function needsToReattach(
212
+ preparedGesture: GestureConfigReference,
213
+ gesture: GestureType[]
214
+ ) {
215
+ if (gesture.length !== preparedGesture.config.length) {
216
+ return true;
217
+ }
218
+ for (let i = 0; i < gesture.length; i++) {
219
+ if (gesture[i].handlerName !== preparedGesture.config[i].handlerName) {
220
+ return true;
221
+ }
222
+ }
223
+
224
+ return false;
225
+ }
226
+
227
+ function useAnimatedGesture(preparedGesture: GestureConfigReference) {
228
+ if (!Reanimated) {
229
+ return;
230
+ }
231
+
232
+ function isStateChangeEvent(
233
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
234
+ ): event is GestureStateChangeEvent {
235
+ 'worklet';
236
+ // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point
237
+ return event.oldState != null;
238
+ }
239
+
240
+ function isTouchEvent(
241
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
242
+ ): event is GestureTouchEvent {
243
+ 'worklet';
244
+ return event.eventType != null;
245
+ }
246
+
247
+ function getHandler(
248
+ type: CALLBACK_TYPE,
249
+ gesture: HandlerCallbacks<Record<string, unknown>>
250
+ ) {
251
+ 'worklet';
252
+ switch (type) {
253
+ case CALLBACK_TYPE.BEGAN:
254
+ return gesture.onBegin;
255
+ case CALLBACK_TYPE.START:
256
+ return gesture.onStart;
257
+ case CALLBACK_TYPE.UPDATE:
258
+ return gesture.onUpdate;
259
+ case CALLBACK_TYPE.CHANGE:
260
+ return gesture.onChange;
261
+ case CALLBACK_TYPE.END:
262
+ return gesture.onEnd;
263
+ case CALLBACK_TYPE.FINALIZE:
264
+ return gesture.onFinalize;
265
+ case CALLBACK_TYPE.TOUCHES_DOWN:
266
+ return gesture.onTouchesDown;
267
+ case CALLBACK_TYPE.TOUCHES_MOVE:
268
+ return gesture.onTouchesMove;
269
+ case CALLBACK_TYPE.TOUCHES_UP:
270
+ return gesture.onTouchesUp;
271
+ case CALLBACK_TYPE.TOUCHES_CANCELLED:
272
+ return gesture.onTouchesCancelled;
273
+ }
274
+ }
275
+
276
+ function touchEventTypeToCallbackType(eventType: EventType): CALLBACK_TYPE {
277
+ 'worklet';
278
+ switch (eventType) {
279
+ case EventType.TOUCHES_DOWN:
280
+ return CALLBACK_TYPE.TOUCHES_DOWN;
281
+ case EventType.TOUCHES_MOVE:
282
+ return CALLBACK_TYPE.TOUCHES_MOVE;
283
+ case EventType.TOUCHES_UP:
284
+ return CALLBACK_TYPE.TOUCHES_UP;
285
+ case EventType.TOUCHES_CANCELLED:
286
+ return CALLBACK_TYPE.TOUCHES_CANCELLED;
287
+ }
288
+ return CALLBACK_TYPE.UNDEFINED;
289
+ }
290
+
291
+ function runWorklet(
292
+ type: CALLBACK_TYPE,
293
+ gesture: HandlerCallbacks<Record<string, unknown>>,
294
+ event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,
295
+ ...args: any[]
296
+ ) {
297
+ 'worklet';
298
+ const handler = getHandler(type, gesture);
299
+ if (gesture.isWorklet[type]) {
300
+ // @ts-ignore Logic below makes sure the correct event is send to the
301
+ // correct handler.
302
+ handler?.(event, ...args);
303
+ } else if (handler) {
304
+ console.warn('Animated gesture callback must be a worklet');
305
+ }
306
+ }
307
+
308
+ // Hooks are called conditionally, but the condition is whether the
309
+ // react-native-reanimated is installed, which shouldn't change while running
310
+ // eslint-disable-next-line react-hooks/rules-of-hooks
311
+ const sharedHandlersCallbacks = Reanimated.useSharedValue<
312
+ HandlerCallbacks<Record<string, unknown>>[] | null
313
+ >(null);
314
+
315
+ // eslint-disable-next-line react-hooks/rules-of-hooks
316
+ const lastUpdateEvent = Reanimated.useSharedValue<
317
+ (GestureUpdateEvent | undefined)[]
318
+ >([]);
319
+
320
+ // not every gesture needs a state controller, init them lazily
321
+ const stateControllers: GestureStateManagerType[] = [];
322
+
323
+ const callback = (
324
+ event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent
325
+ ) => {
326
+ 'worklet';
327
+
328
+ const currentCallback = sharedHandlersCallbacks.value;
329
+ if (!currentCallback) {
330
+ return;
331
+ }
332
+
333
+ for (let i = 0; i < currentCallback.length; i++) {
334
+ const gesture = currentCallback[i];
335
+
336
+ if (event.handlerTag === gesture.handlerTag) {
337
+ if (isStateChangeEvent(event)) {
338
+ if (
339
+ event.oldState === State.UNDETERMINED &&
340
+ event.state === State.BEGAN
341
+ ) {
342
+ runWorklet(CALLBACK_TYPE.BEGAN, gesture, event);
343
+ } else if (
344
+ (event.oldState === State.BEGAN ||
345
+ event.oldState === State.UNDETERMINED) &&
346
+ event.state === State.ACTIVE
347
+ ) {
348
+ runWorklet(CALLBACK_TYPE.START, gesture, event);
349
+ lastUpdateEvent.value[gesture.handlerTag] = undefined;
350
+ } else if (
351
+ event.oldState !== event.state &&
352
+ event.state === State.END
353
+ ) {
354
+ if (event.oldState === State.ACTIVE) {
355
+ runWorklet(CALLBACK_TYPE.END, gesture, event, true);
356
+ }
357
+ runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, true);
358
+ } else if (
359
+ (event.state === State.FAILED || event.state === State.CANCELLED) &&
360
+ event.state !== event.oldState
361
+ ) {
362
+ if (event.oldState === State.ACTIVE) {
363
+ runWorklet(CALLBACK_TYPE.END, gesture, event, false);
364
+ }
365
+ runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, false);
366
+ }
367
+ } else if (isTouchEvent(event)) {
368
+ if (!stateControllers[i]) {
369
+ stateControllers[i] = GestureStateManager.create(event.handlerTag);
370
+ }
371
+
372
+ if (event.eventType !== EventType.UNDETERMINED) {
373
+ runWorklet(
374
+ touchEventTypeToCallbackType(event.eventType),
375
+ gesture,
376
+ event,
377
+ stateControllers[i]
378
+ );
379
+ }
380
+ } else {
381
+ runWorklet(CALLBACK_TYPE.UPDATE, gesture, event);
382
+
383
+ if (gesture.onChange && gesture.changeEventCalculator) {
384
+ runWorklet(
385
+ CALLBACK_TYPE.CHANGE,
386
+ gesture,
387
+ gesture.changeEventCalculator?.(
388
+ event,
389
+ lastUpdateEvent.value[gesture.handlerTag]
390
+ )
391
+ );
392
+
393
+ lastUpdateEvent.value[gesture.handlerTag] = event;
394
+ }
395
+ }
396
+ }
397
+ }
398
+ };
399
+
400
+ // eslint-disable-next-line react-hooks/rules-of-hooks
401
+ const event = Reanimated.useEvent(
402
+ callback,
403
+ ['onGestureHandlerStateChange', 'onGestureHandlerEvent'],
404
+ true
405
+ );
406
+
407
+ preparedGesture.animatedEventHandler = event;
408
+ preparedGesture.animatedHandlers = sharedHandlersCallbacks;
409
+ }
410
+
411
+ interface GestureDetectorProps {
412
+ gesture?: ComposedGesture | GestureType;
413
+ }
414
+ export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
415
+ props
416
+ ) => {
417
+ const gestureConfig = props.gesture;
418
+ const gesture = gestureConfig?.toGestureArray?.() ?? [];
419
+ const useAnimated =
420
+ gesture.find((gesture) =>
421
+ gesture.handlers.isWorklet.reduce((prev, current) => prev || current)
422
+ ) != null;
423
+ const viewRef = useRef(null);
424
+ const firstRenderRef = useRef(true);
425
+
426
+ const preparedGesture = React.useRef<GestureConfigReference>({
427
+ config: gesture,
428
+ animatedEventHandler: null,
429
+ animatedHandlers: null,
430
+ firstExecution: true,
431
+ useAnimated: useAnimated,
432
+ }).current;
433
+
434
+ if (useAnimated !== preparedGesture.useAnimated) {
435
+ throw new Error(
436
+ 'You cannot change whether you are using gesture or animatedGesture while the app is running'
437
+ );
438
+ }
439
+
440
+ if (preparedGesture.firstExecution) {
441
+ gestureConfig?.initialize?.();
442
+ }
443
+
444
+ if (useAnimated) {
445
+ // Whether animatedGesture or gesture is used shouldn't change
446
+ // during while an app is running
447
+ // eslint-disable-next-line react-hooks/rules-of-hooks
448
+ useAnimatedGesture(preparedGesture);
449
+ }
450
+
451
+ useEffect(() => {
452
+ firstRenderRef.current = true;
453
+ const viewTag = findNodeHandle(viewRef.current) as number;
454
+ attachHandlers({
455
+ preparedGesture,
456
+ gestureConfig,
457
+ gesture,
458
+ viewTag,
459
+ useAnimated,
460
+ });
461
+
462
+ return () => {
463
+ dropHandlers(preparedGesture);
464
+ };
465
+ }, []);
466
+
467
+ useEffect(() => {
468
+ if (!firstRenderRef.current) {
469
+ const viewTag = findNodeHandle(viewRef.current) as number;
470
+
471
+ if (needsToReattach(preparedGesture, gesture)) {
472
+ dropHandlers(preparedGesture);
473
+ attachHandlers({
474
+ preparedGesture,
475
+ gestureConfig,
476
+ gesture,
477
+ viewTag,
478
+ useAnimated,
479
+ });
480
+ } else {
481
+ updateHandlers(preparedGesture, gestureConfig, gesture);
482
+ }
483
+ } else {
484
+ firstRenderRef.current = false;
485
+ }
486
+ }, [props]);
487
+
488
+ if (useAnimated) {
489
+ return (
490
+ <AnimatedWrap
491
+ ref={viewRef}
492
+ onGestureHandlerEvent={preparedGesture.animatedEventHandler}>
493
+ {props.children}
494
+ </AnimatedWrap>
495
+ );
496
+ } else {
497
+ return <Wrap ref={viewRef}>{props.children}</Wrap>;
498
+ }
499
+ };
500
+
501
+ class Wrap extends React.Component<{ onGestureHandlerEvent?: unknown }> {
502
+ render() {
503
+ // I don't think that fighting with types over such a simple function is worth it
504
+ // The only thing it does is add 'collapsable: false' to the child component
505
+ // to make sure it is in the native view hierarchy so the detector can find
506
+ // correct viewTag to attach to.
507
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
508
+ const child: any = React.Children.only(this.props.children);
509
+
510
+ return React.cloneElement(
511
+ child,
512
+ { collapsable: false },
513
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
514
+ child.props.children
515
+ );
516
+ }
517
+ }
518
+
519
+ const AnimatedWrap = Reanimated?.default?.createAnimatedComponent(Wrap) ?? Wrap;
@@ -0,0 +1,151 @@
1
+ import { DeviceEventEmitter, EmitterSubscription } from 'react-native';
2
+ import { State } from '../../State';
3
+ import { EventType } from '../../EventType';
4
+ import {
5
+ GestureTouchEvent,
6
+ GestureUpdateEvent,
7
+ GestureStateChangeEvent,
8
+ } from '../gestureHandlerCommon';
9
+ import { GestureStateManagerType } from './gestureStateManager';
10
+ import { findHandler } from '../handlersRegistry';
11
+ import { BaseGesture } from './gesture';
12
+
13
+ let gestureHandlerEventSubscription: EmitterSubscription | null = null;
14
+ let gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;
15
+
16
+ const dummyStateManager: GestureStateManagerType = {
17
+ begin: () => {
18
+ console.warn(
19
+ 'You have to use react-native-reanimated in order to control the state of the gesture.'
20
+ );
21
+ },
22
+ activate: () => {
23
+ console.warn(
24
+ 'You have to use react-native-reanimated in order to control the state of the gesture.'
25
+ );
26
+ },
27
+ end: () => {
28
+ console.warn(
29
+ 'You have to use react-native-reanimated in order to control the state of the gesture.'
30
+ );
31
+ },
32
+ fail: () => {
33
+ console.warn(
34
+ 'You have to use react-native-reanimated in order to control the state of the gesture.'
35
+ );
36
+ },
37
+ };
38
+
39
+ const lastUpdateEvent: (GestureUpdateEvent | undefined)[] = [];
40
+
41
+ function isStateChangeEvent(
42
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
43
+ ): event is GestureStateChangeEvent {
44
+ // @ts-ignore oldState doesn't exist on GestureTouchEvent and that's the point
45
+ return event.oldState != null;
46
+ }
47
+
48
+ function isTouchEvent(
49
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
50
+ ): event is GestureTouchEvent {
51
+ return event.eventType != null;
52
+ }
53
+
54
+ function onGestureHandlerEvent(
55
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
56
+ ) {
57
+ const handler = findHandler(event.handlerTag) as BaseGesture<
58
+ Record<string, unknown>
59
+ >;
60
+
61
+ if (handler) {
62
+ if (isStateChangeEvent(event)) {
63
+ if (
64
+ event.oldState === State.UNDETERMINED &&
65
+ event.state === State.BEGAN
66
+ ) {
67
+ handler.handlers.onBegin?.(event);
68
+ } else if (
69
+ (event.oldState === State.BEGAN ||
70
+ event.oldState === State.UNDETERMINED) &&
71
+ event.state === State.ACTIVE
72
+ ) {
73
+ handler.handlers.onStart?.(event);
74
+ lastUpdateEvent[handler.handlers.handlerTag] = event;
75
+ } else if (event.oldState !== event.state && event.state === State.END) {
76
+ if (event.oldState === State.ACTIVE) {
77
+ handler.handlers.onEnd?.(event, true);
78
+ }
79
+ handler.handlers.onFinalize?.(event, true);
80
+ lastUpdateEvent[handler.handlers.handlerTag] = undefined;
81
+ } else if (
82
+ (event.state === State.FAILED || event.state === State.CANCELLED) &&
83
+ event.oldState !== event.state
84
+ ) {
85
+ if (event.oldState === State.ACTIVE) {
86
+ handler.handlers.onEnd?.(event, false);
87
+ }
88
+ handler.handlers.onFinalize?.(event, false);
89
+ lastUpdateEvent[handler.handlers.handlerTag] = undefined;
90
+ }
91
+ } else if (isTouchEvent(event)) {
92
+ switch (event.eventType) {
93
+ case EventType.TOUCHES_DOWN:
94
+ handler.handlers?.onTouchesDown?.(event, dummyStateManager);
95
+ break;
96
+ case EventType.TOUCHES_MOVE:
97
+ handler.handlers?.onTouchesMove?.(event, dummyStateManager);
98
+ break;
99
+ case EventType.TOUCHES_UP:
100
+ handler.handlers?.onTouchesUp?.(event, dummyStateManager);
101
+ break;
102
+ case EventType.TOUCHES_CANCELLED:
103
+ handler.handlers?.onTouchesCancelled?.(event, dummyStateManager);
104
+ break;
105
+ }
106
+ } else {
107
+ handler.handlers.onUpdate?.(event);
108
+
109
+ if (handler.handlers.onChange && handler.handlers.changeEventCalculator) {
110
+ handler.handlers.onChange?.(
111
+ handler.handlers.changeEventCalculator?.(
112
+ event,
113
+ lastUpdateEvent[handler.handlers.handlerTag]
114
+ )
115
+ );
116
+
117
+ lastUpdateEvent[handler.handlers.handlerTag] = event;
118
+ }
119
+ }
120
+ }
121
+ }
122
+
123
+ export function startListening() {
124
+ stopListening();
125
+
126
+ gestureHandlerEventSubscription = DeviceEventEmitter.addListener(
127
+ 'onGestureHandlerEvent',
128
+ onGestureHandlerEvent
129
+ );
130
+
131
+ gestureHandlerStateChangeEventSubscription = DeviceEventEmitter.addListener(
132
+ 'onGestureHandlerStateChange',
133
+ onGestureHandlerEvent
134
+ );
135
+ }
136
+
137
+ export function stopListening() {
138
+ if (gestureHandlerEventSubscription) {
139
+ DeviceEventEmitter.removeSubscription(gestureHandlerEventSubscription);
140
+
141
+ gestureHandlerEventSubscription = null;
142
+ }
143
+
144
+ if (gestureHandlerStateChangeEventSubscription) {
145
+ DeviceEventEmitter.removeSubscription(
146
+ gestureHandlerStateChangeEventSubscription
147
+ );
148
+
149
+ gestureHandlerStateChangeEventSubscription = null;
150
+ }
151
+ }
@@ -0,0 +1,27 @@
1
+ import { BaseGesture, BaseGestureConfig } from './gesture';
2
+ import {
3
+ FlingGestureConfig,
4
+ FlingGestureHandlerEventPayload,
5
+ } from '../FlingGestureHandler';
6
+
7
+ export class FlingGesture extends BaseGesture<FlingGestureHandlerEventPayload> {
8
+ public config: BaseGestureConfig & FlingGestureConfig = {};
9
+
10
+ constructor() {
11
+ super();
12
+
13
+ this.handlerName = 'FlingGestureHandler';
14
+ }
15
+
16
+ numberOfPointers(pointers: number) {
17
+ this.config.numberOfPointers = pointers;
18
+ return this;
19
+ }
20
+
21
+ direction(direction: number) {
22
+ this.config.direction = direction;
23
+ return this;
24
+ }
25
+ }
26
+
27
+ export type FlingGestureType = InstanceType<typeof FlingGesture>;