react-native-gesture-handler 2.16.0-rc.0 → 2.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
  2. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
  3. package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
  4. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +2 -2
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +61 -24
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +17 -22
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +30 -11
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
  12. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
  13. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
  14. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +4 -2
  15. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
  18. package/apple/Handlers/RNLongPressHandler.m +5 -13
  19. package/apple/Handlers/RNPinchHandler.m +12 -1
  20. package/apple/RNGestureHandler.m +3 -1
  21. package/lib/commonjs/Directions.js +19 -6
  22. package/lib/commonjs/Directions.js.map +1 -1
  23. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -61
  24. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  25. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  26. package/lib/commonjs/components/Swipeable.js +3 -1
  27. package/lib/commonjs/components/Swipeable.js.map +1 -1
  28. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
  29. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  30. package/lib/commonjs/handlers/createHandler.js +2 -2
  31. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  32. package/lib/commonjs/handlers/customDirectEventTypes.js +14 -0
  33. package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
  34. package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
  35. package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
  36. package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
  37. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  38. package/lib/commonjs/handlers/gestures/GestureDetector.js +10 -0
  39. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  40. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  41. package/lib/commonjs/index.js +8 -8
  42. package/lib/commonjs/index.js.map +1 -1
  43. package/lib/commonjs/mocks.js +2 -0
  44. package/lib/commonjs/mocks.js.map +1 -1
  45. package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  46. package/lib/commonjs/web/Gestures.js +66 -0
  47. package/lib/commonjs/web/Gestures.js.map +1 -0
  48. package/lib/commonjs/web/constants.js +3 -8
  49. package/lib/commonjs/web/constants.js.map +1 -1
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
  51. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  52. package/lib/commonjs/web/handlers/GestureHandler.js +4 -2
  53. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  54. package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
  55. package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
  56. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  58. package/lib/commonjs/web/interfaces.js +1 -13
  59. package/lib/commonjs/web/interfaces.js.map +1 -1
  60. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  61. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +114 -115
  62. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  63. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
  64. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  65. package/lib/commonjs/web/tools/InteractionManager.js +12 -3
  66. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  67. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  68. package/lib/commonjs/web/tools/PointerEventManager.js +55 -27
  69. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  70. package/lib/commonjs/web/tools/TouchEventManager.js +26 -5
  71. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  72. package/lib/commonjs/web/tools/Vector.js +58 -0
  73. package/lib/commonjs/web/tools/Vector.js.map +1 -0
  74. package/lib/commonjs/web/utils.js +9 -1
  75. package/lib/commonjs/web/utils.js.map +1 -1
  76. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  77. package/lib/module/Directions.js +16 -4
  78. package/lib/module/Directions.js.map +1 -1
  79. package/lib/module/RNGestureHandlerModule.web.js +2 -39
  80. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  81. package/lib/module/components/DrawerLayout.js.map +1 -1
  82. package/lib/module/components/Swipeable.js +3 -1
  83. package/lib/module/components/Swipeable.js.map +1 -1
  84. package/lib/module/components/touchables/GenericTouchable.js +1 -0
  85. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  86. package/lib/module/handlers/createHandler.js +2 -3
  87. package/lib/module/handlers/createHandler.js.map +1 -1
  88. package/lib/module/handlers/customDirectEventTypes.js +3 -0
  89. package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
  90. package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
  91. package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
  92. package/lib/module/handlers/gestureHandlerCommon.js +11 -1
  93. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  94. package/lib/module/handlers/gestures/GestureDetector.js +10 -0
  95. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  96. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  97. package/lib/module/index.js +1 -1
  98. package/lib/module/index.js.map +1 -1
  99. package/lib/module/mocks.js +2 -0
  100. package/lib/module/mocks.js.map +1 -1
  101. package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  102. package/lib/module/web/Gestures.js +39 -0
  103. package/lib/module/web/Gestures.js.map +1 -0
  104. package/lib/module/web/constants.js +1 -6
  105. package/lib/module/web/constants.js.map +1 -1
  106. package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
  107. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  108. package/lib/module/web/handlers/GestureHandler.js +3 -2
  109. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  110. package/lib/module/web/handlers/IGestureHandler.js +2 -0
  111. package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
  112. package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
  113. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  114. package/lib/module/web/interfaces.js +0 -11
  115. package/lib/module/web/interfaces.js.map +1 -1
  116. package/lib/module/web/tools/EventManager.js.map +1 -1
  117. package/lib/module/web/tools/GestureHandlerOrchestrator.js +114 -115
  118. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  119. package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
  120. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  121. package/lib/module/web/tools/InteractionManager.js +9 -3
  122. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  123. package/lib/module/web/tools/NodeManager.js.map +1 -1
  124. package/lib/module/web/tools/PointerEventManager.js +53 -26
  125. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  126. package/lib/module/web/tools/TouchEventManager.js +26 -5
  127. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  128. package/lib/module/web/tools/Vector.js +47 -0
  129. package/lib/module/web/tools/Vector.js.map +1 -0
  130. package/lib/module/web/utils.js +2 -0
  131. package/lib/module/web/utils.js.map +1 -1
  132. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  133. package/lib/typescript/Directions.d.ts +7 -0
  134. package/lib/typescript/RNGestureHandlerModule.web.d.ts +4 -39
  135. package/lib/typescript/components/DrawerLayout.d.ts +1 -2
  136. package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
  137. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  138. package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -0
  139. package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
  140. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +11 -2
  141. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
  142. package/lib/typescript/handlers/gestures/gesture.d.ts +1 -2
  143. package/lib/typescript/index.d.ts +1 -1
  144. package/lib/typescript/mocks.d.ts +1 -0
  145. package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
  146. package/lib/typescript/web/Gestures.d.ts +36 -0
  147. package/lib/typescript/web/constants.d.ts +1 -6
  148. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
  149. package/lib/typescript/web/handlers/GestureHandler.d.ts +11 -9
  150. package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
  151. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  152. package/lib/typescript/web/interfaces.d.ts +7 -10
  153. package/lib/typescript/web/tools/EventManager.d.ts +15 -12
  154. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
  155. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
  156. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
  157. package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
  158. package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
  159. package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
  160. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
  161. package/lib/typescript/web/tools/Vector.d.ts +15 -0
  162. package/lib/typescript/web/utils.d.ts +4 -4
  163. package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
  164. package/package.json +2 -1
  165. package/src/Directions.ts +21 -4
  166. package/src/RNGestureHandlerModule.web.ts +3 -44
  167. package/src/components/DrawerLayout.tsx +1 -1
  168. package/src/components/Swipeable.tsx +2 -0
  169. package/src/components/touchables/GenericTouchable.tsx +3 -0
  170. package/src/handlers/createHandler.tsx +10 -4
  171. package/src/handlers/customDirectEventTypes.ts +2 -0
  172. package/src/handlers/customDirectEventTypes.web.ts +5 -0
  173. package/src/handlers/gestureHandlerCommon.ts +28 -1
  174. package/src/handlers/gestures/GestureDetector.tsx +15 -0
  175. package/src/handlers/gestures/gesture.ts +1 -1
  176. package/src/index.ts +1 -1
  177. package/src/mocks.ts +2 -0
  178. package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
  179. package/src/web/Gestures.ts +41 -0
  180. package/src/web/constants.ts +1 -7
  181. package/src/web/handlers/FlingGestureHandler.ts +54 -24
  182. package/src/web/handlers/GestureHandler.ts +14 -10
  183. package/src/web/handlers/IGestureHandler.ts +50 -0
  184. package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
  185. package/src/web/interfaces.ts +13 -10
  186. package/src/web/tools/EventManager.ts +16 -14
  187. package/src/web/tools/GestureHandlerDelegate.ts +3 -4
  188. package/src/web/tools/GestureHandlerOrchestrator.ts +160 -145
  189. package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
  190. package/src/web/tools/InteractionManager.ts +18 -12
  191. package/src/web/tools/NodeManager.ts +4 -3
  192. package/src/web/tools/PointerEventManager.ts +181 -166
  193. package/src/web/tools/TouchEventManager.ts +126 -114
  194. package/src/web/tools/Vector.ts +60 -0
  195. package/src/web/utils.ts +7 -4
  196. package/src/web_hammer/NodeManager.ts +1 -1
@@ -1,6 +1,8 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-function */
2
2
  import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';
3
3
 
4
+ type PointerEventCallback = (event: AdaptedEvent) => void;
5
+
4
6
  export default abstract class EventManager<T> {
5
7
  protected readonly view: T;
6
8
  protected pointersInBounds: number[] = [];
@@ -11,7 +13,9 @@ export default abstract class EventManager<T> {
11
13
  this.activePointersCounter = 0;
12
14
  }
13
15
 
14
- public abstract setListeners(): void;
16
+ public abstract registerListeners(): void;
17
+ public abstract unregisterListeners(): void;
18
+
15
19
  protected abstract mapEvent(
16
20
  event: Event,
17
21
  eventType: EventTypes,
@@ -36,39 +40,37 @@ export default abstract class EventManager<T> {
36
40
  protected onPointerMoveOver(_event: AdaptedEvent): void {}
37
41
  protected onPointerMoveOut(_event: AdaptedEvent): void {}
38
42
 
39
- public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {
43
+ public setOnPointerDown(callback: PointerEventCallback): void {
40
44
  this.onPointerDown = callback;
41
45
  }
42
- public setOnPointerAdd(callback: (event: AdaptedEvent) => void): void {
46
+ public setOnPointerAdd(callback: PointerEventCallback): void {
43
47
  this.onPointerAdd = callback;
44
48
  }
45
- public setOnPointerUp(callback: (event: AdaptedEvent) => void): void {
49
+ public setOnPointerUp(callback: PointerEventCallback): void {
46
50
  this.onPointerUp = callback;
47
51
  }
48
- public setOnPointerRemove(callback: (event: AdaptedEvent) => void): void {
52
+ public setOnPointerRemove(callback: PointerEventCallback): void {
49
53
  this.onPointerRemove = callback;
50
54
  }
51
- public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {
55
+ public setOnPointerMove(callback: PointerEventCallback): void {
52
56
  this.onPointerMove = callback;
53
57
  }
54
- public setOnPointerLeave(callback: (event: AdaptedEvent) => void): void {
58
+ public setOnPointerLeave(callback: PointerEventCallback): void {
55
59
  this.onPointerLeave = callback;
56
60
  }
57
- public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {
61
+ public setOnPointerEnter(callback: PointerEventCallback): void {
58
62
  this.onPointerEnter = callback;
59
63
  }
60
- public setOnPointerCancel(callback: (event: AdaptedEvent) => void): void {
64
+ public setOnPointerCancel(callback: PointerEventCallback): void {
61
65
  this.onPointerCancel = callback;
62
66
  }
63
- public setOnPointerOutOfBounds(
64
- callback: (event: AdaptedEvent) => void
65
- ): void {
67
+ public setOnPointerOutOfBounds(callback: PointerEventCallback): void {
66
68
  this.onPointerOutOfBounds = callback;
67
69
  }
68
- public setOnPointerMoveOver(callback: (event: AdaptedEvent) => void): void {
70
+ public setOnPointerMoveOver(callback: PointerEventCallback): void {
69
71
  this.onPointerMoveOver = callback;
70
72
  }
71
- public setOnPointerMoveOut(callback: (event: AdaptedEvent) => void): void {
73
+ public setOnPointerMoveOut(callback: PointerEventCallback): void {
72
74
  this.onPointerMoveOut = callback;
73
75
  }
74
76
 
@@ -1,4 +1,3 @@
1
- import type GestureHandler from '../handlers/GestureHandler';
2
1
  import { Config } from '../interfaces';
3
2
 
4
3
  export interface MeasureResult {
@@ -8,10 +7,10 @@ export interface MeasureResult {
8
7
  height: number;
9
8
  }
10
9
 
11
- export interface GestureHandlerDelegate<T> {
12
- getView(): T;
10
+ export interface GestureHandlerDelegate<TComponent, THandler> {
11
+ getView(): TComponent;
13
12
 
14
- init(viewRef: number, handler: GestureHandler): void;
13
+ init(viewRef: number, handler: THandler): void;
15
14
  isPointerInBounds({ x, y }: { x: number; y: number }): boolean;
16
15
  measureView(): MeasureResult;
17
16
  reset(): void;
@@ -1,14 +1,15 @@
1
1
  import { PointerType } from '../../PointerType';
2
2
  import { State } from '../../State';
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,8 +370,8 @@ 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
377
  handler.getPointerType() !== PointerType.STYLUS
@@ -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 {