react-native-gesture-handler 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
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;