react-native-gesture-handler 2.6.0 → 2.6.1

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 (177) 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 +20 -9
  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.web.js +1 -1
  14. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  15. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  16. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  17. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
  18. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  19. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  20. package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
  21. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  22. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
  23. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
  24. package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
  25. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  26. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
  27. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
  28. package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
  29. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  30. package/lib/commonjs/web/handlers/GestureHandler.js +282 -79
  31. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
  33. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  34. package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
  35. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
  36. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
  37. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  38. package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
  39. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  40. package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
  41. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  42. package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
  43. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  44. package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
  45. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  46. package/lib/commonjs/web/interfaces.js +22 -1
  47. package/lib/commonjs/web/interfaces.js.map +1 -1
  48. package/lib/commonjs/web/tools/EventManager.js +40 -96
  49. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  50. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
  51. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  52. package/lib/commonjs/web/tools/InteractionManager.js +24 -10
  53. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  54. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  55. package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
  56. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
  57. package/lib/commonjs/web/tools/PointerTracker.js +97 -7
  58. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  59. package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
  60. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
  61. package/lib/commonjs/web/utils.js +15 -0
  62. package/lib/commonjs/web/utils.js.map +1 -0
  63. package/lib/module/EnableExperimentalWebImplementation.js +5 -0
  64. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
  65. package/lib/module/RNGestureHandlerModule.js +1 -1
  66. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  67. package/lib/module/RNGestureHandlerModule.macos.js +19 -10
  68. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  69. package/lib/module/RNGestureHandlerModule.web.js +22 -11
  70. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  71. package/lib/module/components/GestureComponents.web.js +1 -1
  72. package/lib/module/components/GestureComponents.web.js.map +1 -1
  73. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  74. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  75. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
  76. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  77. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  78. package/lib/module/handlers/gestures/eventReceiver.js +14 -20
  79. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  80. package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
  81. package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
  82. package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
  83. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  84. package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
  85. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
  86. package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
  87. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  88. package/lib/module/web/handlers/GestureHandler.js +276 -79
  89. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  90. package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
  91. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  92. package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
  93. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
  94. package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
  95. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  96. package/lib/module/web/handlers/PanGestureHandler.js +57 -41
  97. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  98. package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
  99. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  100. package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
  101. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  102. package/lib/module/web/handlers/TapGestureHandler.js +52 -50
  103. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  104. package/lib/module/web/interfaces.js +19 -0
  105. package/lib/module/web/interfaces.js.map +1 -1
  106. package/lib/module/web/tools/EventManager.js +39 -95
  107. package/lib/module/web/tools/EventManager.js.map +1 -1
  108. package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
  109. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  110. package/lib/module/web/tools/InteractionManager.js +24 -10
  111. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  112. package/lib/module/web/tools/NodeManager.js.map +1 -1
  113. package/lib/module/web/tools/PointerEventManager.js +116 -0
  114. package/lib/module/web/tools/PointerEventManager.js.map +1 -0
  115. package/lib/module/web/tools/PointerTracker.js +97 -7
  116. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  117. package/lib/module/web/tools/TouchEventManager.js +124 -0
  118. package/lib/module/web/tools/TouchEventManager.js.map +1 -0
  119. package/lib/module/web/utils.js +8 -0
  120. package/lib/module/web/utils.js.map +1 -0
  121. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +5 -2
  122. package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
  123. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
  124. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
  125. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
  126. package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
  127. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
  128. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
  129. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
  130. package/lib/typescript/web/handlers/GestureHandler.d.ts +41 -32
  131. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
  132. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
  133. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
  134. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
  135. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
  136. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
  137. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
  138. package/lib/typescript/web/interfaces.d.ts +50 -10
  139. package/lib/typescript/web/tools/EventManager.d.ts +28 -26
  140. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
  141. package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
  142. package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
  143. package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
  144. package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
  145. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
  146. package/lib/typescript/web/utils.d.ts +4 -0
  147. package/package.json +2 -2
  148. package/src/EnableExperimentalWebImplementation.ts +9 -0
  149. package/src/RNGestureHandlerModule.macos.ts +25 -10
  150. package/src/RNGestureHandlerModule.ts +4 -1
  151. package/src/RNGestureHandlerModule.web.ts +20 -7
  152. package/src/components/GestureComponents.web.tsx +1 -1
  153. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
  154. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
  155. package/src/handlers/gestures/GestureDetector.tsx +0 -1
  156. package/src/handlers/gestures/eventReceiver.ts +23 -24
  157. package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
  158. package/src/web/detectors/RotationGestureDetector.ts +20 -52
  159. package/src/web/detectors/ScaleGestureDetector.ts +9 -45
  160. package/src/web/handlers/FlingGestureHandler.ts +45 -22
  161. package/src/web/handlers/GestureHandler.ts +306 -97
  162. package/src/web/handlers/LongPressGestureHandler.ts +30 -24
  163. package/src/web/handlers/ManualGestureHandler.ts +39 -0
  164. package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
  165. package/src/web/handlers/PanGestureHandler.ts +68 -53
  166. package/src/web/handlers/PinchGestureHandler.ts +47 -44
  167. package/src/web/handlers/RotationGestureHandler.ts +52 -51
  168. package/src/web/handlers/TapGestureHandler.ts +74 -56
  169. package/src/web/interfaces.ts +57 -10
  170. package/src/web/tools/EventManager.ts +58 -148
  171. package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
  172. package/src/web/tools/InteractionManager.ts +25 -9
  173. package/src/web/tools/NodeManager.ts +6 -6
  174. package/src/web/tools/PointerEventManager.ts +134 -0
  175. package/src/web/tools/PointerTracker.ts +120 -10
  176. package/src/web/tools/TouchEventManager.ts +167 -0
  177. 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
- );
88
-
89
- this.eventManager.setListeners();
90
- }
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();
91
93
 
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,7 +116,7 @@ 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
  }
@@ -123,7 +128,7 @@ export default abstract class GestureHandler {
123
128
  this,
124
129
  newState,
125
130
  oldState,
126
- event
131
+ sendIfDisabled
127
132
  );
128
133
 
129
134
  this.onStateChange(newState, oldState);
@@ -131,53 +136,63 @@ export default abstract class GestureHandler {
131
136
 
132
137
  protected onStateChange(_newState: State, _oldState: State): void {}
133
138
 
134
- public begin(event: AdaptedPointerEvent): void {
135
- if (!this.checkHitSlop(event)) {
139
+ public begin(): void {
140
+ if (!this.checkHitSlop()) {
136
141
  return;
137
142
  }
138
143
 
139
144
  if (this.currentState === State.UNDETERMINED) {
140
- this.moveToState(State.BEGAN, event);
145
+ this.moveToState(State.BEGAN);
141
146
  }
142
147
  }
143
148
 
144
- public fail(event: AdaptedPointerEvent): void {
149
+ /**
150
+ * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send fail event
151
+ */
152
+ public fail(sendIfDisabled?: boolean): void {
145
153
  if (
146
154
  this.currentState === State.ACTIVE ||
147
155
  this.currentState === State.BEGAN
148
156
  ) {
149
- this.moveToState(State.FAILED, event);
157
+ this.moveToState(State.FAILED, sendIfDisabled);
158
+ this.view.style.cursor = 'auto';
150
159
  }
151
160
 
152
161
  this.resetProgress();
153
162
  }
154
163
 
155
- public cancel(event: AdaptedPointerEvent): void {
164
+ /**
165
+ * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send cancel event
166
+ */
167
+ public cancel(sendIfDisabled?: boolean): void {
156
168
  if (
157
169
  this.currentState === State.ACTIVE ||
158
170
  this.currentState === State.UNDETERMINED ||
159
171
  this.currentState === State.BEGAN
160
172
  ) {
161
173
  this.onCancel();
162
- this.moveToState(State.CANCELLED, event);
174
+ this.moveToState(State.CANCELLED, sendIfDisabled);
175
+ this.view.style.cursor = 'auto';
163
176
  }
164
177
  }
165
178
 
166
- protected activate(event: AdaptedPointerEvent, _force = false) {
179
+ public activate(_force = false) {
167
180
  if (
168
181
  this.currentState === State.UNDETERMINED ||
169
182
  this.currentState === State.BEGAN
170
183
  ) {
171
- this.moveToState(State.ACTIVE, event);
184
+ this.moveToState(State.ACTIVE);
185
+ this.view.style.cursor = 'grab';
172
186
  }
173
187
  }
174
188
 
175
- public end(event: AdaptedPointerEvent) {
189
+ public end() {
176
190
  if (
177
191
  this.currentState === State.BEGAN ||
178
192
  this.currentState === State.ACTIVE
179
193
  ) {
180
- this.moveToState(State.END, event);
194
+ this.moveToState(State.END);
195
+ this.view.style.cursor = 'auto';
181
196
  }
182
197
 
183
198
  this.resetProgress();
@@ -220,7 +235,10 @@ export default abstract class GestureHandler {
220
235
  return false;
221
236
  }
222
237
 
223
- return this.interactionManager.shouldWaitForHandlerFailure(this, handler);
238
+ return InteractionManager.getInstance().shouldWaitForHandlerFailure(
239
+ this,
240
+ handler
241
+ );
224
242
  }
225
243
 
226
244
  public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {
@@ -228,7 +246,7 @@ export default abstract class GestureHandler {
228
246
  return false;
229
247
  }
230
248
 
231
- return this.interactionManager.shouldRequireHandlerToWaitForFailure(
249
+ return InteractionManager.getInstance().shouldRequireHandlerToWaitForFailure(
232
250
  this,
233
251
  handler
234
252
  );
@@ -239,7 +257,10 @@ export default abstract class GestureHandler {
239
257
  return true;
240
258
  }
241
259
 
242
- return this.interactionManager.shouldRecognizeSimultaneously(this, handler);
260
+ return InteractionManager.getInstance().shouldRecognizeSimultaneously(
261
+ this,
262
+ handler
263
+ );
243
264
  }
244
265
 
245
266
  public shouldBeCancelledByOther(handler: GestureHandler): boolean {
@@ -247,36 +268,96 @@ export default abstract class GestureHandler {
247
268
  return false;
248
269
  }
249
270
 
250
- return this.interactionManager.shouldHandlerBeCancelledBy(this, handler);
271
+ return InteractionManager.getInstance().shouldHandlerBeCancelledBy(
272
+ this,
273
+ handler
274
+ );
251
275
  }
252
276
 
253
277
  //
254
278
  // Event actions
255
279
  //
256
280
 
257
- protected onPointerDown(_event: AdaptedPointerEvent): void {
281
+ protected onPointerDown(event: AdaptedEvent): void {
258
282
  GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);
283
+ this.pointerType = event.pointerType;
284
+
285
+ if (this.pointerType === PointerType.TOUCH) {
286
+ GestureHandlerOrchestrator.getInstance().cancelMouseAndPenGestures(this);
287
+ }
288
+
289
+ if (this.config.needsPointerData) {
290
+ this.sendTouchEvent(event);
291
+ }
259
292
  }
260
293
  // Adding another pointer to existing ones
261
- protected onPointerAdd(_event: AdaptedPointerEvent): void {}
262
- protected onPointerUp(_event: AdaptedPointerEvent): void {}
294
+ protected onPointerAdd(event: AdaptedEvent): void {
295
+ if (this.config.needsPointerData) {
296
+ this.sendTouchEvent(event);
297
+ }
298
+ }
299
+ protected onPointerUp(event: AdaptedEvent): void {
300
+ if (this.config.needsPointerData) {
301
+ this.sendTouchEvent(event);
302
+ }
303
+ }
263
304
  // 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);
305
+ protected onPointerRemove(event: AdaptedEvent): void {
306
+ if (this.config.needsPointerData) {
307
+ this.sendTouchEvent(event);
308
+ }
267
309
  }
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);
310
+ protected onPointerMove(event: AdaptedEvent): void {
311
+ this.tryToSendMoveEvent(false);
312
+ if (this.config.needsPointerData) {
313
+ this.sendTouchEvent(event);
314
+ }
315
+ }
316
+ protected onPointerOut(event: AdaptedEvent): void {
317
+ if (this.config.needsPointerData) {
318
+ this.sendTouchEvent(event);
319
+ }
273
320
  }
274
- private tryToSendMoveEvent(event: AdaptedPointerEvent, out: boolean): void {
321
+ protected onPointerEnter(event: AdaptedEvent): void {
322
+ if (this.config.needsPointerData) {
323
+ this.sendTouchEvent(event);
324
+ }
325
+ }
326
+ protected onPointerCancel(event: AdaptedEvent): void {
327
+ if (this.config.needsPointerData) {
328
+ this.sendTouchEvent(event);
329
+ }
330
+ }
331
+ protected onPointerOutOfBounds(event: AdaptedEvent): void {
332
+ this.tryToSendMoveEvent(true);
333
+ if (this.config.needsPointerData) {
334
+ this.sendTouchEvent(event);
335
+ }
336
+ }
337
+ private tryToSendMoveEvent(out: boolean): void {
275
338
  if (
276
- this.currentState === State.ACTIVE &&
339
+ this.enabled &&
340
+ this.active &&
277
341
  (!out || (out && !this.shouldCancellWhenOutside))
278
342
  ) {
279
- this.sendEvent(event, this.currentState, this.currentState);
343
+ this.sendEvent(this.currentState, this.currentState);
344
+ }
345
+ }
346
+
347
+ public sendTouchEvent(event: AdaptedEvent): void {
348
+ if (!this.enabled) {
349
+ return;
350
+ }
351
+
352
+ const { onGestureHandlerEvent }: PropsRef = this.propsRef
353
+ .current as PropsRef;
354
+
355
+ const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(
356
+ event
357
+ );
358
+
359
+ if (touchEvent) {
360
+ invokeNullableMethod(onGestureHandlerEvent, touchEvent);
280
361
  }
281
362
  }
282
363
 
@@ -284,18 +365,13 @@ export default abstract class GestureHandler {
284
365
  // Events Sending
285
366
  //
286
367
 
287
- public sendEvent = (
288
- event: AdaptedPointerEvent,
289
- newState: State,
290
- oldState: State
291
- ): void => {
368
+ public sendEvent = (newState: State, oldState: State): void => {
292
369
  const {
293
370
  onGestureHandlerEvent,
294
371
  onGestureHandlerStateChange,
295
372
  }: PropsRef = this.propsRef.current as PropsRef;
296
373
 
297
374
  const resultEvent: ResultEvent = this.transformEventData(
298
- event,
299
375
  newState,
300
376
  oldState
301
377
  );
@@ -315,20 +391,16 @@ export default abstract class GestureHandler {
315
391
  }
316
392
  };
317
393
 
318
- private transformEventData(
319
- event: AdaptedPointerEvent,
320
- newState: State,
321
- oldState: State
322
- ): ResultEvent {
394
+ private transformEventData(newState: State, oldState: State): ResultEvent {
323
395
  return {
324
396
  nativeEvent: {
325
397
  numberOfPointers: this.tracker.getTrackedPointersCount(),
326
398
  state: newState,
327
- pointerInside: this.eventManager?.isPointerInBounds({
328
- x: event.x,
329
- y: event.y,
399
+ pointerInside: isPointerInBounds(this.view, {
400
+ x: this.tracker.getLastAvgX(),
401
+ y: this.tracker.getLastAvgY(),
330
402
  }),
331
- ...this.transformNativeEvent(event),
403
+ ...this.transformNativeEvent(),
332
404
  handlerTag: this.handlerTag,
333
405
  target: this.ref,
334
406
  oldState: newState !== oldState ? oldState : undefined,
@@ -337,7 +409,105 @@ export default abstract class GestureHandler {
337
409
  };
338
410
  }
339
411
 
340
- protected transformNativeEvent(_event: AdaptedPointerEvent) {
412
+ private transformTouchEvent(
413
+ event: AdaptedEvent
414
+ ): ResultTouchEvent | undefined {
415
+ const rect = this.view.getBoundingClientRect();
416
+
417
+ const all: PointerData[] = [];
418
+ const changed: PointerData[] = [];
419
+
420
+ const trackerData = this.tracker.getData();
421
+
422
+ // This if handles edge case where all pointers have been cancelled
423
+ // When pointercancel is triggered, reset method is called. This means that tracker will be reset after first pointer being cancelled
424
+ // The problem is, that handler will receive another pointercancel event from the rest of the pointers
425
+ // To avoid crashing, we don't send event if tracker tracks no pointers, i.e. has been reset
426
+ if (trackerData.size === 0 || !trackerData.has(event.pointerId)) {
427
+ return;
428
+ }
429
+
430
+ trackerData.forEach((element: TrackerElement, key: number): void => {
431
+ const id: number = this.tracker.getMappedTouchEventId(key);
432
+
433
+ all.push({
434
+ id: id,
435
+ x: element.lastX - rect.left,
436
+ y: element.lastY - rect.top,
437
+ absoluteX: element.lastX,
438
+ absoluteY: element.lastY,
439
+ });
440
+ });
441
+
442
+ // Each pointer sends its own event, so we want changed touches to contain only the pointer that has changed.
443
+ // However, if the event is cancel, we want to cancel all pointers to avoid crashes
444
+ if (event.eventType !== EventTypes.CANCEL) {
445
+ changed.push({
446
+ id: this.tracker.getMappedTouchEventId(event.pointerId),
447
+ x: event.x - rect.left,
448
+ y: event.y - rect.top,
449
+ absoluteX: event.x,
450
+ absoluteY: event.y,
451
+ });
452
+ } else {
453
+ trackerData.forEach((element: TrackerElement, key: number): void => {
454
+ const id: number = this.tracker.getMappedTouchEventId(key);
455
+
456
+ changed.push({
457
+ id: id,
458
+ x: element.lastX - rect.left,
459
+ y: element.lastY - rect.top,
460
+ absoluteX: element.lastX,
461
+ absoluteY: element.lastY,
462
+ });
463
+ });
464
+ }
465
+
466
+ let eventType: TouchEventType = TouchEventType.UNDETERMINED;
467
+
468
+ switch (event.eventType) {
469
+ case EventTypes.DOWN:
470
+ case EventTypes.ADDITIONAL_POINTER_DOWN:
471
+ eventType = TouchEventType.DOWN;
472
+ break;
473
+ case EventTypes.UP:
474
+ case EventTypes.ADDITIONAL_POINTER_UP:
475
+ eventType = TouchEventType.UP;
476
+ break;
477
+ case EventTypes.MOVE:
478
+ eventType = TouchEventType.MOVE;
479
+ break;
480
+ case EventTypes.CANCEL:
481
+ eventType = TouchEventType.CANCELLED;
482
+ break;
483
+ }
484
+
485
+ // Here, when we receive up event, we want to decrease number of touches
486
+ // That's because we want handler to send information that there's one pointer less
487
+ // However, we still want this pointer to be present in allTouches array, so that its data can be accessed
488
+ let numberOfTouches: number = all.length;
489
+
490
+ if (
491
+ event.eventType === EventTypes.UP ||
492
+ event.eventType === EventTypes.ADDITIONAL_POINTER_UP
493
+ ) {
494
+ --numberOfTouches;
495
+ }
496
+
497
+ return {
498
+ nativeEvent: {
499
+ handlerTag: this.handlerTag,
500
+ state: this.currentState,
501
+ eventType: event.touchEventType ?? eventType,
502
+ changedTouches: changed,
503
+ allTouches: all,
504
+ numberOfTouches: numberOfTouches,
505
+ },
506
+ timeStamp: Date.now(),
507
+ };
508
+ }
509
+
510
+ protected transformNativeEvent() {
341
511
  return {};
342
512
  }
343
513
 
@@ -345,9 +515,28 @@ export default abstract class GestureHandler {
345
515
  // Handling config
346
516
  //
347
517
 
348
- public updateGestureConfig({ enabled = true, ...props }): void {
349
- this.config = { enabled, ...props };
518
+ public updateGestureConfig({ enabled = true, ...props }: Config): void {
519
+ this.config = { enabled: enabled, ...props };
520
+ this.enabled = enabled;
350
521
  this.validateHitSlops();
522
+
523
+ if (this.enabled) {
524
+ return;
525
+ }
526
+
527
+ switch (this.currentState) {
528
+ case State.ACTIVE:
529
+ this.fail(true);
530
+ break;
531
+ case State.UNDETERMINED:
532
+ GestureHandlerOrchestrator.getInstance().removeHandlerFromOrchestrator(
533
+ this
534
+ );
535
+ break;
536
+ default:
537
+ this.cancel(true);
538
+ break;
539
+ }
351
540
  }
352
541
 
353
542
  protected checkCustomActivationCriteria(criterias: string[]): void {
@@ -404,8 +593,8 @@ export default abstract class GestureHandler {
404
593
  }
405
594
  }
406
595
 
407
- private checkHitSlop(event: AdaptedPointerEvent): boolean {
408
- if (!this.config.hitSlop || !this.view) {
596
+ private checkHitSlop(): boolean {
597
+ if (!this.config.hitSlop) {
409
598
  return true;
410
599
  }
411
600
 
@@ -458,17 +647,29 @@ export default abstract class GestureHandler {
458
647
  }
459
648
  }
460
649
 
650
+ const rect: DOMRect = this.view.getBoundingClientRect();
651
+ const offsetX: number = this.tracker.getLastX() - rect.left;
652
+ const offsetY: number = this.tracker.getLastY() - rect.top;
653
+
461
654
  if (
462
- event.offsetX >= left &&
463
- event.offsetX <= right &&
464
- event.offsetY >= top &&
465
- event.offsetY <= bottom
655
+ offsetX >= left &&
656
+ offsetX <= right &&
657
+ offsetY >= top &&
658
+ offsetY <= bottom
466
659
  ) {
467
660
  return true;
468
661
  }
469
662
  return false;
470
663
  }
471
664
 
665
+ public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
666
+ const rect: DOMRect = this.view.getBoundingClientRect();
667
+
668
+ return (
669
+ x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
670
+ );
671
+ }
672
+
472
673
  protected resetConfig(): void {}
473
674
 
474
675
  //
@@ -490,12 +691,12 @@ export default abstract class GestureHandler {
490
691
  throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');
491
692
  }
492
693
 
493
- public getView(): HTMLElement | null {
694
+ public getView(): HTMLElement {
494
695
  return this.view;
495
696
  }
496
697
 
497
- public getEventManager(): EventManager {
498
- return this.eventManager;
698
+ public getEventManagers(): EventManager[] {
699
+ return this.eventManagers;
499
700
  }
500
701
 
501
702
  public getTracker(): PointerTracker {
@@ -510,20 +711,28 @@ export default abstract class GestureHandler {
510
711
  return this.currentState;
511
712
  }
512
713
 
513
- protected setShouldCancelWhenOutside(flag: boolean) {
514
- this.shouldCancellWhenOutside = flag;
714
+ public isEnabled(): boolean {
715
+ return this.enabled;
716
+ }
717
+
718
+ protected setShouldCancelWhenOutside(shouldCancel: boolean) {
719
+ this.shouldCancellWhenOutside = shouldCancel;
515
720
  }
516
721
  protected getShouldCancelWhenOutside(): boolean {
517
722
  return this.shouldCancellWhenOutside;
518
723
  }
724
+
725
+ public getPointerType(): PointerType {
726
+ return this.pointerType;
727
+ }
519
728
  }
520
729
 
521
730
  function invokeNullableMethod(
522
731
  method:
523
- | ((event: ResultEvent) => void)
524
- | { __getHandler: () => (event: ResultEvent) => void }
732
+ | ((event: ResultEvent | ResultTouchEvent) => void)
733
+ | { __getHandler: () => (event: ResultEvent | ResultTouchEvent) => void }
525
734
  | { __nodeConfig: { argMapping: unknown[] } },
526
- event: ResultEvent
735
+ event: ResultEvent | ResultTouchEvent
527
736
  ): void {
528
737
  if (!method) {
529
738
  return;