react-native-gesture-handler 2.15.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/RNGestureHandler.podspec +2 -23
  2. package/android/build.gradle +1 -1
  3. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
  4. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
  5. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +11 -6
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +65 -24
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +86 -22
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +54 -29
  11. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
  12. package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +5 -1
  13. package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +5 -1
  14. package/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt +7 -3
  15. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +8 -5
  20. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +7 -4
  21. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  22. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
  23. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
  24. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/GestureHandlerEventDataBuilder.kt +3 -0
  25. package/android/src/main/jni/cpp-adapter.cpp +18 -22
  26. package/apple/Handlers/RNFlingHandler.m +5 -4
  27. package/apple/Handlers/RNForceTouchHandler.m +3 -1
  28. package/apple/Handlers/RNHoverHandler.m +2 -1
  29. package/apple/Handlers/RNLongPressHandler.m +8 -14
  30. package/apple/Handlers/RNManualHandler.m +1 -0
  31. package/apple/Handlers/RNNativeViewHandler.mm +9 -7
  32. package/apple/Handlers/RNPanHandler.m +7 -2
  33. package/apple/Handlers/RNPinchHandler.m +50 -26
  34. package/apple/Handlers/RNRotationHandler.m +43 -29
  35. package/apple/Handlers/RNTapHandler.m +6 -4
  36. package/apple/RNGestureHandler.h +9 -0
  37. package/apple/RNGestureHandler.m +41 -4
  38. package/apple/RNGestureHandlerEvents.h +18 -9
  39. package/apple/RNGestureHandlerEvents.m +29 -11
  40. package/apple/RNGestureHandlerManager.h +5 -0
  41. package/apple/RNGestureHandlerManager.mm +32 -6
  42. package/apple/RNGestureHandlerModule.h +5 -3
  43. package/apple/RNGestureHandlerModule.mm +33 -19
  44. package/apple/RNGestureHandlerPointerType.h +8 -0
  45. package/lib/commonjs/Directions.js +19 -6
  46. package/lib/commonjs/Directions.js.map +1 -1
  47. package/lib/commonjs/PointerType.js +16 -0
  48. package/lib/commonjs/PointerType.js.map +1 -0
  49. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -61
  50. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  51. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  52. package/lib/commonjs/components/GestureHandlerRootView.android.js +17 -2
  53. package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -1
  54. package/lib/commonjs/components/GestureHandlerRootView.js +15 -2
  55. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
  56. package/lib/commonjs/components/GestureHandlerRootView.web.js +15 -2
  57. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -1
  58. package/lib/commonjs/components/Swipeable.js +3 -1
  59. package/lib/commonjs/components/Swipeable.js.map +1 -1
  60. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
  61. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  62. package/lib/commonjs/getShadowNodeFromRef.js +19 -2
  63. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  64. package/lib/commonjs/handlers/createHandler.js +5 -0
  65. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  66. package/lib/commonjs/handlers/customDirectEventTypes.js +14 -0
  67. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
  68. package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
  69. package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
  70. package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
  71. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  72. package/lib/commonjs/handlers/gestures/GestureDetector.js +10 -0
  73. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  74. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  75. package/lib/commonjs/index.js +11 -3
  76. package/lib/commonjs/index.js.map +1 -1
  77. package/lib/commonjs/mocks.js +2 -0
  78. package/lib/commonjs/mocks.js.map +1 -1
  79. package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
  80. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  81. package/lib/commonjs/web/Gestures.js +66 -0
  82. package/lib/commonjs/web/Gestures.js.map +1 -0
  83. package/lib/commonjs/web/constants.js +3 -8
  84. package/lib/commonjs/web/constants.js.map +1 -1
  85. package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
  86. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  87. package/lib/commonjs/web/handlers/GestureHandler.js +10 -5
  88. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  89. package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
  90. package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
  91. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
  92. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  93. package/lib/commonjs/web/interfaces.js +1 -23
  94. package/lib/commonjs/web/interfaces.js.map +1 -1
  95. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  96. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +117 -118
  97. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  98. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
  99. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  100. package/lib/commonjs/web/tools/InteractionManager.js +12 -3
  101. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  102. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  103. package/lib/commonjs/web/tools/PointerEventManager.js +77 -27
  104. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  105. package/lib/commonjs/web/tools/TouchEventManager.js +29 -6
  106. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  107. package/lib/commonjs/web/tools/Vector.js +58 -0
  108. package/lib/commonjs/web/tools/Vector.js.map +1 -0
  109. package/lib/commonjs/web/utils.js +14 -0
  110. package/lib/commonjs/web/utils.js.map +1 -1
  111. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  112. package/lib/module/Directions.js +16 -4
  113. package/lib/module/Directions.js.map +1 -1
  114. package/lib/module/PointerType.js +9 -0
  115. package/lib/module/PointerType.js.map +1 -0
  116. package/lib/module/RNGestureHandlerModule.web.js +2 -39
  117. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  118. package/lib/module/components/DrawerLayout.js.map +1 -1
  119. package/lib/module/components/GestureHandlerRootView.android.js +15 -2
  120. package/lib/module/components/GestureHandlerRootView.android.js.map +1 -1
  121. package/lib/module/components/GestureHandlerRootView.js +15 -3
  122. package/lib/module/components/GestureHandlerRootView.js.map +1 -1
  123. package/lib/module/components/GestureHandlerRootView.web.js +15 -3
  124. package/lib/module/components/GestureHandlerRootView.web.js.map +1 -1
  125. package/lib/module/components/Swipeable.js +3 -1
  126. package/lib/module/components/Swipeable.js.map +1 -1
  127. package/lib/module/components/touchables/GenericTouchable.js +1 -0
  128. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  129. package/lib/module/getShadowNodeFromRef.js +19 -2
  130. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  131. package/lib/module/handlers/createHandler.js +5 -1
  132. package/lib/module/handlers/createHandler.js.map +1 -1
  133. package/lib/module/handlers/customDirectEventTypes.js +3 -0
  134. package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
  135. package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
  136. package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
  137. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  138. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  139. package/lib/module/handlers/gestures/GestureDetector.js +10 -0
  140. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  141. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  142. package/lib/module/index.js +2 -1
  143. package/lib/module/index.js.map +1 -1
  144. package/lib/module/mocks.js +2 -0
  145. package/lib/module/mocks.js.map +1 -1
  146. package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
  147. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  148. package/lib/module/web/Gestures.js +39 -0
  149. package/lib/module/web/Gestures.js.map +1 -0
  150. package/lib/module/web/constants.js +1 -6
  151. package/lib/module/web/constants.js.map +1 -1
  152. package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
  153. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  154. package/lib/module/web/handlers/GestureHandler.js +7 -4
  155. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  156. package/lib/module/web/handlers/IGestureHandler.js +2 -0
  157. package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
  158. package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
  159. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  160. package/lib/module/web/interfaces.js +0 -20
  161. package/lib/module/web/interfaces.js.map +1 -1
  162. package/lib/module/web/tools/EventManager.js.map +1 -1
  163. package/lib/module/web/tools/GestureHandlerOrchestrator.js +116 -117
  164. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  165. package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
  166. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  167. package/lib/module/web/tools/InteractionManager.js +9 -3
  168. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  169. package/lib/module/web/tools/NodeManager.js.map +1 -1
  170. package/lib/module/web/tools/PointerEventManager.js +75 -27
  171. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  172. package/lib/module/web/tools/TouchEventManager.js +28 -6
  173. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  174. package/lib/module/web/tools/Vector.js +47 -0
  175. package/lib/module/web/tools/Vector.js.map +1 -0
  176. package/lib/module/web/utils.js +4 -0
  177. package/lib/module/web/utils.js.map +1 -1
  178. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  179. package/lib/typescript/Directions.d.ts +7 -0
  180. package/lib/typescript/PointerType.d.ts +6 -0
  181. package/lib/typescript/RNGestureHandlerModule.web.d.ts +4 -39
  182. package/lib/typescript/components/DrawerLayout.d.ts +1 -2
  183. package/lib/typescript/components/GestureHandlerRootView.android.d.ts +1 -1
  184. package/lib/typescript/components/GestureHandlerRootView.d.ts +1 -1
  185. package/lib/typescript/components/GestureHandlerRootView.web.d.ts +1 -1
  186. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
  187. package/lib/typescript/getShadowNodeFromRef.d.ts +1 -1
  188. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  189. package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -0
  190. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
  191. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +13 -2
  192. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  193. package/lib/typescript/handlers/gestures/gesture.d.ts +1 -2
  194. package/lib/typescript/index.d.ts +2 -1
  195. package/lib/typescript/mocks.d.ts +1 -0
  196. package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +6 -6
  197. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
  198. package/lib/typescript/web/Gestures.d.ts +36 -0
  199. package/lib/typescript/web/constants.d.ts +1 -6
  200. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
  201. package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -9
  202. package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
  203. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  204. package/lib/typescript/web/interfaces.d.ts +9 -16
  205. package/lib/typescript/web/tools/EventManager.d.ts +15 -12
  206. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
  207. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
  208. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
  209. package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
  210. package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
  211. package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
  212. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
  213. package/lib/typescript/web/tools/Vector.d.ts +15 -0
  214. package/lib/typescript/web/utils.d.ts +6 -4
  215. package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
  216. package/package.json +2 -1
  217. package/src/Directions.ts +21 -4
  218. package/src/PointerType.ts +6 -0
  219. package/src/RNGestureHandlerModule.web.ts +3 -44
  220. package/src/components/DrawerLayout.tsx +1 -1
  221. package/src/components/GestureHandlerRootView.android.tsx +13 -5
  222. package/src/components/GestureHandlerRootView.tsx +10 -5
  223. package/src/components/GestureHandlerRootView.web.tsx +10 -5
  224. package/src/components/Swipeable.tsx +2 -0
  225. package/src/components/touchables/GenericTouchable.tsx +3 -0
  226. package/src/getShadowNodeFromRef.ts +28 -6
  227. package/src/handlers/createHandler.tsx +14 -2
  228. package/src/handlers/customDirectEventTypes.ts +2 -0
  229. package/src/handlers/customDirectEventTypes.web.ts +5 -0
  230. package/src/handlers/gestureHandlerCommon.ts +30 -1
  231. package/src/handlers/gestures/GestureDetector.tsx +15 -0
  232. package/src/handlers/gestures/gesture.ts +1 -1
  233. package/src/index.ts +2 -1
  234. package/src/mocks.ts +2 -0
  235. package/src/specs/NativeRNGestureHandlerModule.ts +8 -8
  236. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
  237. package/src/web/Gestures.ts +41 -0
  238. package/src/web/constants.ts +1 -7
  239. package/src/web/handlers/FlingGestureHandler.ts +54 -24
  240. package/src/web/handlers/GestureHandler.ts +17 -12
  241. package/src/web/handlers/IGestureHandler.ts +50 -0
  242. package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
  243. package/src/web/interfaces.ts +15 -17
  244. package/src/web/tools/EventManager.ts +16 -14
  245. package/src/web/tools/GestureHandlerDelegate.ts +3 -4
  246. package/src/web/tools/GestureHandlerOrchestrator.ts +162 -147
  247. package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
  248. package/src/web/tools/InteractionManager.ts +18 -12
  249. package/src/web/tools/NodeManager.ts +4 -3
  250. package/src/web/tools/PointerEventManager.ts +189 -154
  251. package/src/web/tools/TouchEventManager.ts +128 -120
  252. package/src/web/tools/Vector.ts +60 -0
  253. package/src/web/utils.ts +16 -4
  254. package/src/web_hammer/NodeManager.ts +1 -1
@@ -1,14 +1,15 @@
1
+ import { PointerType } from '../../PointerType';
1
2
  import { State } from '../../State';
2
- import { PointerType } from '../interfaces';
3
3
 
4
- import GestureHandler from '../handlers/GestureHandler';
4
+ import type IGestureHandler from '../handlers/IGestureHandler';
5
5
  import PointerTracker from './PointerTracker';
6
6
 
7
7
  export default class GestureHandlerOrchestrator {
8
8
  private static instance: GestureHandlerOrchestrator;
9
9
 
10
- private gestureHandlers: GestureHandler[] = [];
11
- private awaitingHandlers: GestureHandler[] = [];
10
+ private gestureHandlers: IGestureHandler[] = [];
11
+ private awaitingHandlers: IGestureHandler[] = [];
12
+ private awaitingHandlersTags: Set<number> = new Set();
12
13
 
13
14
  private handlingChangeSemaphore = 0;
14
15
  private activationIndex = 0;
@@ -23,94 +24,130 @@ export default class GestureHandlerOrchestrator {
23
24
  }
24
25
  }
25
26
 
26
- private cleanHandler(handler: GestureHandler): void {
27
+ private cleanHandler(handler: IGestureHandler): void {
27
28
  handler.reset();
28
29
  handler.setActive(false);
29
30
  handler.setAwaiting(false);
30
31
  handler.setActivationIndex(Number.MAX_VALUE);
31
32
  }
32
33
 
33
- public removeHandlerFromOrchestrator(handler: GestureHandler): void {
34
- this.gestureHandlers.splice(this.gestureHandlers.indexOf(handler), 1);
35
- this.awaitingHandlers.splice(this.awaitingHandlers.indexOf(handler), 1);
34
+ public removeHandlerFromOrchestrator(handler: IGestureHandler): void {
35
+ const indexInGestureHandlers = this.gestureHandlers.indexOf(handler);
36
+ const indexInAwaitingHandlers = this.awaitingHandlers.indexOf(handler);
37
+
38
+ if (indexInGestureHandlers >= 0) {
39
+ this.gestureHandlers.splice(indexInGestureHandlers, 1);
40
+ }
41
+
42
+ if (indexInAwaitingHandlers >= 0) {
43
+ this.awaitingHandlers.splice(indexInAwaitingHandlers, 1);
44
+ this.awaitingHandlersTags.delete(handler.getTag());
45
+ }
36
46
  }
37
47
 
38
48
  private cleanupFinishedHandlers(): void {
49
+ const handlersToRemove = new Set<IGestureHandler>();
50
+
39
51
  for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
40
52
  const handler = this.gestureHandlers[i];
41
53
 
42
- if (!handler) {
43
- continue;
44
- }
45
54
  if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {
46
- this.gestureHandlers.splice(i, 1);
47
-
48
55
  this.cleanHandler(handler);
56
+ handlersToRemove.add(handler);
49
57
  }
50
58
  }
59
+
60
+ this.gestureHandlers = this.gestureHandlers.filter(
61
+ (handler) => !handlersToRemove.has(handler)
62
+ );
51
63
  }
52
64
 
53
- private hasOtherHandlerToWaitFor(handler: GestureHandler): boolean {
54
- let hasToWait = false;
55
- this.gestureHandlers.forEach((otherHandler) => {
56
- if (
57
- otherHandler &&
65
+ private hasOtherHandlerToWaitFor(handler: IGestureHandler): boolean {
66
+ const hasToWaitFor = (otherHandler: IGestureHandler) => {
67
+ return (
58
68
  !this.isFinished(otherHandler.getState()) &&
59
69
  this.shouldHandlerWaitForOther(handler, otherHandler)
60
- ) {
61
- hasToWait = true;
62
- return;
63
- }
64
- });
70
+ );
71
+ };
65
72
 
66
- return hasToWait;
73
+ return this.gestureHandlers.some(hasToWaitFor);
74
+ }
75
+
76
+ private shouldBeCancelledByFinishedHandler(
77
+ handler: IGestureHandler
78
+ ): boolean {
79
+ const shouldBeCancelled = (otherHandler: IGestureHandler) => {
80
+ return (
81
+ this.shouldHandlerWaitForOther(handler, otherHandler) &&
82
+ otherHandler.getState() === State.END
83
+ );
84
+ };
85
+
86
+ return this.gestureHandlers.some(shouldBeCancelled);
67
87
  }
68
88
 
69
- private tryActivate(handler: GestureHandler): void {
89
+ private tryActivate(handler: IGestureHandler): void {
90
+ if (this.shouldBeCancelledByFinishedHandler(handler)) {
91
+ handler.cancel();
92
+ return;
93
+ }
94
+
70
95
  if (this.hasOtherHandlerToWaitFor(handler)) {
71
96
  this.addAwaitingHandler(handler);
72
- } else if (
73
- handler.getState() !== State.CANCELLED &&
74
- handler.getState() !== State.FAILED
75
- ) {
76
- if (this.shouldActivate(handler)) {
77
- this.makeActive(handler);
78
- } else {
79
- switch (handler.getState()) {
80
- case State.ACTIVE:
81
- handler.fail();
82
- break;
83
- case State.BEGAN:
84
- handler.cancel();
85
- }
86
- }
97
+ return;
87
98
  }
88
- }
89
99
 
90
- private shouldActivate(handler: GestureHandler): boolean {
91
- for (const otherHandler of this.gestureHandlers) {
92
- if (this.shouldHandlerBeCancelledBy(handler, otherHandler)) {
93
- return false;
94
- }
100
+ const handlerState = handler.getState();
101
+
102
+ if (handlerState === State.CANCELLED || handlerState === State.FAILED) {
103
+ return;
95
104
  }
96
105
 
97
- return true;
106
+ if (this.shouldActivate(handler)) {
107
+ this.makeActive(handler);
108
+ return;
109
+ }
110
+
111
+ if (handlerState === State.ACTIVE) {
112
+ handler.fail();
113
+ return;
114
+ }
115
+
116
+ if (handlerState === State.BEGAN) {
117
+ handler.cancel();
118
+ }
98
119
  }
99
120
 
100
- private cleanupAwaitingHandlers(handler: GestureHandler): void {
101
- for (let i = 0; i < this.awaitingHandlers.length; ++i) {
102
- if (
103
- !this.awaitingHandlers[i].isAwaiting() &&
104
- this.shouldHandlerWaitForOther(this.awaitingHandlers[i], handler)
105
- ) {
106
- this.cleanHandler(this.awaitingHandlers[i]);
107
- this.awaitingHandlers.splice(i, 1);
121
+ private shouldActivate(handler: IGestureHandler): boolean {
122
+ const shouldBeCancelledBy = (otherHandler: IGestureHandler) => {
123
+ return this.shouldHandlerBeCancelledBy(handler, otherHandler);
124
+ };
125
+
126
+ return !this.gestureHandlers.some(shouldBeCancelledBy);
127
+ }
128
+
129
+ private cleanupAwaitingHandlers(handler: IGestureHandler): void {
130
+ const shouldWait = (otherHandler: IGestureHandler) => {
131
+ return (
132
+ !otherHandler.isAwaiting() &&
133
+ this.shouldHandlerWaitForOther(otherHandler, handler)
134
+ );
135
+ };
136
+
137
+ for (const otherHandler of this.awaitingHandlers) {
138
+ if (shouldWait(otherHandler)) {
139
+ this.cleanHandler(otherHandler);
140
+ this.awaitingHandlersTags.delete(otherHandler.getTag());
108
141
  }
109
142
  }
143
+
144
+ this.awaitingHandlers = this.awaitingHandlers.filter((otherHandler) =>
145
+ this.awaitingHandlersTags.has(otherHandler.getTag())
146
+ );
110
147
  }
111
148
 
112
149
  public onHandlerStateChange(
113
- handler: GestureHandler,
150
+ handler: IGestureHandler,
114
151
  newState: State,
115
152
  oldState: State,
116
153
  sendIfDisabled?: boolean
@@ -122,23 +159,31 @@ export default class GestureHandlerOrchestrator {
122
159
  this.handlingChangeSemaphore += 1;
123
160
 
124
161
  if (this.isFinished(newState)) {
125
- this.awaitingHandlers.forEach((otherHandler) => {
126
- if (this.shouldHandlerWaitForOther(otherHandler, handler)) {
127
- if (newState === State.END) {
128
- otherHandler?.cancel();
129
- if (otherHandler.getState() === State.END) {
130
- // Handle edge case, where discrete gestures end immediately after activation thus
131
- // their state is set to END and when the gesture they are waiting for activates they
132
- // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
133
- // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
134
- otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
135
- }
136
- otherHandler?.setAwaiting(false);
137
- } else {
138
- this.tryActivate(otherHandler);
139
- }
162
+ for (const otherHandler of this.awaitingHandlers) {
163
+ if (
164
+ !this.shouldHandlerWaitForOther(otherHandler, handler) ||
165
+ !this.awaitingHandlersTags.has(otherHandler.getTag())
166
+ ) {
167
+ continue;
168
+ }
169
+
170
+ if (newState !== State.END) {
171
+ this.tryActivate(otherHandler);
172
+ continue;
173
+ }
174
+
175
+ otherHandler.cancel();
176
+
177
+ if (otherHandler.getState() === State.END) {
178
+ // Handle edge case, where discrete gestures end immediately after activation thus
179
+ // their state is set to END and when the gesture they are waiting for activates they
180
+ // should be cancelled, however `cancel` was never sent as gestures were already in the END state.
181
+ // Send synthetic BEGAN -> CANCELLED to properly handle JS logic
182
+ otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
140
183
  }
141
- });
184
+
185
+ otherHandler.setAwaiting(false);
186
+ }
142
187
  }
143
188
 
144
189
  if (newState === State.ACTIVE) {
@@ -163,12 +208,12 @@ export default class GestureHandlerOrchestrator {
163
208
 
164
209
  this.scheduleFinishedHandlersCleanup();
165
210
 
166
- if (this.awaitingHandlers.indexOf(handler) < 0) {
211
+ if (!this.awaitingHandlers.includes(handler)) {
167
212
  this.cleanupAwaitingHandlers(handler);
168
213
  }
169
214
  }
170
215
 
171
- private makeActive(handler: GestureHandler): void {
216
+ private makeActive(handler: IGestureHandler): void {
172
217
  const currentState = handler.getState();
173
218
 
174
219
  handler.setActive(true);
@@ -181,12 +226,11 @@ export default class GestureHandlerOrchestrator {
181
226
  }
182
227
  }
183
228
 
184
- this.awaitingHandlers.forEach((otherHandler) => {
229
+ for (const otherHandler of this.awaitingHandlers) {
185
230
  if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
186
- otherHandler?.cancel();
187
- otherHandler?.setAwaiting(true);
231
+ otherHandler.setAwaiting(false);
188
232
  }
189
- });
233
+ }
190
234
 
191
235
  handler.sendEvent(State.ACTIVE, State.BEGAN);
192
236
 
@@ -197,47 +241,31 @@ export default class GestureHandlerOrchestrator {
197
241
  }
198
242
  }
199
243
 
200
- if (handler.isAwaiting()) {
201
- handler.setAwaiting(false);
202
- for (let i = 0; i < this.awaitingHandlers.length; ++i) {
203
- if (this.awaitingHandlers[i] === handler) {
204
- this.awaitingHandlers.splice(i, 1);
205
- }
206
- }
244
+ if (!handler.isAwaiting()) {
245
+ return;
207
246
  }
208
- }
209
247
 
210
- private addAwaitingHandler(handler: GestureHandler): void {
211
- let alreadyExists = false;
248
+ handler.setAwaiting(false);
212
249
 
213
- this.awaitingHandlers.forEach((otherHandler) => {
214
- if (otherHandler === handler) {
215
- alreadyExists = true;
216
- return;
217
- }
218
- });
250
+ this.awaitingHandlers = this.awaitingHandlers.filter(
251
+ (otherHandler) => otherHandler !== handler
252
+ );
253
+ }
219
254
 
220
- if (alreadyExists) {
255
+ private addAwaitingHandler(handler: IGestureHandler): void {
256
+ if (this.awaitingHandlers.includes(handler)) {
221
257
  return;
222
258
  }
223
259
 
224
260
  this.awaitingHandlers.push(handler);
261
+ this.awaitingHandlersTags.add(handler.getTag());
225
262
 
226
263
  handler.setAwaiting(true);
227
264
  handler.setActivationIndex(this.activationIndex++);
228
265
  }
229
266
 
230
- public recordHandlerIfNotPresent(handler: GestureHandler): void {
231
- let alreadyExists = false;
232
-
233
- this.gestureHandlers.forEach((otherHandler) => {
234
- if (otherHandler === handler) {
235
- alreadyExists = true;
236
- return;
237
- }
238
- });
239
-
240
- if (alreadyExists) {
267
+ public recordHandlerIfNotPresent(handler: IGestureHandler): void {
268
+ if (this.gestureHandlers.includes(handler)) {
241
269
  return;
242
270
  }
243
271
 
@@ -249,8 +277,8 @@ export default class GestureHandlerOrchestrator {
249
277
  }
250
278
 
251
279
  private shouldHandlerWaitForOther(
252
- handler: GestureHandler,
253
- otherHandler: GestureHandler
280
+ handler: IGestureHandler,
281
+ otherHandler: IGestureHandler
254
282
  ): boolean {
255
283
  return (
256
284
  handler !== otherHandler &&
@@ -260,8 +288,8 @@ export default class GestureHandlerOrchestrator {
260
288
  }
261
289
 
262
290
  private canRunSimultaneously(
263
- gh1: GestureHandler,
264
- gh2: GestureHandler
291
+ gh1: IGestureHandler,
292
+ gh2: IGestureHandler
265
293
  ): boolean {
266
294
  return (
267
295
  gh1 === gh2 ||
@@ -271,17 +299,14 @@ export default class GestureHandlerOrchestrator {
271
299
  }
272
300
 
273
301
  private shouldHandlerBeCancelledBy(
274
- handler: GestureHandler,
275
- otherHandler: GestureHandler
302
+ handler: IGestureHandler,
303
+ otherHandler: IGestureHandler
276
304
  ): boolean {
277
305
  if (this.canRunSimultaneously(handler, otherHandler)) {
278
306
  return false;
279
307
  }
280
308
 
281
- if (
282
- handler !== otherHandler &&
283
- (handler.isAwaiting() || handler.getState() === State.ACTIVE)
284
- ) {
309
+ if (handler.isAwaiting() || handler.getState() === State.ACTIVE) {
285
310
  // For now it always returns false
286
311
  return handler.shouldBeCancelledByOther(otherHandler);
287
312
  }
@@ -300,8 +325,8 @@ export default class GestureHandlerOrchestrator {
300
325
  }
301
326
 
302
327
  private checkOverlap(
303
- handler: GestureHandler,
304
- otherHandler: GestureHandler
328
+ handler: IGestureHandler,
329
+ otherHandler: IGestureHandler
305
330
  ): boolean {
306
331
  // If handlers don't have common pointers, default return value is false.
307
332
  // However, if at least on pointer overlaps with both handlers, we return true
@@ -309,38 +334,28 @@ export default class GestureHandlerOrchestrator {
309
334
 
310
335
  // TODO: Find better way to handle that issue, for example by activation order and handler cancelling
311
336
 
312
- const handlerPointers: number[] = handler.getTrackedPointersID();
313
- const otherPointers: number[] = otherHandler.getTrackedPointersID();
314
-
315
- let overlap = false;
316
-
317
- handlerPointers.forEach((pointer: number) => {
337
+ const isPointerWithinBothBounds = (pointer: number) => {
318
338
  const handlerX: number = handler.getTracker().getLastX(pointer);
319
339
  const handlerY: number = handler.getTracker().getLastY(pointer);
320
340
 
321
- if (
322
- handler.getDelegate().isPointerInBounds({ x: handlerX, y: handlerY }) &&
323
- otherHandler
324
- .getDelegate()
325
- .isPointerInBounds({ x: handlerX, y: handlerY })
326
- ) {
327
- overlap = true;
328
- }
329
- });
341
+ const point = {
342
+ x: handlerX,
343
+ y: handlerY,
344
+ };
330
345
 
331
- otherPointers.forEach((pointer: number) => {
332
- const otherX: number = otherHandler.getTracker().getLastX(pointer);
333
- const otherY: number = otherHandler.getTracker().getLastY(pointer);
346
+ return (
347
+ handler.getDelegate().isPointerInBounds(point) &&
348
+ otherHandler.getDelegate().isPointerInBounds(point)
349
+ );
350
+ };
334
351
 
335
- if (
336
- handler.getDelegate().isPointerInBounds({ x: otherX, y: otherY }) &&
337
- otherHandler.getDelegate().isPointerInBounds({ x: otherX, y: otherY })
338
- ) {
339
- overlap = true;
340
- }
341
- });
352
+ const handlerPointers: number[] = handler.getTrackedPointersID();
353
+ const otherPointers: number[] = otherHandler.getTrackedPointersID();
342
354
 
343
- return overlap;
355
+ return (
356
+ handlerPointers.some(isPointerWithinBothBounds) ||
357
+ otherPointers.some(isPointerWithinBothBounds)
358
+ );
344
359
  }
345
360
 
346
361
  private isFinished(state: State): boolean {
@@ -355,11 +370,11 @@ export default class GestureHandlerOrchestrator {
355
370
  // This became a problem because handler was left at active state without any signal to end or fail
356
371
  // To handle this, when new touch event is received, we loop through active handlers and check which type of
357
372
  // pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
358
- public cancelMouseAndPenGestures(currentHandler: GestureHandler): void {
359
- this.gestureHandlers.forEach((handler: GestureHandler) => {
373
+ public cancelMouseAndPenGestures(currentHandler: IGestureHandler): void {
374
+ this.gestureHandlers.forEach((handler: IGestureHandler) => {
360
375
  if (
361
376
  handler.getPointerType() !== PointerType.MOUSE &&
362
- handler.getPointerType() !== PointerType.PEN
377
+ handler.getPointerType() !== PointerType.STYLUS
363
378
  ) {
364
379
  return;
365
380
  }
@@ -1,5 +1,5 @@
1
1
  import { findNodeHandle } from 'react-native';
2
- import type GestureHandler from '../handlers/GestureHandler';
2
+ import type IGestureHandler from '../handlers/IGestureHandler';
3
3
  import {
4
4
  GestureHandlerDelegate,
5
5
  MeasureResult,
@@ -9,20 +9,21 @@ import TouchEventManager from './TouchEventManager';
9
9
  import { State } from '../../State';
10
10
  import { isPointerInBounds } from '../utils';
11
11
  import EventManager from './EventManager';
12
- import { Config, MouseButton } from '../interfaces';
12
+ import { Config } from '../interfaces';
13
+ import { MouseButton } from '../../handlers/gestureHandlerCommon';
13
14
 
14
15
  export class GestureHandlerWebDelegate
15
- implements GestureHandlerDelegate<HTMLElement>
16
+ implements GestureHandlerDelegate<HTMLElement, IGestureHandler>
16
17
  {
17
18
  private view!: HTMLElement;
18
- private gestureHandler!: GestureHandler;
19
+ private gestureHandler!: IGestureHandler;
19
20
  private eventManagers: EventManager<unknown>[] = [];
20
21
 
21
22
  getView(): HTMLElement {
22
23
  return this.view;
23
24
  }
24
25
 
25
- init(viewRef: number, handler: GestureHandler): void {
26
+ init(viewRef: number, handler: IGestureHandler): void {
26
27
  if (!viewRef) {
27
28
  throw new Error(
28
29
  `Cannot find HTML Element for handler ${handler.getTag()}`
@@ -32,10 +33,6 @@ export class GestureHandlerWebDelegate
32
33
  this.gestureHandler = handler;
33
34
  this.view = findNodeHandle(viewRef) as unknown as HTMLElement;
34
35
 
35
- this.view.style['touchAction'] = 'none';
36
- //@ts-ignore This one disables default events on Safari
37
- this.view.style['WebkitTouchCallout'] = 'none';
38
-
39
36
  const config = handler.getConfig();
40
37
 
41
38
  this.addContextMenuListeners(config);
@@ -48,6 +45,10 @@ export class GestureHandlerWebDelegate
48
45
  this.view.style['userSelect'] = config.userSelect;
49
46
  }
50
47
 
48
+ this.view.style['touchAction'] = config.touchAction ?? 'none';
49
+ //@ts-ignore This one disables default events on Safari
50
+ this.view.style['WebkitTouchCallout'] = 'none';
51
+
51
52
  this.eventManagers.push(new PointerEventManager(this.view));
52
53
  this.eventManagers.push(new TouchEventManager(this.view));
53
54
 
@@ -150,5 +151,9 @@ export class GestureHandlerWebDelegate
150
151
 
151
152
  public destroy(config: Config): void {
152
153
  this.removeContextMenuListeners(config);
154
+
155
+ this.eventManagers.forEach((manager) => {
156
+ manager.unregisterListeners();
157
+ });
153
158
  }
154
159
  }
@@ -1,4 +1,5 @@
1
- import GestureHandler from '../handlers/GestureHandler';
1
+ import type IGestureHandler from '../handlers/IGestureHandler';
2
+ import { State } from '../../State';
2
3
  import { Config, Handler } from '../interfaces';
3
4
 
4
5
  export default class InteractionManager {
@@ -11,7 +12,7 @@ export default class InteractionManager {
11
12
  // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
12
13
  private constructor() {}
13
14
 
14
- public configureInteractions(handler: GestureHandler, config: Config) {
15
+ public configureInteractions(handler: IGestureHandler, config: Config) {
15
16
  this.dropRelationsForHandlerWithTag(handler.getTag());
16
17
 
17
18
  if (config.waitFor) {
@@ -57,8 +58,8 @@ export default class InteractionManager {
57
58
  }
58
59
 
59
60
  public shouldWaitForHandlerFailure(
60
- handler: GestureHandler,
61
- otherHandler: GestureHandler
61
+ handler: IGestureHandler,
62
+ otherHandler: IGestureHandler
62
63
  ): boolean {
63
64
  const waitFor: number[] | undefined = this.waitForRelations.get(
64
65
  handler.getTag()
@@ -72,8 +73,8 @@ export default class InteractionManager {
72
73
  }
73
74
 
74
75
  public shouldRecognizeSimultaneously(
75
- handler: GestureHandler,
76
- otherHandler: GestureHandler
76
+ handler: IGestureHandler,
77
+ otherHandler: IGestureHandler
77
78
  ): boolean {
78
79
  const simultaneousHandlers: number[] | undefined =
79
80
  this.simultaneousRelations.get(handler.getTag());
@@ -86,8 +87,8 @@ export default class InteractionManager {
86
87
  }
87
88
 
88
89
  public shouldRequireHandlerToWaitForFailure(
89
- handler: GestureHandler,
90
- otherHandler: GestureHandler
90
+ handler: IGestureHandler,
91
+ otherHandler: IGestureHandler
91
92
  ): boolean {
92
93
  const waitFor: number[] | undefined = this.blocksHandlersRelations.get(
93
94
  handler.getTag()
@@ -101,11 +102,16 @@ export default class InteractionManager {
101
102
  }
102
103
 
103
104
  public shouldHandlerBeCancelledBy(
104
- _handler: GestureHandler,
105
- _otherHandler: GestureHandler
105
+ _handler: IGestureHandler,
106
+ otherHandler: IGestureHandler
106
107
  ): boolean {
107
- //TODO: Implement logic
108
- return false;
108
+ // We check constructor name instead of using `instanceof` in order do avoid circular dependencies
109
+ const isNativeHandler =
110
+ otherHandler.constructor.name === 'NativeViewGestureHandler';
111
+ const isActive = otherHandler.getState() === State.ACTIVE;
112
+ const isButton = otherHandler.isButton?.() === true;
113
+
114
+ return isNativeHandler && isActive && !isButton;
109
115
  }
110
116
 
111
117
  public dropRelationsForHandlerWithTag(handlerTag: number): void {
@@ -1,5 +1,6 @@
1
1
  import { ValueOf } from '../../typeUtils';
2
- import { Gestures } from '../../RNGestureHandlerModule.web';
2
+ import { Gestures } from '../Gestures';
3
+ import type IGestureHandler from '../handlers/IGestureHandler';
3
4
 
4
5
  // eslint-disable-next-line @typescript-eslint/no-extraneous-class
5
6
  export default abstract class NodeManager {
@@ -8,9 +9,9 @@ export default abstract class NodeManager {
8
9
  InstanceType<ValueOf<typeof Gestures>>
9
10
  > = {};
10
11
 
11
- public static getHandler(tag: number) {
12
+ public static getHandler(tag: number): IGestureHandler {
12
13
  if (tag in this.gestures) {
13
- return this.gestures[tag];
14
+ return this.gestures[tag] as IGestureHandler;
14
15
  }
15
16
 
16
17
  throw new Error(`No handler for tag ${tag}`);