react-native-gesture-handler 2.16.1 → 2.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (369) hide show
  1. package/README.md +9 -3
  2. package/android/build.gradle +105 -0
  3. package/android/gradle.properties +7 -0
  4. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +7 -7
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +16 -8
  6. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +9 -5
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +4 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +1 -0
  10. package/apple/RNGestureHandlerButtonComponentView.mm +10 -0
  11. package/apple/RNGestureHandlerModule.mm +2 -3
  12. package/lib/commonjs/RNGestureHandlerModule.js +4 -97
  13. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  14. package/lib/commonjs/RNGestureHandlerModule.web.js +109 -0
  15. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -0
  16. package/lib/commonjs/RNRenderer.js +10 -5
  17. package/lib/commonjs/RNRenderer.js.map +1 -1
  18. package/lib/commonjs/RNRenderer.web.js +11 -0
  19. package/lib/commonjs/RNRenderer.web.js.map +1 -0
  20. package/lib/commonjs/components/GestureButtons.js +27 -12
  21. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  22. package/lib/commonjs/components/GestureComponents.js +82 -19
  23. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  24. package/lib/commonjs/components/GestureComponents.web.js +52 -0
  25. package/lib/commonjs/components/GestureComponents.web.js.map +1 -0
  26. package/lib/commonjs/components/GestureHandlerButton.js +3 -13
  27. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  28. package/lib/commonjs/components/GestureHandlerButton.web.js +24 -0
  29. package/lib/commonjs/components/GestureHandlerButton.web.js.map +1 -0
  30. package/lib/commonjs/components/GestureHandlerRootView.js +6 -0
  31. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  32. package/lib/commonjs/components/{GestureHandlerRootView.native.js → GestureHandlerRootView.web.js} +1 -7
  33. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -0
  34. package/lib/commonjs/getReactNativeVersion.js +12 -1
  35. package/lib/commonjs/getReactNativeVersion.js.map +1 -1
  36. package/lib/commonjs/getReactNativeVersion.web.js +11 -0
  37. package/lib/commonjs/getReactNativeVersion.web.js.map +1 -0
  38. package/lib/commonjs/getShadowNodeFromRef.js +34 -5
  39. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  40. package/lib/commonjs/getShadowNodeFromRef.web.js +15 -0
  41. package/lib/commonjs/getShadowNodeFromRef.web.js.map +1 -0
  42. package/lib/commonjs/handlers/PressabilityDebugView.js +7 -5
  43. package/lib/commonjs/handlers/PressabilityDebugView.js.map +1 -1
  44. package/lib/commonjs/handlers/PressabilityDebugView.web.js +12 -0
  45. package/lib/commonjs/handlers/PressabilityDebugView.web.js.map +1 -0
  46. package/lib/commonjs/handlers/createHandler.js +1 -3
  47. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  48. package/lib/commonjs/handlers/customDirectEventTypes.js +8 -5
  49. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -1
  50. package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
  51. package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
  52. package/lib/commonjs/handlers/gestureHandlerCommon.js +3 -3
  53. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  54. package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.js +42 -0
  55. package/lib/commonjs/handlers/gestures/GestureDetector/Wrap.js.map +1 -0
  56. package/lib/commonjs/handlers/gestures/GestureDetector/attachHandlers.js +83 -0
  57. package/lib/commonjs/handlers/gestures/GestureDetector/attachHandlers.js.map +1 -0
  58. package/lib/commonjs/handlers/gestures/GestureDetector/dropHandlers.js +25 -0
  59. package/lib/commonjs/handlers/gestures/GestureDetector/dropHandlers.js.map +1 -0
  60. package/lib/commonjs/handlers/gestures/GestureDetector/index.js +143 -0
  61. package/lib/commonjs/handlers/gestures/GestureDetector/index.js.map +1 -0
  62. package/lib/commonjs/handlers/gestures/GestureDetector/needsToReattach.js +25 -0
  63. package/lib/commonjs/handlers/gestures/GestureDetector/needsToReattach.js.map +1 -0
  64. package/lib/commonjs/handlers/gestures/GestureDetector/types.js +6 -0
  65. package/lib/commonjs/handlers/gestures/GestureDetector/types.js.map +1 -0
  66. package/lib/commonjs/handlers/gestures/GestureDetector/updateHandlers.js +80 -0
  67. package/lib/commonjs/handlers/gestures/GestureDetector/updateHandlers.js.map +1 -0
  68. package/lib/commonjs/handlers/gestures/GestureDetector/useAnimatedGesture.js +180 -0
  69. package/lib/commonjs/handlers/gestures/GestureDetector/useAnimatedGesture.js.map +1 -0
  70. package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js +55 -0
  71. package/lib/commonjs/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -0
  72. package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js +47 -0
  73. package/lib/commonjs/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -0
  74. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +176 -0
  75. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js.map +1 -0
  76. package/lib/commonjs/handlers/gestures/gestureComposition.js +3 -1
  77. package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -1
  78. package/lib/commonjs/handlers/gestures/gestureStateManager.js +8 -0
  79. package/lib/commonjs/handlers/gestures/gestureStateManager.js.map +1 -1
  80. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  81. package/lib/commonjs/utils.js +36 -0
  82. package/lib/commonjs/utils.js.map +1 -1
  83. package/lib/commonjs/web/detectors/RotationGestureDetector.js +6 -8
  84. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  85. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +5 -6
  86. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
  87. package/lib/commonjs/web/handlers/FlingGestureHandler.js +1 -0
  88. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  89. package/lib/commonjs/web/handlers/GestureHandler.js +56 -64
  90. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  91. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +1 -0
  92. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  93. package/lib/commonjs/web/handlers/ManualGestureHandler.js +1 -0
  94. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
  95. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +7 -4
  96. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  97. package/lib/commonjs/web/handlers/PanGestureHandler.js +28 -18
  98. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  99. package/lib/commonjs/web/handlers/PinchGestureHandler.js +1 -0
  100. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  101. package/lib/commonjs/web/handlers/RotationGestureHandler.js +1 -0
  102. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  103. package/lib/commonjs/web/handlers/TapGestureHandler.js +18 -12
  104. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  105. package/lib/commonjs/web/interfaces.js.map +1 -1
  106. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +1 -6
  107. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  108. package/lib/commonjs/web/tools/PointerEventManager.js +7 -2
  109. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  110. package/lib/commonjs/web/tools/PointerTracker.js +89 -57
  111. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  112. package/lib/commonjs/web/tools/TouchEventManager.js +6 -2
  113. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  114. package/lib/commonjs/web/tools/Vector.js +2 -1
  115. package/lib/commonjs/web/tools/Vector.js.map +1 -1
  116. package/lib/commonjs/web/utils.js +31 -0
  117. package/lib/commonjs/web/utils.js.map +1 -1
  118. package/lib/module/RNGestureHandlerModule.js +4 -84
  119. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  120. package/lib/module/RNGestureHandlerModule.web.js +85 -0
  121. package/lib/module/RNGestureHandlerModule.web.js.map +1 -0
  122. package/lib/module/RNRenderer.js +3 -3
  123. package/lib/module/RNRenderer.js.map +1 -1
  124. package/lib/module/RNRenderer.web.js +4 -0
  125. package/lib/module/RNRenderer.web.js.map +1 -0
  126. package/lib/module/components/GestureButtons.js +24 -6
  127. package/lib/module/components/GestureButtons.js.map +1 -1
  128. package/lib/module/components/GestureComponents.js +80 -18
  129. package/lib/module/components/GestureComponents.js.map +1 -1
  130. package/lib/module/components/GestureComponents.web.js +28 -0
  131. package/lib/module/components/GestureComponents.web.js.map +1 -0
  132. package/lib/module/components/GestureHandlerButton.js +2 -8
  133. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  134. package/lib/module/components/GestureHandlerButton.web.js +9 -0
  135. package/lib/module/components/GestureHandlerButton.web.js.map +1 -0
  136. package/lib/module/components/GestureHandlerRootView.js +5 -0
  137. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  138. package/lib/module/components/{GestureHandlerRootView.native.js → GestureHandlerRootView.web.js} +1 -6
  139. package/lib/module/components/GestureHandlerRootView.web.js.map +1 -0
  140. package/lib/module/getReactNativeVersion.js +7 -1
  141. package/lib/module/getReactNativeVersion.js.map +1 -1
  142. package/lib/module/getReactNativeVersion.web.js +4 -0
  143. package/lib/module/getReactNativeVersion.web.js.map +1 -0
  144. package/lib/module/getShadowNodeFromRef.js +33 -4
  145. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  146. package/lib/module/getShadowNodeFromRef.web.js +8 -0
  147. package/lib/module/getShadowNodeFromRef.web.js.map +1 -0
  148. package/lib/module/handlers/PressabilityDebugView.js +2 -4
  149. package/lib/module/handlers/PressabilityDebugView.js.map +1 -1
  150. package/lib/module/handlers/PressabilityDebugView.web.js +5 -0
  151. package/lib/module/handlers/PressabilityDebugView.web.js.map +1 -0
  152. package/lib/module/handlers/createHandler.js +2 -4
  153. package/lib/module/handlers/createHandler.js.map +1 -1
  154. package/lib/module/handlers/customDirectEventTypes.js +2 -4
  155. package/lib/module/handlers/customDirectEventTypes.js.map +1 -1
  156. package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
  157. package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
  158. package/lib/module/handlers/gestureHandlerCommon.js +1 -1
  159. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  160. package/lib/module/handlers/gestures/GestureDetector/Wrap.js +26 -0
  161. package/lib/module/handlers/gestures/GestureDetector/Wrap.js.map +1 -0
  162. package/lib/module/handlers/gestures/GestureDetector/attachHandlers.js +65 -0
  163. package/lib/module/handlers/gestures/GestureDetector/attachHandlers.js.map +1 -0
  164. package/lib/module/handlers/gestures/GestureDetector/dropHandlers.js +12 -0
  165. package/lib/module/handlers/gestures/GestureDetector/dropHandlers.js.map +1 -0
  166. package/lib/module/handlers/gestures/GestureDetector/index.js +115 -0
  167. package/lib/module/handlers/gestures/GestureDetector/index.js.map +1 -0
  168. package/lib/module/handlers/gestures/GestureDetector/needsToReattach.js +18 -0
  169. package/lib/module/handlers/gestures/GestureDetector/needsToReattach.js.map +1 -0
  170. package/lib/module/handlers/gestures/GestureDetector/types.js +2 -0
  171. package/lib/module/handlers/gestures/GestureDetector/types.js.map +1 -0
  172. package/lib/module/handlers/gestures/GestureDetector/updateHandlers.js +64 -0
  173. package/lib/module/handlers/gestures/GestureDetector/updateHandlers.js.map +1 -0
  174. package/lib/module/handlers/gestures/GestureDetector/useAnimatedGesture.js +165 -0
  175. package/lib/module/handlers/gestures/GestureDetector/useAnimatedGesture.js.map +1 -0
  176. package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js +41 -0
  177. package/lib/module/handlers/gestures/GestureDetector/useDetectorUpdater.js.map +1 -0
  178. package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js +36 -0
  179. package/lib/module/handlers/gestures/GestureDetector/useViewRefHandler.js.map +1 -0
  180. package/lib/module/handlers/gestures/GestureDetector/utils.js +142 -0
  181. package/lib/module/handlers/gestures/GestureDetector/utils.js.map +1 -0
  182. package/lib/module/handlers/gestures/gestureComposition.js +3 -1
  183. package/lib/module/handlers/gestures/gestureComposition.js.map +1 -1
  184. package/lib/module/handlers/gestures/gestureStateManager.js +8 -0
  185. package/lib/module/handlers/gestures/gestureStateManager.js.map +1 -1
  186. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  187. package/lib/module/utils.js +34 -0
  188. package/lib/module/utils.js.map +1 -1
  189. package/lib/module/web/detectors/RotationGestureDetector.js +6 -8
  190. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  191. package/lib/module/web/detectors/ScaleGestureDetector.js +5 -6
  192. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
  193. package/lib/module/web/handlers/FlingGestureHandler.js +1 -0
  194. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  195. package/lib/module/web/handlers/GestureHandler.js +56 -64
  196. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  197. package/lib/module/web/handlers/LongPressGestureHandler.js +1 -0
  198. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  199. package/lib/module/web/handlers/ManualGestureHandler.js +1 -0
  200. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
  201. package/lib/module/web/handlers/NativeViewGestureHandler.js +7 -4
  202. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  203. package/lib/module/web/handlers/PanGestureHandler.js +28 -18
  204. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  205. package/lib/module/web/handlers/PinchGestureHandler.js +1 -0
  206. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  207. package/lib/module/web/handlers/RotationGestureHandler.js +1 -0
  208. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  209. package/lib/module/web/handlers/TapGestureHandler.js +18 -12
  210. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  211. package/lib/module/web/interfaces.js.map +1 -1
  212. package/lib/module/web/tools/GestureHandlerOrchestrator.js +1 -6
  213. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  214. package/lib/module/web/tools/PointerEventManager.js +8 -3
  215. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  216. package/lib/module/web/tools/PointerTracker.js +89 -57
  217. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  218. package/lib/module/web/tools/TouchEventManager.js +7 -3
  219. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  220. package/lib/module/web/tools/Vector.js +2 -1
  221. package/lib/module/web/tools/Vector.js.map +1 -1
  222. package/lib/module/web/utils.js +29 -0
  223. package/lib/module/web/utils.js.map +1 -1
  224. package/lib/typescript/RNGestureHandlerModule.d.ts +2 -15
  225. package/lib/typescript/RNGestureHandlerModule.web.d.ts +15 -0
  226. package/lib/typescript/RNRenderer.d.ts +1 -3
  227. package/lib/typescript/RNRenderer.web.d.ts +3 -0
  228. package/lib/typescript/components/GestureButtons.d.ts +3 -34
  229. package/lib/typescript/components/GestureComponents.d.ts +21 -7
  230. package/lib/typescript/components/GestureComponents.web.d.ts +8 -0
  231. package/lib/typescript/components/GestureHandlerButton.d.ts +3 -3
  232. package/lib/typescript/components/GestureHandlerButton.web.d.ts +4 -0
  233. package/lib/typescript/getReactNativeVersion.d.ts +4 -1
  234. package/lib/typescript/getReactNativeVersion.web.d.ts +1 -0
  235. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -1
  236. package/lib/typescript/getShadowNodeFromRef.web.d.ts +1 -0
  237. package/lib/typescript/handlers/PressabilityDebugView.d.ts +1 -1
  238. package/lib/typescript/handlers/PressabilityDebugView.web.d.ts +1 -0
  239. package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -2
  240. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
  241. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -2
  242. package/lib/typescript/handlers/gestures/GestureDetector/Wrap.d.ts +13 -0
  243. package/lib/typescript/handlers/gestures/GestureDetector/attachHandlers.d.ts +13 -0
  244. package/lib/typescript/handlers/gestures/GestureDetector/dropHandlers.d.ts +2 -0
  245. package/lib/typescript/handlers/gestures/{GestureDetector.d.ts → GestureDetector/index.d.ts} +4 -12
  246. package/lib/typescript/handlers/gestures/GestureDetector/needsToReattach.d.ts +3 -0
  247. package/lib/typescript/handlers/gestures/GestureDetector/types.d.ts +20 -0
  248. package/lib/typescript/handlers/gestures/GestureDetector/updateHandlers.d.ts +4 -0
  249. package/lib/typescript/handlers/gestures/GestureDetector/useAnimatedGesture.d.ts +2 -0
  250. package/lib/typescript/handlers/gestures/GestureDetector/useDetectorUpdater.d.ts +5 -0
  251. package/lib/typescript/handlers/gestures/GestureDetector/useViewRefHandler.d.ts +3 -0
  252. package/lib/typescript/handlers/gestures/GestureDetector/utils.d.ts +12 -0
  253. package/lib/typescript/handlers/gestures/reanimatedWrapper.d.ts +1 -1
  254. package/lib/typescript/utils.d.ts +10 -0
  255. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -0
  256. package/lib/typescript/web/interfaces.d.ts +1 -0
  257. package/lib/typescript/web/tools/PointerTracker.d.ts +34 -31
  258. package/lib/typescript/web/utils.d.ts +4 -0
  259. package/package.json +5 -5
  260. package/src/RNGestureHandlerModule.ts +4 -104
  261. package/src/RNGestureHandlerModule.web.ts +105 -0
  262. package/src/RNRenderer.ts +3 -3
  263. package/src/RNRenderer.web.ts +3 -0
  264. package/src/components/GestureButtons.tsx +36 -4
  265. package/src/components/GestureComponents.tsx +131 -24
  266. package/src/components/GestureComponents.web.tsx +41 -0
  267. package/src/components/GestureHandlerButton.tsx +4 -5
  268. package/src/components/GestureHandlerButton.web.tsx +6 -0
  269. package/src/components/GestureHandlerRootView.tsx +6 -0
  270. package/src/components/{GestureHandlerRootView.native.tsx → GestureHandlerRootView.web.tsx} +0 -6
  271. package/src/getReactNativeVersion.ts +9 -1
  272. package/src/getReactNativeVersion.web.ts +3 -0
  273. package/src/getShadowNodeFromRef.ts +41 -4
  274. package/src/getShadowNodeFromRef.web.ts +7 -0
  275. package/src/handlers/PressabilityDebugView.tsx +2 -4
  276. package/src/handlers/PressabilityDebugView.web.tsx +4 -0
  277. package/src/handlers/createHandler.tsx +1 -3
  278. package/src/handlers/customDirectEventTypes.ts +2 -5
  279. package/src/handlers/customDirectEventTypes.web.ts +5 -0
  280. package/src/handlers/gestureHandlerCommon.ts +4 -1
  281. package/src/handlers/gestures/GestureDetector/Wrap.tsx +35 -0
  282. package/src/handlers/gestures/GestureDetector/attachHandlers.ts +112 -0
  283. package/src/handlers/gestures/GestureDetector/dropHandlers.ts +14 -0
  284. package/src/handlers/gestures/GestureDetector/index.tsx +187 -0
  285. package/src/handlers/gestures/GestureDetector/needsToReattach.ts +27 -0
  286. package/src/handlers/gestures/GestureDetector/types.ts +32 -0
  287. package/src/handlers/gestures/GestureDetector/updateHandlers.ts +94 -0
  288. package/src/handlers/gestures/GestureDetector/useAnimatedGesture.ts +206 -0
  289. package/src/handlers/gestures/GestureDetector/useDetectorUpdater.ts +69 -0
  290. package/src/handlers/gestures/GestureDetector/useViewRefHandler.ts +54 -0
  291. package/src/handlers/gestures/GestureDetector/utils.ts +185 -0
  292. package/src/handlers/gestures/gestureComposition.ts +2 -0
  293. package/src/handlers/gestures/gestureStateManager.ts +12 -4
  294. package/src/handlers/gestures/reanimatedWrapper.ts +19 -17
  295. package/src/utils.ts +39 -0
  296. package/src/web/detectors/RotationGestureDetector.ts +6 -8
  297. package/src/web/detectors/ScaleGestureDetector.ts +5 -6
  298. package/src/web/handlers/FlingGestureHandler.ts +2 -0
  299. package/src/web/handlers/GestureHandler.ts +53 -62
  300. package/src/web/handlers/LongPressGestureHandler.ts +2 -0
  301. package/src/web/handlers/ManualGestureHandler.ts +2 -0
  302. package/src/web/handlers/NativeViewGestureHandler.ts +8 -4
  303. package/src/web/handlers/PanGestureHandler.ts +32 -19
  304. package/src/web/handlers/PinchGestureHandler.ts +2 -0
  305. package/src/web/handlers/RotationGestureHandler.ts +2 -0
  306. package/src/web/handlers/TapGestureHandler.ts +20 -12
  307. package/src/web/interfaces.ts +1 -0
  308. package/src/web/tools/GestureHandlerOrchestrator.ts +1 -7
  309. package/src/web/tools/PointerEventManager.ts +10 -3
  310. package/src/web/tools/PointerTracker.ts +81 -74
  311. package/src/web/tools/TouchEventManager.ts +5 -3
  312. package/src/web/tools/Vector.ts +2 -4
  313. package/src/web/utils.ts +34 -0
  314. package/lib/commonjs/RNGestureHandlerModule.native.js +0 -16
  315. package/lib/commonjs/RNGestureHandlerModule.native.js.map +0 -1
  316. package/lib/commonjs/RNRenderer.native.js +0 -16
  317. package/lib/commonjs/RNRenderer.native.js.map +0 -1
  318. package/lib/commonjs/components/GestureComponents.native.js +0 -115
  319. package/lib/commonjs/components/GestureComponents.native.js.map +0 -1
  320. package/lib/commonjs/components/GestureHandlerButton.native.js +0 -14
  321. package/lib/commonjs/components/GestureHandlerButton.native.js.map +0 -1
  322. package/lib/commonjs/components/GestureHandlerRootView.native.js.map +0 -1
  323. package/lib/commonjs/getReactNativeVersion.native.js +0 -22
  324. package/lib/commonjs/getReactNativeVersion.native.js.map +0 -1
  325. package/lib/commonjs/getShadowNodeFromRef.native.js +0 -44
  326. package/lib/commonjs/getShadowNodeFromRef.native.js.map +0 -1
  327. package/lib/commonjs/handlers/PressabilityDebugView.native.js +0 -14
  328. package/lib/commonjs/handlers/PressabilityDebugView.native.js.map +0 -1
  329. package/lib/commonjs/handlers/customDirectEventTypes.native.js +0 -14
  330. package/lib/commonjs/handlers/customDirectEventTypes.native.js.map +0 -1
  331. package/lib/commonjs/handlers/gestures/GestureDetector.js +0 -704
  332. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +0 -1
  333. package/lib/module/RNGestureHandlerModule.native.js +0 -5
  334. package/lib/module/RNGestureHandlerModule.native.js.map +0 -1
  335. package/lib/module/RNRenderer.native.js +0 -4
  336. package/lib/module/RNRenderer.native.js.map +0 -1
  337. package/lib/module/components/GestureComponents.native.js +0 -90
  338. package/lib/module/components/GestureComponents.native.js.map +0 -1
  339. package/lib/module/components/GestureHandlerButton.native.js +0 -3
  340. package/lib/module/components/GestureHandlerButton.native.js.map +0 -1
  341. package/lib/module/components/GestureHandlerRootView.native.js.map +0 -1
  342. package/lib/module/getReactNativeVersion.native.js +0 -10
  343. package/lib/module/getReactNativeVersion.native.js.map +0 -1
  344. package/lib/module/getShadowNodeFromRef.native.js +0 -37
  345. package/lib/module/getShadowNodeFromRef.native.js.map +0 -1
  346. package/lib/module/handlers/PressabilityDebugView.native.js +0 -3
  347. package/lib/module/handlers/PressabilityDebugView.native.js.map +0 -1
  348. package/lib/module/handlers/customDirectEventTypes.native.js +0 -3
  349. package/lib/module/handlers/customDirectEventTypes.native.js.map +0 -1
  350. package/lib/module/handlers/gestures/GestureDetector.js +0 -654
  351. package/lib/module/handlers/gestures/GestureDetector.js.map +0 -1
  352. package/lib/typescript/RNGestureHandlerModule.native.d.ts +0 -2
  353. package/lib/typescript/RNRenderer.native.d.ts +0 -1
  354. package/lib/typescript/components/GestureComponents.native.d.ts +0 -22
  355. package/lib/typescript/components/GestureHandlerButton.native.d.ts +0 -4
  356. package/lib/typescript/getReactNativeVersion.native.d.ts +0 -4
  357. package/lib/typescript/getShadowNodeFromRef.native.d.ts +0 -1
  358. package/lib/typescript/handlers/PressabilityDebugView.native.d.ts +0 -1
  359. package/lib/typescript/handlers/customDirectEventTypes.native.d.ts +0 -1
  360. package/src/RNGestureHandlerModule.native.ts +0 -5
  361. package/src/RNRenderer.native.ts +0 -3
  362. package/src/components/GestureComponents.native.tsx +0 -148
  363. package/src/components/GestureHandlerButton.native.tsx +0 -5
  364. package/src/getReactNativeVersion.native.ts +0 -11
  365. package/src/getShadowNodeFromRef.native.ts +0 -44
  366. package/src/handlers/PressabilityDebugView.native.tsx +0 -2
  367. package/src/handlers/customDirectEventTypes.native.ts +0 -2
  368. package/src/handlers/gestures/GestureDetector.tsx +0 -894
  369. /package/lib/typescript/components/{GestureHandlerRootView.native.d.ts → GestureHandlerRootView.web.d.ts} +0 -0
@@ -0,0 +1,206 @@
1
+ import { HandlerCallbacks, CALLBACK_TYPE } from '../gesture';
2
+ import { Reanimated } from '../reanimatedWrapper';
3
+ import {
4
+ GestureTouchEvent,
5
+ GestureUpdateEvent,
6
+ GestureStateChangeEvent,
7
+ } from '../../gestureHandlerCommon';
8
+ import {
9
+ GestureStateManager,
10
+ GestureStateManagerType,
11
+ } from '../gestureStateManager';
12
+ import { State } from '../../../State';
13
+ import { TouchEventType } from '../../../TouchEventType';
14
+ import { tagMessage } from '../../../utils';
15
+ import { AttachedGestureState } from './types';
16
+
17
+ function getHandler(
18
+ type: CALLBACK_TYPE,
19
+ gesture: HandlerCallbacks<Record<string, unknown>>
20
+ ) {
21
+ 'worklet';
22
+ switch (type) {
23
+ case CALLBACK_TYPE.BEGAN:
24
+ return gesture.onBegin;
25
+ case CALLBACK_TYPE.START:
26
+ return gesture.onStart;
27
+ case CALLBACK_TYPE.UPDATE:
28
+ return gesture.onUpdate;
29
+ case CALLBACK_TYPE.CHANGE:
30
+ return gesture.onChange;
31
+ case CALLBACK_TYPE.END:
32
+ return gesture.onEnd;
33
+ case CALLBACK_TYPE.FINALIZE:
34
+ return gesture.onFinalize;
35
+ case CALLBACK_TYPE.TOUCHES_DOWN:
36
+ return gesture.onTouchesDown;
37
+ case CALLBACK_TYPE.TOUCHES_MOVE:
38
+ return gesture.onTouchesMove;
39
+ case CALLBACK_TYPE.TOUCHES_UP:
40
+ return gesture.onTouchesUp;
41
+ case CALLBACK_TYPE.TOUCHES_CANCELLED:
42
+ return gesture.onTouchesCancelled;
43
+ }
44
+ }
45
+
46
+ function touchEventTypeToCallbackType(
47
+ eventType: TouchEventType
48
+ ): CALLBACK_TYPE {
49
+ 'worklet';
50
+ switch (eventType) {
51
+ case TouchEventType.TOUCHES_DOWN:
52
+ return CALLBACK_TYPE.TOUCHES_DOWN;
53
+ case TouchEventType.TOUCHES_MOVE:
54
+ return CALLBACK_TYPE.TOUCHES_MOVE;
55
+ case TouchEventType.TOUCHES_UP:
56
+ return CALLBACK_TYPE.TOUCHES_UP;
57
+ case TouchEventType.TOUCHES_CANCELLED:
58
+ return CALLBACK_TYPE.TOUCHES_CANCELLED;
59
+ }
60
+ return CALLBACK_TYPE.UNDEFINED;
61
+ }
62
+
63
+ function runWorklet(
64
+ type: CALLBACK_TYPE,
65
+ gesture: HandlerCallbacks<Record<string, unknown>>,
66
+ event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,
67
+ ...args: unknown[]
68
+ ) {
69
+ 'worklet';
70
+ const handler = getHandler(type, gesture);
71
+ if (gesture.isWorklet[type]) {
72
+ // @ts-ignore Logic below makes sure the correct event is send to the
73
+ // correct handler.
74
+ handler?.(event, ...args);
75
+ } else if (handler) {
76
+ console.warn(tagMessage('Animated gesture callback must be a worklet'));
77
+ }
78
+ }
79
+
80
+ function isStateChangeEvent(
81
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
82
+ ): event is GestureStateChangeEvent {
83
+ 'worklet';
84
+ // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point
85
+ return event.oldState != null;
86
+ }
87
+
88
+ function isTouchEvent(
89
+ event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent
90
+ ): event is GestureTouchEvent {
91
+ 'worklet';
92
+ return event.eventType != null;
93
+ }
94
+
95
+ export function useAnimatedGesture(
96
+ preparedGesture: AttachedGestureState,
97
+ needsRebuild: boolean
98
+ ) {
99
+ if (!Reanimated) {
100
+ return;
101
+ }
102
+
103
+ // Hooks are called conditionally, but the condition is whether the
104
+ // react-native-reanimated is installed, which shouldn't change while running
105
+ // eslint-disable-next-line react-hooks/rules-of-hooks
106
+ const sharedHandlersCallbacks = Reanimated.useSharedValue<
107
+ HandlerCallbacks<Record<string, unknown>>[] | null
108
+ >(null);
109
+
110
+ // eslint-disable-next-line react-hooks/rules-of-hooks
111
+ const lastUpdateEvent = Reanimated.useSharedValue<
112
+ (GestureUpdateEvent | undefined)[]
113
+ >([]);
114
+
115
+ // not every gesture needs a state controller, init them lazily
116
+ const stateControllers: GestureStateManagerType[] = [];
117
+
118
+ const callback = (
119
+ event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent
120
+ ) => {
121
+ 'worklet';
122
+
123
+ const currentCallback = sharedHandlersCallbacks.value;
124
+ if (!currentCallback) {
125
+ return;
126
+ }
127
+
128
+ for (let i = 0; i < currentCallback.length; i++) {
129
+ const gesture = currentCallback[i];
130
+
131
+ if (event.handlerTag !== gesture.handlerTag) {
132
+ continue;
133
+ }
134
+
135
+ if (isStateChangeEvent(event)) {
136
+ if (
137
+ event.oldState === State.UNDETERMINED &&
138
+ event.state === State.BEGAN
139
+ ) {
140
+ runWorklet(CALLBACK_TYPE.BEGAN, gesture, event);
141
+ } else if (
142
+ (event.oldState === State.BEGAN ||
143
+ event.oldState === State.UNDETERMINED) &&
144
+ event.state === State.ACTIVE
145
+ ) {
146
+ runWorklet(CALLBACK_TYPE.START, gesture, event);
147
+ lastUpdateEvent.value[gesture.handlerTag] = undefined;
148
+ } else if (
149
+ event.oldState !== event.state &&
150
+ event.state === State.END
151
+ ) {
152
+ if (event.oldState === State.ACTIVE) {
153
+ runWorklet(CALLBACK_TYPE.END, gesture, event, true);
154
+ }
155
+ runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, true);
156
+ } else if (
157
+ (event.state === State.FAILED || event.state === State.CANCELLED) &&
158
+ event.state !== event.oldState
159
+ ) {
160
+ if (event.oldState === State.ACTIVE) {
161
+ runWorklet(CALLBACK_TYPE.END, gesture, event, false);
162
+ }
163
+ runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, false);
164
+ }
165
+ } else if (isTouchEvent(event)) {
166
+ if (!stateControllers[i]) {
167
+ stateControllers[i] = GestureStateManager.create(event.handlerTag);
168
+ }
169
+
170
+ if (event.eventType !== TouchEventType.UNDETERMINED) {
171
+ runWorklet(
172
+ touchEventTypeToCallbackType(event.eventType),
173
+ gesture,
174
+ event,
175
+ stateControllers[i]
176
+ );
177
+ }
178
+ } else {
179
+ runWorklet(CALLBACK_TYPE.UPDATE, gesture, event);
180
+
181
+ if (gesture.onChange && gesture.changeEventCalculator) {
182
+ runWorklet(
183
+ CALLBACK_TYPE.CHANGE,
184
+ gesture,
185
+ gesture.changeEventCalculator?.(
186
+ event,
187
+ lastUpdateEvent.value[gesture.handlerTag]
188
+ )
189
+ );
190
+
191
+ lastUpdateEvent.value[gesture.handlerTag] = event;
192
+ }
193
+ }
194
+ }
195
+ };
196
+
197
+ // eslint-disable-next-line react-hooks/rules-of-hooks
198
+ const event = Reanimated.useEvent(
199
+ callback,
200
+ ['onGestureHandlerStateChange', 'onGestureHandlerEvent'],
201
+ needsRebuild
202
+ );
203
+
204
+ preparedGesture.animatedEventHandler = event;
205
+ preparedGesture.animatedHandlers = sharedHandlersCallbacks;
206
+ }
@@ -0,0 +1,69 @@
1
+ import React, { useCallback } from 'react';
2
+ import { findNodeHandle } from 'react-native';
3
+ import { GestureType } from '../gesture';
4
+ import { ComposedGesture } from '../gestureComposition';
5
+
6
+ import {
7
+ AttachedGestureState,
8
+ GestureDetectorState,
9
+ WebEventHandler,
10
+ } from './types';
11
+ import { attachHandlers } from './attachHandlers';
12
+ import { updateHandlers } from './updateHandlers';
13
+ import { needsToReattach } from './needsToReattach';
14
+ import { dropHandlers } from './dropHandlers';
15
+ import { useForceRender, validateDetectorChildren } from './utils';
16
+
17
+ // Returns a function that's responsible for updating the attached gestures
18
+ // If the view has changed, it will reattach the handlers to the new view
19
+ // If the view remains the same, it will update the handlers with the new config
20
+ export function useDetectorUpdater(
21
+ state: GestureDetectorState,
22
+ preparedGesture: AttachedGestureState,
23
+ gesturesToAttach: GestureType[],
24
+ gestureConfig: ComposedGesture | GestureType,
25
+ webEventHandlersRef: React.RefObject<WebEventHandler>
26
+ ) {
27
+ const forceRender = useForceRender();
28
+ const updateAttachedGestures = useCallback(
29
+ // skipConfigUpdate is used to prevent unnecessary updates when only checking if the view has changed
30
+ (skipConfigUpdate?: boolean) => {
31
+ // if the underlying view has changed we need to reattach handlers to the new view
32
+ const viewTag = findNodeHandle(state.viewRef) as number;
33
+ const didUnderlyingViewChange = viewTag !== state.previousViewTag;
34
+
35
+ if (
36
+ didUnderlyingViewChange ||
37
+ needsToReattach(preparedGesture, gesturesToAttach)
38
+ ) {
39
+ validateDetectorChildren(state.viewRef);
40
+ dropHandlers(preparedGesture);
41
+ attachHandlers({
42
+ preparedGesture,
43
+ gestureConfig,
44
+ gesturesToAttach,
45
+ webEventHandlersRef,
46
+ viewTag,
47
+ });
48
+
49
+ if (didUnderlyingViewChange) {
50
+ state.previousViewTag = viewTag;
51
+ state.forceRebuildReanimatedEvent = true;
52
+ forceRender();
53
+ }
54
+ } else if (!skipConfigUpdate) {
55
+ updateHandlers(preparedGesture, gestureConfig, gesturesToAttach);
56
+ }
57
+ },
58
+ [
59
+ forceRender,
60
+ gestureConfig,
61
+ gesturesToAttach,
62
+ preparedGesture,
63
+ state,
64
+ webEventHandlersRef,
65
+ ]
66
+ );
67
+
68
+ return updateAttachedGestures;
69
+ }
@@ -0,0 +1,54 @@
1
+ import { isFabric, tagMessage } from '../../../utils';
2
+ import { getShadowNodeFromRef } from '../../../getShadowNodeFromRef';
3
+
4
+ import { GestureDetectorState } from './types';
5
+ import React, { useCallback } from 'react';
6
+ import { findNodeHandle } from 'react-native';
7
+
8
+ declare const global: {
9
+ isFormsStackingContext: (node: unknown) => boolean | null; // JSI function
10
+ };
11
+
12
+ // Ref handler for the Wrap component attached under the GestureDetector.
13
+ // It's responsible for setting the viewRef on the state and triggering the reattaching of handlers
14
+ // if the view has changed.
15
+ export function useViewRefHandler(
16
+ state: GestureDetectorState,
17
+ updateAttachedGestures: (skipConfigUpdate?: boolean) => void
18
+ ) {
19
+ const refHandler = useCallback(
20
+ (ref: React.Component | null) => {
21
+ if (ref === null) {
22
+ return;
23
+ }
24
+
25
+ state.viewRef = ref;
26
+
27
+ // if it's the first render, also set the previousViewTag to prevent reattaching gestures when not needed
28
+ if (state.previousViewTag === -1) {
29
+ state.previousViewTag = findNodeHandle(state.viewRef) as number;
30
+ }
31
+
32
+ // Pass true as `skipConfigUpdate`. Here we only want to trigger the eventual reattaching of handlers
33
+ // in case the view has changed. If the view doesn't change, the update will be handled by detector.
34
+ if (!state.firstRender) {
35
+ updateAttachedGestures(true);
36
+ }
37
+
38
+ if (__DEV__ && isFabric() && global.isFormsStackingContext) {
39
+ const node = getShadowNodeFromRef(ref);
40
+ if (global.isFormsStackingContext(node) === false) {
41
+ console.error(
42
+ tagMessage(
43
+ 'GestureDetector has received a child that may get view-flattened. ' +
44
+ '\nTo prevent it from misbehaving you need to wrap the child with a `<View collapsable={false}>`.'
45
+ )
46
+ );
47
+ }
48
+ }
49
+ },
50
+ [state, updateAttachedGestures]
51
+ );
52
+
53
+ return refHandler;
54
+ }
@@ -0,0 +1,185 @@
1
+ import { Platform } from 'react-native';
2
+
3
+ import { tagMessage } from '../../../utils';
4
+ import { GestureRef, BaseGesture, GestureType } from '../gesture';
5
+
6
+ import { flingGestureHandlerProps } from '../../FlingGestureHandler';
7
+ import { forceTouchGestureHandlerProps } from '../../ForceTouchGestureHandler';
8
+ import { longPressGestureHandlerProps } from '../../LongPressGestureHandler';
9
+ import {
10
+ panGestureHandlerProps,
11
+ panGestureHandlerCustomNativeProps,
12
+ } from '../../PanGestureHandler';
13
+ import { tapGestureHandlerProps } from '../../TapGestureHandler';
14
+ import { hoverGestureHandlerProps } from '../hoverGesture';
15
+ import { nativeViewGestureHandlerProps } from '../../NativeViewGestureHandler';
16
+ import {
17
+ HandlerStateChangeEvent,
18
+ baseGestureHandlerWithDetectorProps,
19
+ } from '../../gestureHandlerCommon';
20
+ import { isNewWebImplementationEnabled } from '../../../EnableNewWebImplementation';
21
+ import { getReactNativeVersion } from '../../../getReactNativeVersion';
22
+ import { RNRenderer } from '../../../RNRenderer';
23
+ import { useCallback, useRef, useState } from 'react';
24
+ import { Reanimated } from '../reanimatedWrapper';
25
+ import { onGestureHandlerEvent } from '../eventReceiver';
26
+ import { WebEventHandler } from './types';
27
+
28
+ export const ALLOWED_PROPS = [
29
+ ...baseGestureHandlerWithDetectorProps,
30
+ ...tapGestureHandlerProps,
31
+ ...panGestureHandlerProps,
32
+ ...panGestureHandlerCustomNativeProps,
33
+ ...longPressGestureHandlerProps,
34
+ ...forceTouchGestureHandlerProps,
35
+ ...flingGestureHandlerProps,
36
+ ...hoverGestureHandlerProps,
37
+ ...nativeViewGestureHandlerProps,
38
+ ];
39
+
40
+ function convertToHandlerTag(ref: GestureRef): number {
41
+ if (typeof ref === 'number') {
42
+ return ref;
43
+ } else if (ref instanceof BaseGesture) {
44
+ return ref.handlerTag;
45
+ } else {
46
+ // @ts-ignore in this case it should be a ref either to gesture object or
47
+ // a gesture handler component, in both cases handlerTag property exists
48
+ return ref.current?.handlerTag ?? -1;
49
+ }
50
+ }
51
+
52
+ function extractValidHandlerTags(interactionGroup: GestureRef[] | undefined) {
53
+ return (
54
+ interactionGroup?.map(convertToHandlerTag)?.filter((tag) => tag > 0) ?? []
55
+ );
56
+ }
57
+
58
+ export function extractGestureRelations(gesture: GestureType) {
59
+ const requireToFail = extractValidHandlerTags(gesture.config.requireToFail);
60
+ const simultaneousWith = extractValidHandlerTags(
61
+ gesture.config.simultaneousWith
62
+ );
63
+ const blocksHandlers = extractValidHandlerTags(gesture.config.blocksHandlers);
64
+
65
+ return {
66
+ waitFor: requireToFail,
67
+ simultaneousHandlers: simultaneousWith,
68
+ blocksHandlers: blocksHandlers,
69
+ };
70
+ }
71
+
72
+ export function checkGestureCallbacksForWorklets(gesture: GestureType) {
73
+ if (!__DEV__) {
74
+ return;
75
+ }
76
+ // if a gesture is explicitly marked to run on the JS thread there is no need to check
77
+ // if callbacks are worklets as the user is aware they will be ran on the JS thread
78
+ if (gesture.config.runOnJS) {
79
+ return;
80
+ }
81
+
82
+ const areSomeNotWorklets = gesture.handlers.isWorklet.includes(false);
83
+ const areSomeWorklets = gesture.handlers.isWorklet.includes(true);
84
+
85
+ // if some of the callbacks are worklets and some are not, and the gesture is not
86
+ // explicitly marked with `.runOnJS(true)` show an error
87
+ if (areSomeNotWorklets && areSomeWorklets) {
88
+ console.error(
89
+ tagMessage(
90
+ `Some of the callbacks in the gesture are worklets and some are not. Either make sure that all calbacks are marked as 'worklet' if you wish to run them on the UI thread or use '.runOnJS(true)' modifier on the gesture explicitly to run all callbacks on the JS thread.`
91
+ )
92
+ );
93
+ }
94
+
95
+ if (Reanimated === undefined) {
96
+ // if Reanimated is not available, we can't run worklets, so we shouldn't show the warning
97
+ return;
98
+ }
99
+
100
+ const areAllNotWorklets = !areSomeWorklets && areSomeNotWorklets;
101
+ // if none of the callbacks are worklets and the gesture is not explicitly marked with
102
+ // `.runOnJS(true)` show a warning
103
+ if (areAllNotWorklets) {
104
+ console.warn(
105
+ tagMessage(
106
+ `None of the callbacks in the gesture are worklets. If you wish to run them on the JS thread use '.runOnJS(true)' modifier on the gesture to make this explicit. Otherwise, mark the callbacks as 'worklet' to run them on the UI thread.`
107
+ )
108
+ );
109
+ }
110
+ }
111
+
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ export function validateDetectorChildren(ref: any) {
114
+ // finds the first native view under the Wrap component and traverses the fiber tree upwards
115
+ // to check whether there is more than one native view as a pseudo-direct child of GestureDetector
116
+ // i.e. this is not ok:
117
+ // Wrap
118
+ // |
119
+ // / \
120
+ // / \
121
+ // / \
122
+ // / \
123
+ // NativeView NativeView
124
+ //
125
+ // but this is fine:
126
+ // Wrap
127
+ // |
128
+ // NativeView
129
+ // |
130
+ // / \
131
+ // / \
132
+ // / \
133
+ // / \
134
+ // NativeView NativeView
135
+ if (__DEV__ && Platform.OS !== 'web') {
136
+ const REACT_NATIVE_VERSION = getReactNativeVersion();
137
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
138
+ const wrapType =
139
+ REACT_NATIVE_VERSION.minor > 63 || REACT_NATIVE_VERSION.major > 0
140
+ ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
141
+ ref._reactInternals.elementType
142
+ : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
143
+ ref._reactInternalFiber.elementType;
144
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
145
+ let instance =
146
+ RNRenderer.findHostInstance_DEPRECATED(
147
+ ref
148
+ )._internalFiberInstanceHandleDEV;
149
+
150
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
151
+ while (instance && instance.elementType !== wrapType) {
152
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
153
+ if (instance.sibling) {
154
+ throw new Error(
155
+ '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>.'
156
+ );
157
+ }
158
+
159
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
160
+ instance = instance.return;
161
+ }
162
+ }
163
+ }
164
+
165
+ export function useForceRender() {
166
+ const [renderState, setRenderState] = useState(false);
167
+ const forceRender = useCallback(() => {
168
+ setRenderState(!renderState);
169
+ }, [renderState, setRenderState]);
170
+
171
+ return forceRender;
172
+ }
173
+
174
+ export function useWebEventHandlers() {
175
+ return useRef<WebEventHandler>({
176
+ onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {
177
+ onGestureHandlerEvent(e.nativeEvent);
178
+ },
179
+ onGestureHandlerStateChange: isNewWebImplementationEnabled()
180
+ ? (e: HandlerStateChangeEvent<unknown>) => {
181
+ onGestureHandlerEvent(e.nativeEvent);
182
+ }
183
+ : undefined,
184
+ });
185
+ }
@@ -29,6 +29,8 @@ export class ComposedGesture extends Gesture {
29
29
  if (gesture instanceof BaseGesture) {
30
30
  const newConfig = { ...gesture.config };
31
31
 
32
+ // no need to extend `blocksHandlers` here, because it's not changed in composition
33
+ // the same effect is achieved by reversing the order of 2 gestures in `Exclusive`
32
34
  newConfig.simultaneousWith = extendRelation(
33
35
  newConfig.simultaneousWith,
34
36
  simultaneousGestures
@@ -24,7 +24,9 @@ function create(handlerTag: number): GestureStateManagerType {
24
24
  begin: () => {
25
25
  'worklet';
26
26
  if (REANIMATED_AVAILABLE) {
27
- setGestureState(handlerTag, State.BEGAN);
27
+ // When Reanimated is available, setGestureState should be defined
28
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
29
+ setGestureState!(handlerTag, State.BEGAN);
28
30
  } else {
29
31
  console.warn(warningMessage);
30
32
  }
@@ -33,7 +35,9 @@ function create(handlerTag: number): GestureStateManagerType {
33
35
  activate: () => {
34
36
  'worklet';
35
37
  if (REANIMATED_AVAILABLE) {
36
- setGestureState(handlerTag, State.ACTIVE);
38
+ // When Reanimated is available, setGestureState should be defined
39
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
40
+ setGestureState!(handlerTag, State.ACTIVE);
37
41
  } else {
38
42
  console.warn(warningMessage);
39
43
  }
@@ -42,7 +46,9 @@ function create(handlerTag: number): GestureStateManagerType {
42
46
  fail: () => {
43
47
  'worklet';
44
48
  if (REANIMATED_AVAILABLE) {
45
- setGestureState(handlerTag, State.FAILED);
49
+ // When Reanimated is available, setGestureState should be defined
50
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
51
+ setGestureState!(handlerTag, State.FAILED);
46
52
  } else {
47
53
  console.warn(warningMessage);
48
54
  }
@@ -51,7 +57,9 @@ function create(handlerTag: number): GestureStateManagerType {
51
57
  end: () => {
52
58
  'worklet';
53
59
  if (REANIMATED_AVAILABLE) {
54
- setGestureState(handlerTag, State.END);
60
+ // When Reanimated is available, setGestureState should be defined
61
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
62
+ setGestureState!(handlerTag, State.END);
55
63
  } else {
56
64
  console.warn(warningMessage);
57
65
  }
@@ -9,23 +9,25 @@ export interface SharedValue<T> {
9
9
  value: T;
10
10
  }
11
11
 
12
- let Reanimated: {
13
- default: {
14
- // Slightly modified definition copied from 'react-native-reanimated'
15
- // eslint-disable-next-line @typescript-eslint/ban-types
16
- createAnimatedComponent<P extends object>(
17
- component: ComponentClass<P>,
18
- options?: unknown
19
- ): ComponentClass<P>;
20
- };
21
- useEvent: (
22
- callback: (event: GestureUpdateEvent | GestureStateChangeEvent) => void,
23
- events: string[],
24
- rebuild: boolean
25
- ) => unknown;
26
- useSharedValue: <T>(value: T) => SharedValue<T>;
27
- setGestureState: (handlerTag: number, newState: number) => void;
28
- };
12
+ let Reanimated:
13
+ | {
14
+ default: {
15
+ // Slightly modified definition copied from 'react-native-reanimated'
16
+ // eslint-disable-next-line @typescript-eslint/ban-types
17
+ createAnimatedComponent<P extends object>(
18
+ component: ComponentClass<P>,
19
+ options?: unknown
20
+ ): ComponentClass<P>;
21
+ };
22
+ useEvent: (
23
+ callback: (event: GestureUpdateEvent | GestureStateChangeEvent) => void,
24
+ events: string[],
25
+ rebuild: boolean
26
+ ) => unknown;
27
+ useSharedValue: <T>(value: T) => SharedValue<T>;
28
+ setGestureState: (handlerTag: number, newState: number) => void;
29
+ }
30
+ | undefined;
29
31
 
30
32
  try {
31
33
  Reanimated = require('react-native-reanimated');
package/src/utils.ts CHANGED
@@ -59,3 +59,42 @@ export function isRemoteDebuggingEnabled(): boolean {
59
59
  !localGlobal.RN$Bridgeless
60
60
  );
61
61
  }
62
+
63
+ /**
64
+ * Recursively compares two objects for deep equality.
65
+ *
66
+ * **Note:** This function does not support cyclic references.
67
+ *
68
+ * @param obj1 - The first object to compare.
69
+ * @param obj2 - The second object to compare.
70
+ * @returns `true` if the objects are deeply equal, `false` otherwise.
71
+ */
72
+ export function deepEqual(obj1: any, obj2: any) {
73
+ if (obj1 === obj2) {
74
+ return true;
75
+ }
76
+
77
+ if (
78
+ typeof obj1 !== 'object' ||
79
+ typeof obj2 !== 'object' ||
80
+ obj1 === null ||
81
+ obj2 === null
82
+ ) {
83
+ return false;
84
+ }
85
+
86
+ const keys1 = Object.keys(obj1);
87
+ const keys2 = Object.keys(obj2);
88
+
89
+ if (keys1.length !== keys2.length) {
90
+ return false;
91
+ }
92
+
93
+ for (const key of keys1) {
94
+ if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {
95
+ return false;
96
+ }
97
+ }
98
+
99
+ return true;
100
+ }
@@ -39,16 +39,14 @@ export default class RotationGestureDetector
39
39
 
40
40
  const [firstPointerID, secondPointerID] = this.keyPointers;
41
41
 
42
- const firstPointerX: number = tracker.getLastX(firstPointerID);
43
- const firstPointerY: number = tracker.getLastY(firstPointerID);
44
- const secondPointerX: number = tracker.getLastX(secondPointerID);
45
- const secondPointerY: number = tracker.getLastY(secondPointerID);
42
+ const firstPointerCoords = tracker.getLastAbsoluteCoords(firstPointerID);
43
+ const secondPointerCoords = tracker.getLastAbsoluteCoords(secondPointerID);
46
44
 
47
- const vectorX: number = secondPointerX - firstPointerX;
48
- const vectorY: number = secondPointerY - firstPointerY;
45
+ const vectorX: number = secondPointerCoords.x - firstPointerCoords.x;
46
+ const vectorY: number = secondPointerCoords.y - firstPointerCoords.y;
49
47
 
50
- this.anchorX = (firstPointerX + secondPointerX) / 2;
51
- this.anchorY = (firstPointerY + secondPointerY) / 2;
48
+ this.anchorX = (firstPointerCoords.x + secondPointerCoords.x) / 2;
49
+ this.anchorY = (firstPointerCoords.y + secondPointerCoords.y) / 2;
52
50
 
53
51
  //Angle diff should be positive when rotating in clockwise direction
54
52
  const angle: number = -Math.atan2(vectorY, vectorX);