react-native-gesture-handler 2.6.0 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. package/android/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;