react-native-gesture-handler 2.4.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (382) hide show
  1. package/README.md +4 -2
  2. package/RNGestureHandler.podspec +17 -5
  3. package/android/build.gradle +71 -15
  4. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +2 -1
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +9 -5
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +32 -6
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +5 -2
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +105 -23
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +30 -2
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +3 -2
  11. package/android/src/fabric/java/com/swmansion/gesturehandler/RNGestureHandlerComponentsRegistry.java +1 -1
  12. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +0 -8
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +74 -84
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +7 -1
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +5 -1
  16. package/android/src/main/jni/CMakeLists.txt +59 -0
  17. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +12 -9
  18. package/android/src/paper/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +1 -0
  19. package/ios/Handlers/RNFlingHandler.m +43 -1
  20. package/ios/Handlers/{RNNativeViewHandler.m → RNNativeViewHandler.mm} +13 -1
  21. package/ios/Handlers/RNPanHandler.m +27 -0
  22. package/ios/RNGestureHandler.h +1 -0
  23. package/ios/RNGestureHandler.m +22 -4
  24. package/ios/RNGestureHandlerButtonComponentView.mm +1 -1
  25. package/ios/RNGestureHandlerManager.mm +10 -7
  26. package/ios/RNGestureHandlerModule.mm +4 -1
  27. package/ios/RNGestureHandlerRootViewComponentView.mm +1 -1
  28. package/ios/RNManualActivationRecognizer.m +10 -3
  29. package/ios/RNRootViewGestureRecognizer.m +12 -1
  30. package/lib/commonjs/EnableExperimentalWebImplementation.js +24 -0
  31. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -0
  32. package/lib/commonjs/RNGestureHandlerModule.macos.js +138 -0
  33. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -0
  34. package/lib/commonjs/RNGestureHandlerModule.web.js +87 -25
  35. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  36. package/lib/commonjs/RNRenderer.js +16 -0
  37. package/lib/commonjs/RNRenderer.js.map +1 -0
  38. package/lib/commonjs/RNRenderer.web.js +11 -0
  39. package/lib/commonjs/RNRenderer.web.js.map +1 -0
  40. package/lib/commonjs/components/DrawerLayout.js +41 -12
  41. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  42. package/lib/commonjs/components/GestureButtons.js +42 -9
  43. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  44. package/lib/commonjs/components/GestureComponents.js +41 -4
  45. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  46. package/lib/commonjs/components/GestureComponents.web.js +7 -2
  47. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  48. package/lib/commonjs/components/Swipeable.js +3 -1
  49. package/lib/commonjs/components/Swipeable.js.map +1 -1
  50. package/lib/commonjs/components/touchables/GenericTouchable.js +5 -1
  51. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  52. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  53. package/lib/commonjs/handlers/ForceTouchGestureHandler.js +2 -1
  54. package/lib/commonjs/handlers/ForceTouchGestureHandler.js.map +1 -1
  55. package/lib/commonjs/handlers/PanGestureHandler.js +1 -1
  56. package/lib/commonjs/handlers/PanGestureHandler.js.map +1 -1
  57. package/lib/commonjs/handlers/PressabilityDebugView.js +14 -0
  58. package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -0
  59. package/lib/commonjs/handlers/PressabilityDebugView.web.js +12 -0
  60. package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +1 -0
  61. package/lib/commonjs/handlers/createHandler.js +33 -12
  62. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  63. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  64. package/lib/commonjs/handlers/gestures/GestureDetector.js +150 -75
  65. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  66. package/lib/commonjs/handlers/gestures/gesture.js +13 -2
  67. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  68. package/lib/commonjs/handlers/gestures/gestureStateManager.js +13 -9
  69. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  70. package/lib/commonjs/handlers/gestures/panGesture.js +5 -0
  71. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  72. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +7 -0
  73. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  74. package/lib/commonjs/index.js +14 -0
  75. package/lib/commonjs/index.js.map +1 -1
  76. package/lib/commonjs/utils.js +6 -3
  77. package/lib/commonjs/utils.js.map +1 -1
  78. package/lib/commonjs/web/constants.js +3 -51
  79. package/lib/commonjs/web/constants.js.map +1 -1
  80. package/lib/commonjs/web/detectors/RotationGestureDetector.js +169 -0
  81. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -0
  82. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +167 -0
  83. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -0
  84. package/lib/commonjs/web/handlers/FlingGestureHandler.js +154 -0
  85. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -0
  86. package/lib/commonjs/web/handlers/GestureHandler.js +538 -0
  87. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -0
  88. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +147 -0
  89. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -0
  90. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +116 -0
  91. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -0
  92. package/lib/commonjs/web/handlers/PanGestureHandler.js +451 -0
  93. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -0
  94. package/lib/commonjs/web/handlers/PinchGestureHandler.js +171 -0
  95. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -0
  96. package/lib/commonjs/web/handlers/RotationGestureHandler.js +187 -0
  97. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -0
  98. package/lib/commonjs/web/handlers/TapGestureHandler.js +296 -0
  99. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -0
  100. package/lib/commonjs/web/interfaces.js +34 -0
  101. package/lib/commonjs/web/interfaces.js.map +1 -0
  102. package/lib/commonjs/web/tools/EventManager.js +169 -0
  103. package/lib/commonjs/web/tools/EventManager.js.map +1 -0
  104. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +283 -0
  105. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -0
  106. package/lib/commonjs/web/tools/InteractionManager.js +102 -0
  107. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -0
  108. package/lib/commonjs/web/tools/NodeManager.js +48 -0
  109. package/lib/commonjs/web/tools/NodeManager.js.map +1 -0
  110. package/lib/commonjs/web/tools/PointerTracker.js +132 -0
  111. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -0
  112. package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
  113. package/lib/commonjs/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
  114. package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js +0 -0
  115. package/lib/commonjs/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
  116. package/lib/commonjs/{web → web_hammer}/Errors.js +0 -0
  117. package/lib/commonjs/{web → web_hammer}/Errors.js.map +0 -0
  118. package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js +0 -0
  119. package/lib/commonjs/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
  120. package/lib/commonjs/{web → web_hammer}/GestureHandler.js +83 -42
  121. package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -0
  122. package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
  123. package/lib/commonjs/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
  124. package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js +0 -0
  125. package/lib/commonjs/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
  126. package/lib/commonjs/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
  127. package/lib/commonjs/web_hammer/NativeViewGestureHandler.js.map +1 -0
  128. package/lib/commonjs/{web → web_hammer}/NodeManager.js +0 -0
  129. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -0
  130. package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js +0 -0
  131. package/lib/commonjs/{web → web_hammer}/PanGestureHandler.js.map +0 -0
  132. package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js +0 -0
  133. package/lib/commonjs/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
  134. package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js +0 -0
  135. package/lib/commonjs/{web → web_hammer}/PressGestureHandler.js.map +0 -0
  136. package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js +0 -0
  137. package/lib/commonjs/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
  138. package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js +0 -0
  139. package/lib/commonjs/{web → web_hammer}/TapGestureHandler.js.map +0 -0
  140. package/lib/commonjs/web_hammer/constants.js +64 -0
  141. package/lib/commonjs/web_hammer/constants.js.map +1 -0
  142. package/lib/commonjs/{web → web_hammer}/utils.js +0 -0
  143. package/lib/commonjs/{web → web_hammer}/utils.js.map +1 -1
  144. package/lib/module/EnableExperimentalWebImplementation.js +15 -0
  145. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -0
  146. package/lib/module/RNGestureHandlerModule.macos.js +102 -0
  147. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -0
  148. package/lib/module/RNGestureHandlerModule.web.js +73 -24
  149. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  150. package/lib/module/RNRenderer.js +4 -0
  151. package/lib/module/RNRenderer.js.map +1 -0
  152. package/lib/module/RNRenderer.web.js +4 -0
  153. package/lib/module/RNRenderer.web.js.map +1 -0
  154. package/lib/module/components/DrawerLayout.js +41 -12
  155. package/lib/module/components/DrawerLayout.js.map +1 -1
  156. package/lib/module/components/GestureButtons.js +43 -9
  157. package/lib/module/components/GestureButtons.js.map +1 -1
  158. package/lib/module/components/GestureComponents.js +39 -4
  159. package/lib/module/components/GestureComponents.js.map +1 -1
  160. package/lib/module/components/GestureComponents.web.js +6 -2
  161. package/lib/module/components/GestureComponents.web.js.map +1 -1
  162. package/lib/module/components/Swipeable.js +3 -1
  163. package/lib/module/components/Swipeable.js.map +1 -1
  164. package/lib/module/components/touchables/GenericTouchable.js +5 -1
  165. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  166. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  167. package/lib/module/handlers/ForceTouchGestureHandler.js +1 -1
  168. package/lib/module/handlers/ForceTouchGestureHandler.js.map +1 -1
  169. package/lib/module/handlers/PanGestureHandler.js +1 -1
  170. package/lib/module/handlers/PanGestureHandler.js.map +1 -1
  171. package/lib/module/handlers/PressabilityDebugView.js +3 -0
  172. package/lib/module/handlers/PressabilityDebugView.js.map +1 -0
  173. package/lib/module/handlers/PressabilityDebugView.web.js +5 -0
  174. package/lib/module/handlers/PressabilityDebugView.web.js.map +1 -0
  175. package/lib/module/handlers/createHandler.js +35 -14
  176. package/lib/module/handlers/createHandler.js.map +1 -1
  177. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  178. package/lib/module/handlers/gestures/GestureDetector.js +147 -74
  179. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  180. package/lib/module/handlers/gestures/gesture.js +13 -2
  181. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  182. package/lib/module/handlers/gestures/gestureStateManager.js +13 -9
  183. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  184. package/lib/module/handlers/gestures/panGesture.js +5 -0
  185. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  186. package/lib/module/handlers/gestures/reanimatedWrapper.js +7 -0
  187. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  188. package/lib/module/index.js +2 -1
  189. package/lib/module/index.js.map +1 -1
  190. package/lib/module/utils.js +2 -1
  191. package/lib/module/utils.js.map +1 -1
  192. package/lib/module/web/constants.js +1 -36
  193. package/lib/module/web/constants.js.map +1 -1
  194. package/lib/module/web/detectors/RotationGestureDetector.js +159 -0
  195. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -0
  196. package/lib/module/web/detectors/ScaleGestureDetector.js +156 -0
  197. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -0
  198. package/lib/module/web/handlers/FlingGestureHandler.js +139 -0
  199. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -0
  200. package/lib/module/web/handlers/GestureHandler.js +521 -0
  201. package/lib/module/web/handlers/GestureHandler.js.map +1 -0
  202. package/lib/module/web/handlers/LongPressGestureHandler.js +133 -0
  203. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -0
  204. package/lib/module/web/handlers/NativeViewGestureHandler.js +103 -0
  205. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -0
  206. package/lib/module/web/handlers/PanGestureHandler.js +434 -0
  207. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -0
  208. package/lib/module/web/handlers/PinchGestureHandler.js +155 -0
  209. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -0
  210. package/lib/module/web/handlers/RotationGestureHandler.js +171 -0
  211. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -0
  212. package/lib/module/web/handlers/TapGestureHandler.js +281 -0
  213. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -0
  214. package/lib/module/web/interfaces.js +26 -0
  215. package/lib/module/web/interfaces.js.map +1 -0
  216. package/lib/module/web/tools/EventManager.js +160 -0
  217. package/lib/module/web/tools/EventManager.js.map +1 -0
  218. package/lib/module/web/tools/GestureHandlerOrchestrator.js +270 -0
  219. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -0
  220. package/lib/module/web/tools/InteractionManager.js +93 -0
  221. package/lib/module/web/tools/InteractionManager.js.map +1 -0
  222. package/lib/module/web/tools/NodeManager.js +39 -0
  223. package/lib/module/web/tools/NodeManager.js.map +1 -0
  224. package/lib/module/web/tools/PointerTracker.js +122 -0
  225. package/lib/module/web/tools/PointerTracker.js.map +1 -0
  226. package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js +0 -0
  227. package/lib/module/{web → web_hammer}/DiscreteGestureHandler.js.map +0 -0
  228. package/lib/module/{web → web_hammer}/DraggingGestureHandler.js +0 -0
  229. package/lib/module/{web → web_hammer}/DraggingGestureHandler.js.map +0 -0
  230. package/lib/module/{web → web_hammer}/Errors.js +0 -0
  231. package/lib/module/{web → web_hammer}/Errors.js.map +0 -0
  232. package/lib/module/{web → web_hammer}/FlingGestureHandler.js +0 -0
  233. package/lib/module/{web → web_hammer}/FlingGestureHandler.js.map +0 -0
  234. package/lib/module/{web → web_hammer}/GestureHandler.js +83 -42
  235. package/lib/module/web_hammer/GestureHandler.js.map +1 -0
  236. package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js +0 -0
  237. package/lib/module/{web → web_hammer}/IndiscreteGestureHandler.js.map +0 -0
  238. package/lib/module/{web → web_hammer}/LongPressGestureHandler.js +0 -0
  239. package/lib/module/{web → web_hammer}/LongPressGestureHandler.js.map +0 -0
  240. package/lib/module/{web → web_hammer}/NativeViewGestureHandler.js +4 -0
  241. package/lib/module/web_hammer/NativeViewGestureHandler.js.map +1 -0
  242. package/lib/module/{web → web_hammer}/NodeManager.js +0 -0
  243. package/lib/module/web_hammer/NodeManager.js.map +1 -0
  244. package/lib/module/{web → web_hammer}/PanGestureHandler.js +0 -0
  245. package/lib/module/{web → web_hammer}/PanGestureHandler.js.map +0 -0
  246. package/lib/module/{web → web_hammer}/PinchGestureHandler.js +0 -0
  247. package/lib/module/{web → web_hammer}/PinchGestureHandler.js.map +0 -0
  248. package/lib/module/{web → web_hammer}/PressGestureHandler.js +0 -0
  249. package/lib/module/{web → web_hammer}/PressGestureHandler.js.map +0 -0
  250. package/lib/module/{web → web_hammer}/RotationGestureHandler.js +0 -0
  251. package/lib/module/{web → web_hammer}/RotationGestureHandler.js.map +0 -0
  252. package/lib/module/{web → web_hammer}/TapGestureHandler.js +0 -0
  253. package/lib/module/{web → web_hammer}/TapGestureHandler.js.map +0 -0
  254. package/lib/module/web_hammer/constants.js +43 -0
  255. package/lib/module/web_hammer/constants.js.map +1 -0
  256. package/lib/module/{web → web_hammer}/utils.js +0 -0
  257. package/lib/module/{web → web_hammer}/utils.js.map +1 -1
  258. package/lib/typescript/EnableExperimentalWebImplementation.d.ts +2 -0
  259. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +44 -0
  260. package/lib/typescript/RNGestureHandlerModule.web.d.ts +29 -18
  261. package/lib/typescript/RNRenderer.d.ts +1 -0
  262. package/lib/typescript/RNRenderer.web.d.ts +3 -0
  263. package/lib/typescript/components/DrawerLayout.d.ts +4 -1
  264. package/lib/typescript/components/GestureButtons.d.ts +22 -0
  265. package/lib/typescript/components/GestureComponents.d.ts +7 -3
  266. package/lib/typescript/components/GestureComponents.web.d.ts +1 -0
  267. package/lib/typescript/components/Swipeable.d.ts +1 -1
  268. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +1 -0
  269. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +2 -2
  270. package/lib/typescript/handlers/PanGestureHandler.d.ts +2 -1
  271. package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -0
  272. package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +1 -0
  273. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +1 -0
  274. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  275. package/lib/typescript/handlers/gestures/gesture.d.ts +3 -0
  276. package/lib/typescript/handlers/gestures/panGesture.d.ts +1 -0
  277. package/lib/typescript/index.d.ts +2 -1
  278. package/lib/typescript/web/constants.d.ts +1 -33
  279. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +30 -0
  280. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +30 -0
  281. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +31 -0
  282. package/lib/typescript/web/handlers/GestureHandler.d.ts +84 -0
  283. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +33 -0
  284. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +16 -0
  285. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +68 -0
  286. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +30 -0
  287. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +30 -0
  288. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +49 -0
  289. package/lib/typescript/web/interfaces.d.ts +97 -0
  290. package/lib/typescript/web/tools/EventManager.d.ts +28 -0
  291. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +28 -0
  292. package/lib/typescript/web/tools/InteractionManager.d.ts +13 -0
  293. package/lib/typescript/web/tools/NodeManager.d.ts +11 -0
  294. package/lib/typescript/web/tools/PointerTracker.d.ts +28 -0
  295. package/lib/typescript/{web → web_hammer}/DiscreteGestureHandler.d.ts +0 -0
  296. package/lib/typescript/{web → web_hammer}/DraggingGestureHandler.d.ts +0 -0
  297. package/lib/typescript/{web → web_hammer}/Errors.d.ts +0 -0
  298. package/lib/typescript/{web → web_hammer}/FlingGestureHandler.d.ts +1 -0
  299. package/lib/typescript/{web → web_hammer}/GestureHandler.d.ts +6 -0
  300. package/lib/typescript/{web → web_hammer}/IndiscreteGestureHandler.d.ts +1 -0
  301. package/lib/typescript/{web → web_hammer}/LongPressGestureHandler.d.ts +1 -0
  302. package/lib/typescript/{web → web_hammer}/NativeViewGestureHandler.d.ts +1 -0
  303. package/lib/typescript/web_hammer/NodeManager.d.ts +8 -0
  304. package/lib/typescript/{web → web_hammer}/PanGestureHandler.d.ts +1 -0
  305. package/lib/typescript/{web → web_hammer}/PinchGestureHandler.d.ts +0 -0
  306. package/lib/typescript/{web → web_hammer}/PressGestureHandler.d.ts +2 -0
  307. package/lib/typescript/{web → web_hammer}/RotationGestureHandler.d.ts +0 -0
  308. package/lib/typescript/{web → web_hammer}/TapGestureHandler.d.ts +1 -0
  309. package/lib/typescript/web_hammer/constants.d.ts +39 -0
  310. package/lib/typescript/{web → web_hammer}/utils.d.ts +0 -0
  311. package/package.json +1 -1
  312. package/src/EnableExperimentalWebImplementation.ts +18 -0
  313. package/src/RNGestureHandlerModule.macos.ts +114 -0
  314. package/src/RNGestureHandlerModule.web.ts +89 -26
  315. package/src/RNRenderer.ts +3 -0
  316. package/src/RNRenderer.web.ts +3 -0
  317. package/src/components/DrawerLayout.tsx +37 -14
  318. package/src/components/GestureButtons.tsx +64 -0
  319. package/src/components/GestureComponents.tsx +66 -6
  320. package/src/components/GestureComponents.web.tsx +5 -0
  321. package/src/components/Swipeable.tsx +3 -1
  322. package/src/components/touchables/GenericTouchable.tsx +2 -0
  323. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +1 -0
  324. package/src/handlers/ForceTouchGestureHandler.ts +3 -2
  325. package/src/handlers/PanGestureHandler.ts +2 -0
  326. package/src/handlers/PressabilityDebugView.tsx +2 -0
  327. package/src/handlers/PressabilityDebugView.web.tsx +4 -0
  328. package/src/handlers/{createHandler.ts → createHandler.tsx} +45 -19
  329. package/src/handlers/gestureHandlerCommon.ts +2 -0
  330. package/src/handlers/gestures/GestureDetector.tsx +185 -93
  331. package/src/handlers/gestures/gesture.ts +16 -0
  332. package/src/handlers/gestures/gestureStateManager.ts +13 -8
  333. package/src/handlers/gestures/panGesture.ts +5 -0
  334. package/src/handlers/gestures/reanimatedWrapper.ts +7 -0
  335. package/src/index.ts +3 -0
  336. package/src/utils.ts +3 -1
  337. package/src/web/constants.ts +1 -41
  338. package/src/web/detectors/RotationGestureDetector.ts +199 -0
  339. package/src/web/detectors/ScaleGestureDetector.ts +208 -0
  340. package/src/web/handlers/FlingGestureHandler.ts +146 -0
  341. package/src/web/handlers/GestureHandler.ts +572 -0
  342. package/src/web/handlers/LongPressGestureHandler.ts +122 -0
  343. package/src/web/handlers/NativeViewGestureHandler.ts +109 -0
  344. package/src/web/handlers/PanGestureHandler.ts +488 -0
  345. package/src/web/handlers/PinchGestureHandler.ts +162 -0
  346. package/src/web/handlers/RotationGestureHandler.ts +181 -0
  347. package/src/web/handlers/TapGestureHandler.ts +275 -0
  348. package/src/web/interfaces.ts +114 -0
  349. package/src/web/tools/EventManager.ts +186 -0
  350. package/src/web/tools/GestureHandlerOrchestrator.ts +329 -0
  351. package/src/web/tools/InteractionManager.ts +108 -0
  352. package/src/web/tools/NodeManager.ts +43 -0
  353. package/src/web/tools/PointerTracker.ts +130 -0
  354. package/src/{web → web_hammer}/DiscreteGestureHandler.ts +0 -0
  355. package/src/{web → web_hammer}/DraggingGestureHandler.ts +0 -0
  356. package/src/{web → web_hammer}/Errors.ts +0 -0
  357. package/src/{web → web_hammer}/FlingGestureHandler.ts +0 -0
  358. package/src/{web → web_hammer}/GestureHandler.ts +102 -55
  359. package/src/{web → web_hammer}/IndiscreteGestureHandler.ts +0 -0
  360. package/src/{web → web_hammer}/LongPressGestureHandler.ts +0 -0
  361. package/src/{web → web_hammer}/NativeViewGestureHandler.ts +4 -0
  362. package/src/{web → web_hammer}/NodeManager.ts +6 -3
  363. package/src/{web → web_hammer}/PanGestureHandler.ts +0 -0
  364. package/src/{web → web_hammer}/PinchGestureHandler.ts +0 -0
  365. package/src/{web → web_hammer}/PressGestureHandler.ts +0 -0
  366. package/src/{web → web_hammer}/RotationGestureHandler.ts +0 -0
  367. package/src/{web → web_hammer}/TapGestureHandler.ts +0 -0
  368. package/src/web_hammer/constants.ts +48 -0
  369. package/src/{web → web_hammer}/utils.ts +1 -1
  370. package/android/src/main/jni/Android.mk +0 -53
  371. package/android/src/main/jni/OnLoad.cpp +0 -9
  372. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.cpp +0 -71
  373. package/android/src/main/jni/RNGestureHandlerComponentsRegistry.h +0 -34
  374. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  375. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
  376. package/lib/commonjs/web/GestureHandler.js.map +0 -1
  377. package/lib/commonjs/web/NativeViewGestureHandler.js.map +0 -1
  378. package/lib/commonjs/web/NodeManager.js.map +0 -1
  379. package/lib/module/web/GestureHandler.js.map +0 -1
  380. package/lib/module/web/NativeViewGestureHandler.js.map +0 -1
  381. package/lib/module/web/NodeManager.js.map +0 -1
  382. package/lib/typescript/web/NodeManager.d.ts +0 -8
@@ -1,7 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import {
3
3
  Platform,
4
- Touchable,
5
4
  UIManager,
6
5
  DeviceEventEmitter,
7
6
  EmitterSubscription,
@@ -26,8 +25,9 @@ import {
26
25
  scheduleFlushOperations,
27
26
  } from './gestureHandlerCommon';
28
27
  import { ValueOf } from '../typeUtils';
29
- import { isFabric, isJestEnv } from '../utils';
28
+ import { isFabric, isJestEnv, tagMessage } from '../utils';
30
29
  import { ActionType } from '../ActionType';
30
+ import { PressabilityDebugView } from './PressabilityDebugView';
31
31
 
32
32
  const UIManagerAny = UIManager as any;
33
33
 
@@ -148,6 +148,8 @@ type InternalEventHandlers = {
148
148
  onGestureHandlerStateChange?: (event: any) => void;
149
149
  };
150
150
 
151
+ const UNRESOLVED_REFS_RETRY_LIMIT = 1;
152
+
151
153
  // TODO(TS) - make sure that BaseGestureHandlerProps doesn't need other generic parameter to work with custom properties.
152
154
  export default function createHandler<
153
155
  T extends BaseGestureHandlerProps<U>,
@@ -198,7 +200,7 @@ export default function createHandler<
198
200
  'toggleElementInspector',
199
201
  () => {
200
202
  this.setState((_) => ({ allowTouches }));
201
- this.update();
203
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
202
204
  }
203
205
  );
204
206
  }
@@ -211,7 +213,7 @@ export default function createHandler<
211
213
  // be resolved by then.
212
214
  this.updateEnqueued = setImmediate(() => {
213
215
  this.updateEnqueued = null;
214
- this.update();
216
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
215
217
  });
216
218
  }
217
219
 
@@ -231,7 +233,7 @@ export default function createHandler<
231
233
  if (this.viewTag !== viewTag) {
232
234
  this.attachGestureHandler(viewTag as number); // TODO(TS) - check interaction between _viewTag & findNodeHandle
233
235
  }
234
- this.update();
236
+ this.update(UNRESOLVED_REFS_RETRY_LIMIT);
235
237
  }
236
238
 
237
239
  componentWillUnmount() {
@@ -361,14 +363,26 @@ export default function createHandler<
361
363
  scheduleFlushOperations();
362
364
  };
363
365
 
364
- private update() {
365
- const newConfig = filterConfig(
366
- transformProps ? transformProps(this.props) : this.props,
367
- [...allowedProps, ...customNativeProps],
368
- config
369
- );
370
- if (!deepEqual(this.config, newConfig)) {
371
- this.updateGestureHandler(newConfig);
366
+ private update(remainingTries: number) {
367
+ const props: HandlerProps<U> = this.props;
368
+
369
+ // When ref is set via a function i.e. `ref={(r) => refObject.current = r}` instead of
370
+ // `ref={refObject}` it's possible that it won't be resolved in time. Seems like trying
371
+ // again is easy enough fix.
372
+ if (hasUnresolvedRefs(props) && remainingTries > 0) {
373
+ this.updateEnqueued = setImmediate(() => {
374
+ this.updateEnqueued = null;
375
+ this.update(remainingTries - 1);
376
+ });
377
+ } else {
378
+ const newConfig = filterConfig(
379
+ transformProps ? transformProps(this.props) : this.props,
380
+ [...allowedProps, ...customNativeProps],
381
+ config
382
+ );
383
+ if (!deepEqual(this.config, newConfig)) {
384
+ this.updateGestureHandler(newConfig);
385
+ }
372
386
  }
373
387
  }
374
388
 
@@ -393,6 +407,7 @@ export default function createHandler<
393
407
  onGestureEvent,
394
408
  onGestureHandlerEvent,
395
409
  }: OnGestureEventHandlers = this.props;
410
+
396
411
  if (onGestureEvent && typeof onGestureEvent !== 'function') {
397
412
  // If it's not a method it should be an native Animated.event
398
413
  // object. We set it directly as the handler for the view
@@ -455,10 +470,20 @@ export default function createHandler<
455
470
 
456
471
  this.propsRef.current = events;
457
472
 
458
- const child: any = React.Children.only(this.props.children);
473
+ let child: any = null;
474
+ try {
475
+ child = React.Children.only(this.props.children);
476
+ } catch (e) {
477
+ throw new Error(
478
+ tagMessage(
479
+ `${name} got more than one view as a child. If you want the gesture to work on multiple views, wrap them with a common parent and attach the gesture to that view.`
480
+ )
481
+ );
482
+ }
483
+
459
484
  let grandChildren = child.props.children;
460
485
  if (
461
- Touchable.TOUCH_TARGET_DEBUG &&
486
+ __DEV__ &&
462
487
  child.type &&
463
488
  (child.type === 'RNGestureHandlerButton' ||
464
489
  child.type.name === 'View' ||
@@ -466,10 +491,11 @@ export default function createHandler<
466
491
  ) {
467
492
  grandChildren = React.Children.toArray(grandChildren);
468
493
  grandChildren.push(
469
- Touchable.renderDebugView({
470
- color: 'mediumspringgreen',
471
- hitSlop: child.props.hitSlop,
472
- })
494
+ <PressabilityDebugView
495
+ key="pressabilityDebugView"
496
+ color="mediumspringgreen"
497
+ hitSlop={child.props.hitSlop}
498
+ />
473
499
  );
474
500
  }
475
501
 
@@ -126,6 +126,8 @@ export type BaseGestureHandlerProps<
126
126
  onHandlerStateChange?: (
127
127
  event: HandlerStateChangeEvent<ExtraEventPayloadT>
128
128
  ) => void;
129
+ // implicit `children` prop has been removed in @types/react^18.0.0
130
+ children?: React.ReactNode;
129
131
  };
130
132
 
131
133
  function isConfigParam(param: unknown, name: string) {
@@ -40,6 +40,8 @@ import { getShadowNodeFromRef } from '../../getShadowNodeFromRef';
40
40
  import { Platform } from 'react-native';
41
41
  import type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';
42
42
  import { onGestureHandlerEvent } from './eventReceiver';
43
+ import { RNRenderer } from '../../RNRenderer';
44
+ import { isExperimentalWebImplementationEnabled } from '../../EnableExperimentalWebImplementation';
43
45
 
44
46
  declare const global: {
45
47
  isFormsStackingContext: (node: unknown) => boolean | null; // JSI function
@@ -116,6 +118,9 @@ function checkGestureCallbacksForWorklets(gesture: GestureType) {
116
118
 
117
119
  interface WebEventHandler {
118
120
  onGestureHandlerEvent: (event: HandlerStateChangeEvent<unknown>) => void;
121
+ onGestureHandlerStateChange?: (
122
+ event: HandlerStateChangeEvent<unknown>
123
+ ) => void;
119
124
  }
120
125
 
121
126
  interface AttachHandlersConfig {
@@ -268,11 +273,34 @@ function updateHandlers(
268
273
  }
269
274
 
270
275
  if (preparedGesture.animatedHandlers) {
271
- preparedGesture.animatedHandlers.value = (preparedGesture.config
276
+ const previousHandlersValue =
277
+ preparedGesture.animatedHandlers.value ?? [];
278
+ const newHandlersValue = (preparedGesture.config
272
279
  .filter((g) => g.shouldUseReanimated) // ignore gestures that shouldn't run on UI
273
280
  .map((g) => g.handlers) as unknown) as HandlerCallbacks<
274
281
  Record<string, unknown>
275
282
  >[];
283
+
284
+ // if amount of gesture configs changes, we need to update the callbacks in shared value
285
+ let shouldUpdateSharedValue =
286
+ previousHandlersValue.length !== newHandlersValue.length;
287
+
288
+ if (!shouldUpdateSharedValue) {
289
+ // if the amount is the same, we need to check if any of the configs inside has changed
290
+ for (let i = 0; i < newHandlersValue.length; i++) {
291
+ if (
292
+ // we can use the `gestureId` prop as it's unique for every config instance
293
+ newHandlersValue[i].gestureId !== previousHandlersValue[i].gestureId
294
+ ) {
295
+ shouldUpdateSharedValue = true;
296
+ break;
297
+ }
298
+ }
299
+ }
300
+
301
+ if (shouldUpdateSharedValue) {
302
+ preparedGesture.animatedHandlers.value = newHandlersValue;
303
+ }
276
304
  }
277
305
 
278
306
  scheduleFlushOperations();
@@ -299,90 +327,90 @@ function needsToReattach(
299
327
  return false;
300
328
  }
301
329
 
302
- function useAnimatedGesture(
303
- preparedGesture: GestureConfigReference,
304
- needsRebuild: boolean
305
- ) {
306
- if (!Reanimated) {
307
- return;
308
- }
330
+ function isStateChangeEvent(
331
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
332
+ ): event is GestureStateChangeEvent {
333
+ 'worklet';
334
+ // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point
335
+ return event.oldState != null;
336
+ }
309
337
 
310
- function isStateChangeEvent(
311
- event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
312
- ): event is GestureStateChangeEvent {
313
- 'worklet';
314
- // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point
315
- return event.oldState != null;
316
- }
338
+ function isTouchEvent(
339
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
340
+ ): event is GestureTouchEvent {
341
+ 'worklet';
342
+ return event.eventType != null;
343
+ }
317
344
 
318
- function isTouchEvent(
319
- event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
320
- ): event is GestureTouchEvent {
321
- 'worklet';
322
- return event.eventType != null;
345
+ function getHandler(
346
+ type: CALLBACK_TYPE,
347
+ gesture: HandlerCallbacks<Record<string, unknown>>
348
+ ) {
349
+ 'worklet';
350
+ switch (type) {
351
+ case CALLBACK_TYPE.BEGAN:
352
+ return gesture.onBegin;
353
+ case CALLBACK_TYPE.START:
354
+ return gesture.onStart;
355
+ case CALLBACK_TYPE.UPDATE:
356
+ return gesture.onUpdate;
357
+ case CALLBACK_TYPE.CHANGE:
358
+ return gesture.onChange;
359
+ case CALLBACK_TYPE.END:
360
+ return gesture.onEnd;
361
+ case CALLBACK_TYPE.FINALIZE:
362
+ return gesture.onFinalize;
363
+ case CALLBACK_TYPE.TOUCHES_DOWN:
364
+ return gesture.onTouchesDown;
365
+ case CALLBACK_TYPE.TOUCHES_MOVE:
366
+ return gesture.onTouchesMove;
367
+ case CALLBACK_TYPE.TOUCHES_UP:
368
+ return gesture.onTouchesUp;
369
+ case CALLBACK_TYPE.TOUCHES_CANCELLED:
370
+ return gesture.onTouchesCancelled;
323
371
  }
372
+ }
324
373
 
325
- function getHandler(
326
- type: CALLBACK_TYPE,
327
- gesture: HandlerCallbacks<Record<string, unknown>>
328
- ) {
329
- 'worklet';
330
- switch (type) {
331
- case CALLBACK_TYPE.BEGAN:
332
- return gesture.onBegin;
333
- case CALLBACK_TYPE.START:
334
- return gesture.onStart;
335
- case CALLBACK_TYPE.UPDATE:
336
- return gesture.onUpdate;
337
- case CALLBACK_TYPE.CHANGE:
338
- return gesture.onChange;
339
- case CALLBACK_TYPE.END:
340
- return gesture.onEnd;
341
- case CALLBACK_TYPE.FINALIZE:
342
- return gesture.onFinalize;
343
- case CALLBACK_TYPE.TOUCHES_DOWN:
344
- return gesture.onTouchesDown;
345
- case CALLBACK_TYPE.TOUCHES_MOVE:
346
- return gesture.onTouchesMove;
347
- case CALLBACK_TYPE.TOUCHES_UP:
348
- return gesture.onTouchesUp;
349
- case CALLBACK_TYPE.TOUCHES_CANCELLED:
350
- return gesture.onTouchesCancelled;
351
- }
374
+ function touchEventTypeToCallbackType(
375
+ eventType: TouchEventType
376
+ ): CALLBACK_TYPE {
377
+ 'worklet';
378
+ switch (eventType) {
379
+ case TouchEventType.TOUCHES_DOWN:
380
+ return CALLBACK_TYPE.TOUCHES_DOWN;
381
+ case TouchEventType.TOUCHES_MOVE:
382
+ return CALLBACK_TYPE.TOUCHES_MOVE;
383
+ case TouchEventType.TOUCHES_UP:
384
+ return CALLBACK_TYPE.TOUCHES_UP;
385
+ case TouchEventType.TOUCHES_CANCELLED:
386
+ return CALLBACK_TYPE.TOUCHES_CANCELLED;
352
387
  }
388
+ return CALLBACK_TYPE.UNDEFINED;
389
+ }
353
390
 
354
- function touchEventTypeToCallbackType(
355
- eventType: TouchEventType
356
- ): CALLBACK_TYPE {
357
- 'worklet';
358
- switch (eventType) {
359
- case TouchEventType.TOUCHES_DOWN:
360
- return CALLBACK_TYPE.TOUCHES_DOWN;
361
- case TouchEventType.TOUCHES_MOVE:
362
- return CALLBACK_TYPE.TOUCHES_MOVE;
363
- case TouchEventType.TOUCHES_UP:
364
- return CALLBACK_TYPE.TOUCHES_UP;
365
- case TouchEventType.TOUCHES_CANCELLED:
366
- return CALLBACK_TYPE.TOUCHES_CANCELLED;
367
- }
368
- return CALLBACK_TYPE.UNDEFINED;
391
+ function runWorklet(
392
+ type: CALLBACK_TYPE,
393
+ gesture: HandlerCallbacks<Record<string, unknown>>,
394
+ event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,
395
+ ...args: any[]
396
+ ) {
397
+ 'worklet';
398
+ const handler = getHandler(type, gesture);
399
+ if (gesture.isWorklet[type]) {
400
+ // @ts-ignore Logic below makes sure the correct event is send to the
401
+ // correct handler.
402
+ handler?.(event, ...args);
403
+ } else if (handler) {
404
+ console.warn(tagMessage('Animated gesture callback must be a worklet'));
369
405
  }
406
+ }
370
407
 
371
- function runWorklet(
372
- type: CALLBACK_TYPE,
373
- gesture: HandlerCallbacks<Record<string, unknown>>,
374
- event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,
375
- ...args: any[]
376
- ) {
377
- 'worklet';
378
- const handler = getHandler(type, gesture);
379
- if (gesture.isWorklet[type]) {
380
- // @ts-ignore Logic below makes sure the correct event is send to the
381
- // correct handler.
382
- handler?.(event, ...args);
383
- } else if (handler) {
384
- console.warn(tagMessage('Animated gesture callback must be a worklet'));
385
- }
408
+ function useAnimatedGesture(
409
+ preparedGesture: GestureConfigReference,
410
+ needsRebuild: boolean
411
+ ) {
412
+ if (!Reanimated) {
413
+ return;
386
414
  }
387
415
 
388
416
  // Hooks are called conditionally, but the condition is whether the
@@ -488,12 +516,56 @@ function useAnimatedGesture(
488
516
  preparedGesture.animatedHandlers = sharedHandlersCallbacks;
489
517
  }
490
518
 
519
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
520
+ function validateDetectorChildren(ref: any) {
521
+ // finds the first native view under the Wrap component and traverses the fiber tree upwards
522
+ // to check whether there is more than one native view as a pseudo-direct child of GestureDetector
523
+ // i.e. this is not ok:
524
+ // Wrap
525
+ // |
526
+ // / \
527
+ // / \
528
+ // / \
529
+ // / \
530
+ // NativeView NativeView
531
+ //
532
+ // but this is fine:
533
+ // Wrap
534
+ // |
535
+ // NativeView
536
+ // |
537
+ // / \
538
+ // / \
539
+ // / \
540
+ // / \
541
+ // NativeView NativeView
542
+ if (__DEV__ && Platform.OS !== 'web') {
543
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
544
+ const wrapType = ref._reactInternals.elementType;
545
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
546
+ let instance = RNRenderer.findHostInstance_DEPRECATED(ref)
547
+ ._internalFiberInstanceHandleDEV;
548
+
549
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
550
+ while (instance && instance.elementType !== wrapType) {
551
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
552
+ if (instance.sibling) {
553
+ throw new Error(
554
+ 'GestureDetector has more than one native view as its children. This can happen if you are using a custom component that renders multiple views, like React.Fragment. You should wrap content of GestureDetector with a <View> or <Animated.View>.'
555
+ );
556
+ }
557
+
558
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
559
+ instance = instance.return;
560
+ }
561
+ }
562
+ }
563
+
491
564
  interface GestureDetectorProps {
492
565
  gesture?: ComposedGesture | GestureType;
566
+ children?: React.ReactNode;
493
567
  }
494
- export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
495
- props
496
- ) => {
568
+ export const GestureDetector = (props: GestureDetectorProps) => {
497
569
  const gestureConfig = props.gesture;
498
570
  const gesture = gestureConfig?.toGestureArray?.() ?? [];
499
571
  const useReanimatedHook = gesture.some((g) => g.shouldUseReanimated);
@@ -503,6 +575,11 @@ export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
503
575
  onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {
504
576
  onGestureHandlerEvent(e.nativeEvent);
505
577
  },
578
+ onGestureHandlerStateChange: isExperimentalWebImplementationEnabled()
579
+ ? (e: HandlerStateChangeEvent<unknown>) => {
580
+ onGestureHandlerEvent(e.nativeEvent);
581
+ }
582
+ : undefined,
506
583
  });
507
584
 
508
585
  const preparedGesture = React.useRef<GestureConfigReference>({
@@ -539,6 +616,8 @@ export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
539
616
  useEffect(() => {
540
617
  firstRenderRef.current = true;
541
618
  const viewTag = findNodeHandle(viewRef.current) as number;
619
+
620
+ validateDetectorChildren(viewRef.current);
542
621
  attachHandlers({
543
622
  preparedGesture,
544
623
  gestureConfig,
@@ -557,6 +636,7 @@ export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
557
636
  const viewTag = findNodeHandle(viewRef.current) as number;
558
637
 
559
638
  if (needsToReattach(preparedGesture, gesture)) {
639
+ validateDetectorChildren(viewRef.current);
560
640
  dropHandlers(preparedGesture);
561
641
  attachHandlers({
562
642
  preparedGesture,
@@ -605,20 +685,32 @@ export const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (
605
685
  }
606
686
  };
607
687
 
608
- class Wrap extends React.Component<{ onGestureHandlerEvent?: unknown }> {
688
+ class Wrap extends React.Component<{
689
+ onGestureHandlerEvent?: unknown;
690
+ // implicit `children` prop has been removed in @types/react^18.0.0
691
+ children?: React.ReactNode;
692
+ }> {
609
693
  render() {
610
- // I don't think that fighting with types over such a simple function is worth it
611
- // The only thing it does is add 'collapsable: false' to the child component
612
- // to make sure it is in the native view hierarchy so the detector can find
613
- // correct viewTag to attach to.
614
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
615
- const child: any = React.Children.only(this.props.children);
616
- return React.cloneElement(
617
- child,
618
- { collapsable: false },
619
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
620
- child.props.children
621
- );
694
+ try {
695
+ // I don't think that fighting with types over such a simple function is worth it
696
+ // The only thing it does is add 'collapsable: false' to the child component
697
+ // to make sure it is in the native view hierarchy so the detector can find
698
+ // correct viewTag to attach to.
699
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
700
+ const child: any = React.Children.only(this.props.children);
701
+ return React.cloneElement(
702
+ child,
703
+ { collapsable: false },
704
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
705
+ child.props.children
706
+ );
707
+ } catch (e) {
708
+ throw new Error(
709
+ tagMessage(
710
+ `GestureDetector got more than one view as a child. If you want the gesture to work on multiple views, wrap them with a common parent and attach the gesture to that view.`
711
+ )
712
+ );
713
+ }
622
714
  }
623
715
  }
624
716
 
@@ -53,6 +53,7 @@ type TouchEventHandlerType = (
53
53
  ) => void;
54
54
 
55
55
  export type HandlerCallbacks<EventPayloadT extends Record<string, unknown>> = {
56
+ gestureId: number;
56
57
  handlerTag: number;
57
58
  onBegin?: (event: GestureStateChangeEvent<EventPayloadT>) => void;
58
59
  onStart?: (event: GestureStateChangeEvent<EventPayloadT>) => void;
@@ -115,17 +116,32 @@ export abstract class Gesture {
115
116
  abstract prepare(): void;
116
117
  }
117
118
 
119
+ let nextGestureId = 0;
118
120
  export abstract class BaseGesture<
119
121
  EventPayloadT extends Record<string, unknown>
120
122
  > extends Gesture {
123
+ private gestureId = -1;
121
124
  public handlerTag = -1;
122
125
  public handlerName = '';
123
126
  public config: BaseGestureConfig = {};
124
127
  public handlers: HandlerCallbacks<EventPayloadT> = {
128
+ gestureId: -1,
125
129
  handlerTag: -1,
126
130
  isWorklet: [],
127
131
  };
128
132
 
133
+ constructor() {
134
+ super();
135
+
136
+ // Used to check whether the gesture config has been updated when wrapping it
137
+ // with `useMemo`. Since every config will have a unique id, when the dependencies
138
+ // don't change, the config won't be recreated and the id will stay the same.
139
+ // If the id is different, it means that the config has changed and the gesture
140
+ // needs to be updated.
141
+ this.gestureId = nextGestureId++;
142
+ this.handlers.gestureId = this.gestureId;
143
+ }
144
+
129
145
  private addDependency(
130
146
  key: 'simultaneousWith' | 'requireToFail',
131
147
  gesture: Exclude<GestureRef, number>
@@ -13,14 +13,19 @@ const warningMessage = tagMessage(
13
13
  'react-native-reanimated is required in order to use synchronous state management'
14
14
  );
15
15
 
16
+ // check if reanimated module is available, but look for useSharedValue as conditional
17
+ // require of reanimated can sometimes return content of `utils.ts` file (?)
18
+ const REANIMATED_AVAILABLE = Reanimated?.useSharedValue !== undefined;
19
+ const setGestureState = Reanimated?.setGestureState;
20
+
16
21
  export const GestureStateManager = {
17
22
  create(handlerTag: number): GestureStateManagerType {
18
23
  'worklet';
19
24
  return {
20
25
  begin: () => {
21
26
  'worklet';
22
- if (Reanimated) {
23
- Reanimated.setGestureState(handlerTag, State.BEGAN);
27
+ if (REANIMATED_AVAILABLE) {
28
+ setGestureState(handlerTag, State.BEGAN);
24
29
  } else {
25
30
  console.warn(warningMessage);
26
31
  }
@@ -28,8 +33,8 @@ export const GestureStateManager = {
28
33
 
29
34
  activate: () => {
30
35
  'worklet';
31
- if (Reanimated) {
32
- Reanimated.setGestureState(handlerTag, State.ACTIVE);
36
+ if (REANIMATED_AVAILABLE) {
37
+ setGestureState(handlerTag, State.ACTIVE);
33
38
  } else {
34
39
  console.warn(warningMessage);
35
40
  }
@@ -37,8 +42,8 @@ export const GestureStateManager = {
37
42
 
38
43
  fail: () => {
39
44
  'worklet';
40
- if (Reanimated) {
41
- Reanimated.setGestureState(handlerTag, State.FAILED);
45
+ if (REANIMATED_AVAILABLE) {
46
+ setGestureState(handlerTag, State.FAILED);
42
47
  } else {
43
48
  console.warn(warningMessage);
44
49
  }
@@ -46,8 +51,8 @@ export const GestureStateManager = {
46
51
 
47
52
  end: () => {
48
53
  'worklet';
49
- if (Reanimated) {
50
- Reanimated.setGestureState(handlerTag, State.END);
54
+ if (REANIMATED_AVAILABLE) {
55
+ setGestureState(handlerTag, State.END);
51
56
  } else {
52
57
  console.warn(warningMessage);
53
58
  }
@@ -131,6 +131,11 @@ export class PanGesture extends ContinousBaseGesture<
131
131
  return this;
132
132
  }
133
133
 
134
+ activateAfterLongPress(duration: number) {
135
+ this.config.activateAfterLongPress = duration;
136
+ return this;
137
+ }
138
+
134
139
  onChange(
135
140
  callback: (
136
141
  event: GestureUpdateEvent<
@@ -30,6 +30,13 @@ let Reanimated: {
30
30
  try {
31
31
  Reanimated = require('react-native-reanimated');
32
32
 
33
+ if (!Reanimated.useSharedValue) {
34
+ // @ts-ignore Make sure the loaded module is actually Reanimated, if it's not
35
+ // reset the module to undefined so we can fallback to the default implementation
36
+ Reanimated = undefined;
37
+ throw new Error('react-native-reanimated is not found');
38
+ }
39
+
33
40
  if (!Reanimated.setGestureState) {
34
41
  Reanimated.setGestureState = () => {
35
42
  'worklet';
package/src/index.ts CHANGED
@@ -105,6 +105,7 @@ export {
105
105
  TextInput,
106
106
  DrawerLayoutAndroid,
107
107
  FlatList,
108
+ RefreshControl,
108
109
  } from './components/GestureComponents';
109
110
  export type {
110
111
  //events
@@ -156,4 +157,6 @@ export type {
156
157
  } from './components/DrawerLayout';
157
158
  export { default as DrawerLayout } from './components/DrawerLayout';
158
159
 
160
+ export { enableExperimentalWebImplementation } from './EnableExperimentalWebImplementation';
161
+
159
162
  initialize();
package/src/utils.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { version as rnVersion } from 'react-native/package.json';
1
+ import pack from 'react-native/package.json';
2
+
3
+ const rnVersion = pack.version;
2
4
 
3
5
  export function toArray<T>(object: T | T[]): T[] {
4
6
  if (!Array.isArray(object)) {