react-native-gesture-handler 2.6.0 → 2.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/android/build.gradle +2 -2
  2. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  3. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  5. package/lib/commonjs/EnableExperimentalWebImplementation.js +7 -0
  6. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -1
  7. package/lib/commonjs/RNGestureHandlerModule.js +1 -1
  8. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  9. package/lib/commonjs/RNGestureHandlerModule.macos.js +22 -13
  10. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  11. package/lib/commonjs/RNGestureHandlerModule.web.js +23 -10
  12. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  13. package/lib/commonjs/components/GestureComponents.js +6 -4
  14. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  15. package/lib/commonjs/components/GestureComponents.web.js +1 -1
  16. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  17. package/lib/commonjs/components/Swipeable.js +4 -4
  18. package/lib/commonjs/components/Swipeable.js.map +1 -1
  19. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  20. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  21. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
  22. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  23. package/lib/commonjs/handlers/gestures/GestureDetector.js +4 -2
  24. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  25. package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
  26. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  27. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
  28. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
  29. package/lib/commonjs/utils.js +10 -6
  30. package/lib/commonjs/utils.js.map +1 -1
  31. package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
  32. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  33. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
  34. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
  35. package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
  36. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  37. package/lib/commonjs/web/handlers/GestureHandler.js +330 -79
  38. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  39. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
  40. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  41. package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
  42. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
  43. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
  44. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  45. package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
  46. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  47. package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
  48. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  49. package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
  50. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  51. package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
  52. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  53. package/lib/commonjs/web/interfaces.js +22 -1
  54. package/lib/commonjs/web/interfaces.js.map +1 -1
  55. package/lib/commonjs/web/tools/EventManager.js +40 -96
  56. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  57. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
  58. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  59. package/lib/commonjs/web/tools/InteractionManager.js +24 -10
  60. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  61. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  62. package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
  63. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
  64. package/lib/commonjs/web/tools/PointerTracker.js +97 -7
  65. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  66. package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
  67. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
  68. package/lib/commonjs/web/utils.js +15 -0
  69. package/lib/commonjs/web/utils.js.map +1 -0
  70. package/lib/module/EnableExperimentalWebImplementation.js +5 -0
  71. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
  72. package/lib/module/RNGestureHandlerModule.js +1 -1
  73. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  74. package/lib/module/RNGestureHandlerModule.macos.js +21 -14
  75. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  76. package/lib/module/RNGestureHandlerModule.web.js +22 -11
  77. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  78. package/lib/module/components/GestureComponents.js +6 -4
  79. package/lib/module/components/GestureComponents.js.map +1 -1
  80. package/lib/module/components/GestureComponents.web.js +1 -1
  81. package/lib/module/components/GestureComponents.web.js.map +1 -1
  82. package/lib/module/components/Swipeable.js +4 -4
  83. package/lib/module/components/Swipeable.js.map +1 -1
  84. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  85. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  86. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
  87. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  88. package/lib/module/handlers/gestures/GestureDetector.js +5 -3
  89. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  90. package/lib/module/handlers/gestures/eventReceiver.js +14 -20
  91. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  92. package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
  93. package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
  94. package/lib/module/utils.js +7 -6
  95. package/lib/module/utils.js.map +1 -1
  96. package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
  97. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  98. package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
  99. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
  100. package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
  101. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  102. package/lib/module/web/handlers/GestureHandler.js +324 -79
  103. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  104. package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
  105. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  106. package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
  107. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
  108. package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
  109. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  110. package/lib/module/web/handlers/PanGestureHandler.js +57 -41
  111. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  112. package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
  113. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  114. package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
  115. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  116. package/lib/module/web/handlers/TapGestureHandler.js +52 -50
  117. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  118. package/lib/module/web/interfaces.js +19 -0
  119. package/lib/module/web/interfaces.js.map +1 -1
  120. package/lib/module/web/tools/EventManager.js +39 -95
  121. package/lib/module/web/tools/EventManager.js.map +1 -1
  122. package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
  123. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  124. package/lib/module/web/tools/InteractionManager.js +24 -10
  125. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  126. package/lib/module/web/tools/NodeManager.js.map +1 -1
  127. package/lib/module/web/tools/PointerEventManager.js +116 -0
  128. package/lib/module/web/tools/PointerEventManager.js.map +1 -0
  129. package/lib/module/web/tools/PointerTracker.js +97 -7
  130. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  131. package/lib/module/web/tools/TouchEventManager.js +124 -0
  132. package/lib/module/web/tools/TouchEventManager.js.map +1 -0
  133. package/lib/module/web/utils.js +8 -0
  134. package/lib/module/web/utils.js.map +1 -0
  135. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +6 -3
  136. package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
  137. package/lib/typescript/components/Swipeable.d.ts +3 -3
  138. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
  139. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
  140. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
  141. package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
  142. package/lib/typescript/utils.d.ts +4 -0
  143. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
  144. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
  145. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
  146. package/lib/typescript/web/handlers/GestureHandler.d.ts +42 -32
  147. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
  148. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
  149. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
  150. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
  151. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
  152. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
  153. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
  154. package/lib/typescript/web/interfaces.d.ts +50 -10
  155. package/lib/typescript/web/tools/EventManager.d.ts +28 -26
  156. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
  157. package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
  158. package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
  159. package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
  160. package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
  161. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
  162. package/lib/typescript/web/utils.d.ts +4 -0
  163. package/package.json +2 -2
  164. package/src/EnableExperimentalWebImplementation.ts +9 -0
  165. package/src/RNGestureHandlerModule.macos.ts +28 -13
  166. package/src/RNGestureHandlerModule.ts +4 -1
  167. package/src/RNGestureHandlerModule.web.ts +20 -7
  168. package/src/components/GestureComponents.tsx +12 -16
  169. package/src/components/GestureComponents.web.tsx +1 -1
  170. package/src/components/Swipeable.tsx +11 -7
  171. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
  172. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
  173. package/src/handlers/gestures/GestureDetector.tsx +8 -4
  174. package/src/handlers/gestures/eventReceiver.ts +23 -24
  175. package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
  176. package/src/utils.ts +6 -6
  177. package/src/web/detectors/RotationGestureDetector.ts +20 -52
  178. package/src/web/detectors/ScaleGestureDetector.ts +9 -45
  179. package/src/web/handlers/FlingGestureHandler.ts +45 -22
  180. package/src/web/handlers/GestureHandler.ts +365 -97
  181. package/src/web/handlers/LongPressGestureHandler.ts +30 -24
  182. package/src/web/handlers/ManualGestureHandler.ts +39 -0
  183. package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
  184. package/src/web/handlers/PanGestureHandler.ts +68 -53
  185. package/src/web/handlers/PinchGestureHandler.ts +47 -44
  186. package/src/web/handlers/RotationGestureHandler.ts +52 -51
  187. package/src/web/handlers/TapGestureHandler.ts +74 -56
  188. package/src/web/interfaces.ts +57 -10
  189. package/src/web/tools/EventManager.ts +58 -148
  190. package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
  191. package/src/web/tools/InteractionManager.ts +25 -9
  192. package/src/web/tools/NodeManager.ts +6 -6
  193. package/src/web/tools/PointerEventManager.ts +134 -0
  194. package/src/web/tools/PointerTracker.ts +120 -10
  195. package/src/web/tools/TouchEventManager.ts +167 -0
  196. package/src/web/utils.ts +8 -0
@@ -3,14 +3,22 @@ import { findNodeHandle } from 'react-native';
3
3
  import { State } from '../../State';
4
4
  import {
5
5
  Config,
6
- AdaptedPointerEvent,
6
+ AdaptedEvent,
7
7
  PropsRef,
8
8
  ResultEvent,
9
+ PointerData,
10
+ ResultTouchEvent,
11
+ PointerType,
12
+ TouchEventType,
13
+ EventTypes,
9
14
  } from '../interfaces';
10
15
  import EventManager from '../tools/EventManager';
11
16
  import GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';
12
17
  import InteractionManager from '../tools/InteractionManager';
13
- import PointerTracker from '../tools/PointerTracker';
18
+ import PointerEventManager from '../tools/PointerEventManager';
19
+ import PointerTracker, { TrackerElement } from '../tools/PointerTracker';
20
+ import TouchEventManager from '../tools/TouchEventManager';
21
+ import { isPointerInBounds } from '../utils';
14
22
 
15
23
  export default abstract class GestureHandler {
16
24
  private lastSentState: State | null = null;
@@ -22,19 +30,19 @@ export default abstract class GestureHandler {
22
30
 
23
31
  private ref!: number;
24
32
  private propsRef!: React.RefObject<unknown>;
25
- protected config: Config = { enabled: false };
26
33
  private handlerTag!: number;
27
- protected view: HTMLElement | null = null;
34
+ protected config: Config = { enabled: false };
35
+ protected view!: HTMLElement;
28
36
 
29
- protected eventManager!: EventManager;
37
+ protected eventManagers: EventManager[] = [];
30
38
  protected tracker: PointerTracker = new PointerTracker();
31
- protected interactionManager!: InteractionManager;
32
39
 
33
40
  // Orchestrator properties
34
41
  protected activationIndex = 0;
35
42
  protected awaiting = false;
36
43
  protected active = false;
37
44
  protected shouldResetProgress = false;
45
+ protected pointerType: PointerType = PointerType.NONE;
38
46
 
39
47
  public constructor() {
40
48
  this.hasCustomActivationCriteria = false;
@@ -50,17 +58,19 @@ export default abstract class GestureHandler {
50
58
 
51
59
  this.currentState = State.UNDETERMINED;
52
60
 
53
- this.setView(ref);
54
- this.setEventManager();
61
+ this.setView();
62
+ this.addEventManager(new PointerEventManager(this.view));
63
+ this.addEventManager(new TouchEventManager(this.view));
55
64
  }
56
65
 
57
- private setView(ref: number) {
58
- if (!ref) {
59
- this.view = null;
60
- return;
66
+ private setView() {
67
+ if (!this.ref) {
68
+ throw new Error(
69
+ `Cannot find HTML Element for handler ${this.handlerTag}`
70
+ );
61
71
  }
62
72
 
63
- this.view = (findNodeHandle(ref) as unknown) as HTMLElement;
73
+ this.view = (findNodeHandle(this.ref) as unknown) as HTMLElement;
64
74
  this.view.style['touchAction'] = 'none';
65
75
  this.view.style['webkitUserSelect'] = 'none';
66
76
  this.view.style['userSelect'] = 'none';
@@ -69,28 +79,19 @@ export default abstract class GestureHandler {
69
79
  this.view.style['WebkitTouchCallout'] = 'none';
70
80
  }
71
81
 
72
- private setEventManager(): void {
73
- if (!this.view) {
74
- return;
75
- }
76
-
77
- this.eventManager = new EventManager(this.view);
78
-
79
- this.eventManager.setOnPointerDown(this.onPointerDown.bind(this));
80
- this.eventManager.setOnPointerUp(this.onPointerUp.bind(this));
81
- this.eventManager.setOnPointerMove(this.onPointerMove.bind(this));
82
- this.eventManager.setOnPointerEnter(this.onPointerEnter.bind(this));
83
- this.eventManager.setOnPointerOut(this.onPointerOut.bind(this));
84
- this.eventManager.setOnPointerCancel(this.onPointerCancel.bind(this));
85
- this.eventManager.setOnPointerOutOfBounds(
86
- this.onPointerOutOfBounds.bind(this)
87
- );
82
+ private addEventManager(manager: EventManager): void {
83
+ manager.setOnPointerDown(this.onPointerDown.bind(this));
84
+ manager.setOnPointerAdd(this.onPointerAdd.bind(this));
85
+ manager.setOnPointerUp(this.onPointerUp.bind(this));
86
+ manager.setOnPointerRemove(this.onPointerRemove.bind(this));
87
+ manager.setOnPointerMove(this.onPointerMove.bind(this));
88
+ manager.setOnPointerEnter(this.onPointerEnter.bind(this));
89
+ manager.setOnPointerOut(this.onPointerOut.bind(this));
90
+ manager.setOnPointerCancel(this.onPointerCancel.bind(this));
91
+ manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));
92
+ manager.setListeners();
88
93
 
89
- this.eventManager.setListeners();
90
- }
91
-
92
- public setInteractionManager(manager: InteractionManager): void {
93
- this.interactionManager = manager;
94
+ this.eventManagers.push(manager);
94
95
  }
95
96
 
96
97
  //
@@ -104,6 +105,10 @@ export default abstract class GestureHandler {
104
105
  public reset(): void {
105
106
  this.tracker.resetTracker();
106
107
  this.onReset();
108
+ this.resetProgress();
109
+ this.eventManagers.forEach((manager: EventManager) =>
110
+ manager.resetManager()
111
+ );
107
112
  this.currentState = State.UNDETERMINED;
108
113
  }
109
114
 
@@ -111,11 +116,20 @@ export default abstract class GestureHandler {
111
116
  // State logic
112
117
  //
113
118
 
114
- public moveToState(newState: State, event: AdaptedPointerEvent) {
119
+ public moveToState(newState: State, sendIfDisabled?: boolean) {
115
120
  if (this.currentState === newState) {
116
121
  return;
117
122
  }
118
123
 
124
+ if (
125
+ this.tracker.getTrackedPointersCount() > 0 &&
126
+ (newState === State.END ||
127
+ newState === State.CANCELLED ||
128
+ newState === State.FAILED)
129
+ ) {
130
+ this.cancelTouches();
131
+ }
132
+
119
133
  const oldState = this.currentState;
120
134
  this.currentState = newState;
121
135
 
@@ -123,7 +137,7 @@ export default abstract class GestureHandler {
123
137
  this,
124
138
  newState,
125
139
  oldState,
126
- event
140
+ sendIfDisabled
127
141
  );
128
142
 
129
143
  this.onStateChange(newState, oldState);
@@ -131,53 +145,63 @@ export default abstract class GestureHandler {
131
145
 
132
146
  protected onStateChange(_newState: State, _oldState: State): void {}
133
147
 
134
- public begin(event: AdaptedPointerEvent): void {
135
- if (!this.checkHitSlop(event)) {
148
+ public begin(): void {
149
+ if (!this.checkHitSlop()) {
136
150
  return;
137
151
  }
138
152
 
139
153
  if (this.currentState === State.UNDETERMINED) {
140
- this.moveToState(State.BEGAN, event);
154
+ this.moveToState(State.BEGAN);
141
155
  }
142
156
  }
143
157
 
144
- public fail(event: AdaptedPointerEvent): void {
158
+ /**
159
+ * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send fail event
160
+ */
161
+ public fail(sendIfDisabled?: boolean): void {
145
162
  if (
146
163
  this.currentState === State.ACTIVE ||
147
164
  this.currentState === State.BEGAN
148
165
  ) {
149
- this.moveToState(State.FAILED, event);
166
+ this.moveToState(State.FAILED, sendIfDisabled);
167
+ this.view.style.cursor = 'auto';
150
168
  }
151
169
 
152
170
  this.resetProgress();
153
171
  }
154
172
 
155
- public cancel(event: AdaptedPointerEvent): void {
173
+ /**
174
+ * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send cancel event
175
+ */
176
+ public cancel(sendIfDisabled?: boolean): void {
156
177
  if (
157
178
  this.currentState === State.ACTIVE ||
158
179
  this.currentState === State.UNDETERMINED ||
159
180
  this.currentState === State.BEGAN
160
181
  ) {
161
182
  this.onCancel();
162
- this.moveToState(State.CANCELLED, event);
183
+ this.moveToState(State.CANCELLED, sendIfDisabled);
184
+ this.view.style.cursor = 'auto';
163
185
  }
164
186
  }
165
187
 
166
- protected activate(event: AdaptedPointerEvent, _force = false) {
188
+ public activate(_force = false) {
167
189
  if (
168
190
  this.currentState === State.UNDETERMINED ||
169
191
  this.currentState === State.BEGAN
170
192
  ) {
171
- this.moveToState(State.ACTIVE, event);
193
+ this.moveToState(State.ACTIVE);
194
+ this.view.style.cursor = 'grab';
172
195
  }
173
196
  }
174
197
 
175
- public end(event: AdaptedPointerEvent) {
198
+ public end() {
176
199
  if (
177
200
  this.currentState === State.BEGAN ||
178
201
  this.currentState === State.ACTIVE
179
202
  ) {
180
- this.moveToState(State.END, event);
203
+ this.moveToState(State.END);
204
+ this.view.style.cursor = 'auto';
181
205
  }
182
206
 
183
207
  this.resetProgress();
@@ -220,7 +244,10 @@ export default abstract class GestureHandler {
220
244
  return false;
221
245
  }
222
246
 
223
- return this.interactionManager.shouldWaitForHandlerFailure(this, handler);
247
+ return InteractionManager.getInstance().shouldWaitForHandlerFailure(
248
+ this,
249
+ handler
250
+ );
224
251
  }
225
252
 
226
253
  public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {
@@ -228,7 +255,7 @@ export default abstract class GestureHandler {
228
255
  return false;
229
256
  }
230
257
 
231
- return this.interactionManager.shouldRequireHandlerToWaitForFailure(
258
+ return InteractionManager.getInstance().shouldRequireHandlerToWaitForFailure(
232
259
  this,
233
260
  handler
234
261
  );
@@ -239,7 +266,10 @@ export default abstract class GestureHandler {
239
266
  return true;
240
267
  }
241
268
 
242
- return this.interactionManager.shouldRecognizeSimultaneously(this, handler);
269
+ return InteractionManager.getInstance().shouldRecognizeSimultaneously(
270
+ this,
271
+ handler
272
+ );
243
273
  }
244
274
 
245
275
  public shouldBeCancelledByOther(handler: GestureHandler): boolean {
@@ -247,36 +277,96 @@ export default abstract class GestureHandler {
247
277
  return false;
248
278
  }
249
279
 
250
- return this.interactionManager.shouldHandlerBeCancelledBy(this, handler);
280
+ return InteractionManager.getInstance().shouldHandlerBeCancelledBy(
281
+ this,
282
+ handler
283
+ );
251
284
  }
252
285
 
253
286
  //
254
287
  // Event actions
255
288
  //
256
289
 
257
- protected onPointerDown(_event: AdaptedPointerEvent): void {
290
+ protected onPointerDown(event: AdaptedEvent): void {
258
291
  GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);
292
+ this.pointerType = event.pointerType;
293
+
294
+ if (this.pointerType === PointerType.TOUCH) {
295
+ GestureHandlerOrchestrator.getInstance().cancelMouseAndPenGestures(this);
296
+ }
297
+
298
+ if (this.config.needsPointerData) {
299
+ this.sendTouchEvent(event);
300
+ }
259
301
  }
260
302
  // Adding another pointer to existing ones
261
- protected onPointerAdd(_event: AdaptedPointerEvent): void {}
262
- protected onPointerUp(_event: AdaptedPointerEvent): void {}
303
+ protected onPointerAdd(event: AdaptedEvent): void {
304
+ if (this.config.needsPointerData) {
305
+ this.sendTouchEvent(event);
306
+ }
307
+ }
308
+ protected onPointerUp(event: AdaptedEvent): void {
309
+ if (this.config.needsPointerData) {
310
+ this.sendTouchEvent(event);
311
+ }
312
+ }
263
313
  // Removing pointer, when there is more than one pointers
264
- protected onPointerRemove(_event: AdaptedPointerEvent): void {}
265
- protected onPointerMove(event: AdaptedPointerEvent): void {
266
- this.tryToSendMoveEvent(event, false);
314
+ protected onPointerRemove(event: AdaptedEvent): void {
315
+ if (this.config.needsPointerData) {
316
+ this.sendTouchEvent(event);
317
+ }
318
+ }
319
+ protected onPointerMove(event: AdaptedEvent): void {
320
+ this.tryToSendMoveEvent(false);
321
+ if (this.config.needsPointerData) {
322
+ this.sendTouchEvent(event);
323
+ }
267
324
  }
268
- protected onPointerOut(_event: AdaptedPointerEvent): void {}
269
- protected onPointerEnter(_event: AdaptedPointerEvent): void {}
270
- protected onPointerCancel(_event: AdaptedPointerEvent): void {}
271
- protected onPointerOutOfBounds(event: AdaptedPointerEvent): void {
272
- this.tryToSendMoveEvent(event, true);
325
+ protected onPointerOut(event: AdaptedEvent): void {
326
+ if (this.config.needsPointerData) {
327
+ this.sendTouchEvent(event);
328
+ }
329
+ }
330
+ protected onPointerEnter(event: AdaptedEvent): void {
331
+ if (this.config.needsPointerData) {
332
+ this.sendTouchEvent(event);
333
+ }
273
334
  }
274
- private tryToSendMoveEvent(event: AdaptedPointerEvent, out: boolean): void {
335
+ protected onPointerCancel(event: AdaptedEvent): void {
336
+ if (this.config.needsPointerData) {
337
+ this.sendTouchEvent(event);
338
+ }
339
+ }
340
+ protected onPointerOutOfBounds(event: AdaptedEvent): void {
341
+ this.tryToSendMoveEvent(true);
342
+ if (this.config.needsPointerData) {
343
+ this.sendTouchEvent(event);
344
+ }
345
+ }
346
+ private tryToSendMoveEvent(out: boolean): void {
275
347
  if (
276
- this.currentState === State.ACTIVE &&
348
+ this.enabled &&
349
+ this.active &&
277
350
  (!out || (out && !this.shouldCancellWhenOutside))
278
351
  ) {
279
- this.sendEvent(event, this.currentState, this.currentState);
352
+ this.sendEvent(this.currentState, this.currentState);
353
+ }
354
+ }
355
+
356
+ public sendTouchEvent(event: AdaptedEvent): void {
357
+ if (!this.enabled) {
358
+ return;
359
+ }
360
+
361
+ const { onGestureHandlerEvent }: PropsRef = this.propsRef
362
+ .current as PropsRef;
363
+
364
+ const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(
365
+ event
366
+ );
367
+
368
+ if (touchEvent) {
369
+ invokeNullableMethod(onGestureHandlerEvent, touchEvent);
280
370
  }
281
371
  }
282
372
 
@@ -284,18 +374,13 @@ export default abstract class GestureHandler {
284
374
  // Events Sending
285
375
  //
286
376
 
287
- public sendEvent = (
288
- event: AdaptedPointerEvent,
289
- newState: State,
290
- oldState: State
291
- ): void => {
377
+ public sendEvent = (newState: State, oldState: State): void => {
292
378
  const {
293
379
  onGestureHandlerEvent,
294
380
  onGestureHandlerStateChange,
295
381
  }: PropsRef = this.propsRef.current as PropsRef;
296
382
 
297
383
  const resultEvent: ResultEvent = this.transformEventData(
298
- event,
299
384
  newState,
300
385
  oldState
301
386
  );
@@ -315,20 +400,16 @@ export default abstract class GestureHandler {
315
400
  }
316
401
  };
317
402
 
318
- private transformEventData(
319
- event: AdaptedPointerEvent,
320
- newState: State,
321
- oldState: State
322
- ): ResultEvent {
403
+ private transformEventData(newState: State, oldState: State): ResultEvent {
323
404
  return {
324
405
  nativeEvent: {
325
406
  numberOfPointers: this.tracker.getTrackedPointersCount(),
326
407
  state: newState,
327
- pointerInside: this.eventManager?.isPointerInBounds({
328
- x: event.x,
329
- y: event.y,
408
+ pointerInside: isPointerInBounds(this.view, {
409
+ x: this.tracker.getLastAvgX(),
410
+ y: this.tracker.getLastAvgY(),
330
411
  }),
331
- ...this.transformNativeEvent(event),
412
+ ...this.transformNativeEvent(),
332
413
  handlerTag: this.handlerTag,
333
414
  target: this.ref,
334
415
  oldState: newState !== oldState ? oldState : undefined,
@@ -337,7 +418,155 @@ export default abstract class GestureHandler {
337
418
  };
338
419
  }
339
420
 
340
- protected transformNativeEvent(_event: AdaptedPointerEvent) {
421
+ private transformTouchEvent(
422
+ event: AdaptedEvent
423
+ ): ResultTouchEvent | undefined {
424
+ const rect = this.view.getBoundingClientRect();
425
+
426
+ const all: PointerData[] = [];
427
+ const changed: PointerData[] = [];
428
+
429
+ const trackerData = this.tracker.getData();
430
+
431
+ // This if handles edge case where all pointers have been cancelled
432
+ // When pointercancel is triggered, reset method is called. This means that tracker will be reset after first pointer being cancelled
433
+ // The problem is, that handler will receive another pointercancel event from the rest of the pointers
434
+ // To avoid crashing, we don't send event if tracker tracks no pointers, i.e. has been reset
435
+ if (trackerData.size === 0 || !trackerData.has(event.pointerId)) {
436
+ return;
437
+ }
438
+
439
+ trackerData.forEach((element: TrackerElement, key: number): void => {
440
+ const id: number = this.tracker.getMappedTouchEventId(key);
441
+
442
+ all.push({
443
+ id: id,
444
+ x: element.lastX - rect.left,
445
+ y: element.lastY - rect.top,
446
+ absoluteX: element.lastX,
447
+ absoluteY: element.lastY,
448
+ });
449
+ });
450
+
451
+ // Each pointer sends its own event, so we want changed touches to contain only the pointer that has changed.
452
+ // However, if the event is cancel, we want to cancel all pointers to avoid crashes
453
+ if (event.eventType !== EventTypes.CANCEL) {
454
+ changed.push({
455
+ id: this.tracker.getMappedTouchEventId(event.pointerId),
456
+ x: event.x - rect.left,
457
+ y: event.y - rect.top,
458
+ absoluteX: event.x,
459
+ absoluteY: event.y,
460
+ });
461
+ } else {
462
+ trackerData.forEach((element: TrackerElement, key: number): void => {
463
+ const id: number = this.tracker.getMappedTouchEventId(key);
464
+
465
+ changed.push({
466
+ id: id,
467
+ x: element.lastX - rect.left,
468
+ y: element.lastY - rect.top,
469
+ absoluteX: element.lastX,
470
+ absoluteY: element.lastY,
471
+ });
472
+ });
473
+ }
474
+
475
+ let eventType: TouchEventType = TouchEventType.UNDETERMINED;
476
+
477
+ switch (event.eventType) {
478
+ case EventTypes.DOWN:
479
+ case EventTypes.ADDITIONAL_POINTER_DOWN:
480
+ eventType = TouchEventType.DOWN;
481
+ break;
482
+ case EventTypes.UP:
483
+ case EventTypes.ADDITIONAL_POINTER_UP:
484
+ eventType = TouchEventType.UP;
485
+ break;
486
+ case EventTypes.MOVE:
487
+ eventType = TouchEventType.MOVE;
488
+ break;
489
+ case EventTypes.CANCEL:
490
+ eventType = TouchEventType.CANCELLED;
491
+ break;
492
+ }
493
+
494
+ // Here, when we receive up event, we want to decrease number of touches
495
+ // That's because we want handler to send information that there's one pointer less
496
+ // However, we still want this pointer to be present in allTouches array, so that its data can be accessed
497
+ let numberOfTouches: number = all.length;
498
+
499
+ if (
500
+ event.eventType === EventTypes.UP ||
501
+ event.eventType === EventTypes.ADDITIONAL_POINTER_UP
502
+ ) {
503
+ --numberOfTouches;
504
+ }
505
+
506
+ return {
507
+ nativeEvent: {
508
+ handlerTag: this.handlerTag,
509
+ state: this.currentState,
510
+ eventType: event.touchEventType ?? eventType,
511
+ changedTouches: changed,
512
+ allTouches: all,
513
+ numberOfTouches: numberOfTouches,
514
+ },
515
+ timeStamp: Date.now(),
516
+ };
517
+ }
518
+
519
+ private cancelTouches(): void {
520
+ const rect = this.view.getBoundingClientRect();
521
+
522
+ const all: PointerData[] = [];
523
+ const changed: PointerData[] = [];
524
+
525
+ const trackerData = this.tracker.getData();
526
+
527
+ if (trackerData.size === 0) {
528
+ return;
529
+ }
530
+
531
+ trackerData.forEach((element: TrackerElement, key: number): void => {
532
+ const id: number = this.tracker.getMappedTouchEventId(key);
533
+
534
+ all.push({
535
+ id: id,
536
+ x: element.lastX - rect.left,
537
+ y: element.lastY - rect.top,
538
+ absoluteX: element.lastX,
539
+ absoluteY: element.lastY,
540
+ });
541
+
542
+ changed.push({
543
+ id: id,
544
+ x: element.lastX - rect.left,
545
+ y: element.lastY - rect.top,
546
+ absoluteX: element.lastX,
547
+ absoluteY: element.lastY,
548
+ });
549
+ });
550
+
551
+ const cancelEvent: ResultTouchEvent = {
552
+ nativeEvent: {
553
+ handlerTag: this.handlerTag,
554
+ state: this.currentState,
555
+ eventType: TouchEventType.CANCELLED,
556
+ changedTouches: changed,
557
+ allTouches: all,
558
+ numberOfTouches: all.length,
559
+ },
560
+ timeStamp: Date.now(),
561
+ };
562
+
563
+ const { onGestureHandlerEvent }: PropsRef = this.propsRef
564
+ .current as PropsRef;
565
+
566
+ invokeNullableMethod(onGestureHandlerEvent, cancelEvent);
567
+ }
568
+
569
+ protected transformNativeEvent() {
341
570
  return {};
342
571
  }
343
572
 
@@ -345,9 +574,28 @@ export default abstract class GestureHandler {
345
574
  // Handling config
346
575
  //
347
576
 
348
- public updateGestureConfig({ enabled = true, ...props }): void {
349
- this.config = { enabled, ...props };
577
+ public updateGestureConfig({ enabled = true, ...props }: Config): void {
578
+ this.config = { enabled: enabled, ...props };
579
+ this.enabled = enabled;
350
580
  this.validateHitSlops();
581
+
582
+ if (this.enabled) {
583
+ return;
584
+ }
585
+
586
+ switch (this.currentState) {
587
+ case State.ACTIVE:
588
+ this.fail(true);
589
+ break;
590
+ case State.UNDETERMINED:
591
+ GestureHandlerOrchestrator.getInstance().removeHandlerFromOrchestrator(
592
+ this
593
+ );
594
+ break;
595
+ default:
596
+ this.cancel(true);
597
+ break;
598
+ }
351
599
  }
352
600
 
353
601
  protected checkCustomActivationCriteria(criterias: string[]): void {
@@ -404,8 +652,8 @@ export default abstract class GestureHandler {
404
652
  }
405
653
  }
406
654
 
407
- private checkHitSlop(event: AdaptedPointerEvent): boolean {
408
- if (!this.config.hitSlop || !this.view) {
655
+ private checkHitSlop(): boolean {
656
+ if (!this.config.hitSlop) {
409
657
  return true;
410
658
  }
411
659
 
@@ -458,17 +706,29 @@ export default abstract class GestureHandler {
458
706
  }
459
707
  }
460
708
 
709
+ const rect: DOMRect = this.view.getBoundingClientRect();
710
+ const offsetX: number = this.tracker.getLastX() - rect.left;
711
+ const offsetY: number = this.tracker.getLastY() - rect.top;
712
+
461
713
  if (
462
- event.offsetX >= left &&
463
- event.offsetX <= right &&
464
- event.offsetY >= top &&
465
- event.offsetY <= bottom
714
+ offsetX >= left &&
715
+ offsetX <= right &&
716
+ offsetY >= top &&
717
+ offsetY <= bottom
466
718
  ) {
467
719
  return true;
468
720
  }
469
721
  return false;
470
722
  }
471
723
 
724
+ public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
725
+ const rect: DOMRect = this.view.getBoundingClientRect();
726
+
727
+ return (
728
+ x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
729
+ );
730
+ }
731
+
472
732
  protected resetConfig(): void {}
473
733
 
474
734
  //
@@ -490,12 +750,12 @@ export default abstract class GestureHandler {
490
750
  throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');
491
751
  }
492
752
 
493
- public getView(): HTMLElement | null {
753
+ public getView(): HTMLElement {
494
754
  return this.view;
495
755
  }
496
756
 
497
- public getEventManager(): EventManager {
498
- return this.eventManager;
757
+ public getEventManagers(): EventManager[] {
758
+ return this.eventManagers;
499
759
  }
500
760
 
501
761
  public getTracker(): PointerTracker {
@@ -510,20 +770,28 @@ export default abstract class GestureHandler {
510
770
  return this.currentState;
511
771
  }
512
772
 
513
- protected setShouldCancelWhenOutside(flag: boolean) {
514
- this.shouldCancellWhenOutside = flag;
773
+ public isEnabled(): boolean {
774
+ return this.enabled;
775
+ }
776
+
777
+ protected setShouldCancelWhenOutside(shouldCancel: boolean) {
778
+ this.shouldCancellWhenOutside = shouldCancel;
515
779
  }
516
780
  protected getShouldCancelWhenOutside(): boolean {
517
781
  return this.shouldCancellWhenOutside;
518
782
  }
783
+
784
+ public getPointerType(): PointerType {
785
+ return this.pointerType;
786
+ }
519
787
  }
520
788
 
521
789
  function invokeNullableMethod(
522
790
  method:
523
- | ((event: ResultEvent) => void)
524
- | { __getHandler: () => (event: ResultEvent) => void }
791
+ | ((event: ResultEvent | ResultTouchEvent) => void)
792
+ | { __getHandler: () => (event: ResultEvent | ResultTouchEvent) => void }
525
793
  | { __nodeConfig: { argMapping: unknown[] } },
526
- event: ResultEvent
794
+ event: ResultEvent | ResultTouchEvent
527
795
  ): void {
528
796
  if (!method) {
529
797
  return;