react-native-gesture-handler 2.12.0 → 2.13.0

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 (195) hide show
  1. package/RNGestureHandler.podspec +0 -15
  2. package/android/build.gradle +5 -76
  3. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +16 -1
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +43 -18
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +120 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +7 -0
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/Extensions.kt +5 -0
  8. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +43 -16
  9. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +21 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +9 -1
  11. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +10 -0
  12. package/ios/Handlers/RNHoverHandler.h +12 -0
  13. package/ios/Handlers/RNHoverHandler.m +152 -0
  14. package/ios/RNGestureHandlerButtonComponentView.mm +2 -0
  15. package/ios/RNGestureHandlerEvents.h +1 -0
  16. package/ios/RNGestureHandlerEvents.m +10 -0
  17. package/ios/RNGestureHandlerManager.mm +2 -0
  18. package/ios/RNManualActivationRecognizer.m +2 -1
  19. package/ios/RNRootViewGestureRecognizer.m +7 -2
  20. package/lib/commonjs/RNGestureHandlerModule.macos.js +3 -1
  21. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  22. package/lib/commonjs/RNGestureHandlerModule.web.js +7 -2
  23. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  24. package/lib/commonjs/RNGestureHandlerModule.windows.js +3 -1
  25. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
  26. package/lib/commonjs/components/DrawerLayout.js +1 -0
  27. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  28. package/lib/commonjs/components/touchables/GenericTouchable.js +1 -2
  29. package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
  30. package/lib/commonjs/components/touchables/TouchableHighlight.js.map +1 -1
  31. package/lib/commonjs/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  32. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  33. package/lib/commonjs/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  34. package/lib/commonjs/components/touchables/index.js.map +1 -1
  35. package/lib/commonjs/handlers/createHandler.js +4 -4
  36. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  37. package/lib/commonjs/handlers/gestureHandlerCommon.js +1 -1
  38. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  39. package/lib/commonjs/handlers/gestures/GestureDetector.js +4 -2
  40. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  41. package/lib/commonjs/handlers/gestures/gesture.js +5 -0
  42. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  43. package/lib/commonjs/handlers/gestures/gestureObjects.js +5 -0
  44. package/lib/commonjs/handlers/gestures/gestureObjects.js.map +1 -1
  45. package/lib/commonjs/handlers/gestures/hoverGesture.js +74 -0
  46. package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -0
  47. package/lib/commonjs/index.js +8 -0
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -10
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  51. package/lib/commonjs/web/handlers/GestureHandler.js +61 -88
  52. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  53. package/lib/commonjs/web/handlers/HoverGestureHandler.js +62 -0
  54. package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -0
  55. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +6 -7
  56. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +12 -4
  58. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  59. package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -7
  60. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  61. package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -10
  62. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  63. package/lib/commonjs/web/interfaces.js +1 -1
  64. package/lib/commonjs/web/interfaces.js.map +1 -1
  65. package/lib/commonjs/web/tools/EventManager.js +18 -4
  66. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  67. package/lib/commonjs/web/tools/GestureHandlerDelegate.js +6 -0
  68. package/lib/commonjs/web/tools/GestureHandlerDelegate.js.map +1 -0
  69. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +5 -7
  70. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  71. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +118 -0
  72. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -0
  73. package/lib/commonjs/web/tools/PointerEventManager.js +38 -5
  74. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  75. package/lib/commonjs/web/tools/TouchEventManager.js +2 -2
  76. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
  77. package/lib/module/RNGestureHandlerModule.macos.js +2 -1
  78. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  79. package/lib/module/RNGestureHandlerModule.web.js +6 -3
  80. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  81. package/lib/module/RNGestureHandlerModule.windows.js +2 -1
  82. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
  83. package/lib/module/components/DrawerLayout.js +1 -0
  84. package/lib/module/components/DrawerLayout.js.map +1 -1
  85. package/lib/module/components/touchables/GenericTouchable.js +1 -2
  86. package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
  87. package/lib/module/components/touchables/TouchableHighlight.js.map +1 -1
  88. package/lib/module/components/touchables/TouchableNativeFeedback.android.js.map +1 -1
  89. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  90. package/lib/module/components/touchables/TouchableWithoutFeedback.js.map +1 -1
  91. package/lib/module/components/touchables/index.js.map +1 -1
  92. package/lib/module/handlers/createHandler.js +4 -4
  93. package/lib/module/handlers/createHandler.js.map +1 -1
  94. package/lib/module/handlers/gestureHandlerCommon.js +1 -1
  95. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  96. package/lib/module/handlers/gestures/GestureDetector.js +3 -2
  97. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  98. package/lib/module/handlers/gestures/gesture.js +5 -0
  99. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  100. package/lib/module/handlers/gestures/gestureObjects.js +4 -0
  101. package/lib/module/handlers/gestures/gestureObjects.js.map +1 -1
  102. package/lib/module/handlers/gestures/hoverGesture.js +62 -0
  103. package/lib/module/handlers/gestures/hoverGesture.js.map +1 -0
  104. package/lib/module/index.js +1 -0
  105. package/lib/module/index.js.map +1 -1
  106. package/lib/module/web/handlers/FlingGestureHandler.js +0 -10
  107. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  108. package/lib/module/web/handlers/GestureHandler.js +61 -84
  109. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  110. package/lib/module/web/handlers/HoverGestureHandler.js +47 -0
  111. package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -0
  112. package/lib/module/web/handlers/LongPressGestureHandler.js +5 -7
  113. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  114. package/lib/module/web/handlers/NativeViewGestureHandler.js +11 -4
  115. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  116. package/lib/module/web/handlers/PanGestureHandler.js +2 -7
  117. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  118. package/lib/module/web/handlers/TapGestureHandler.js +0 -10
  119. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  120. package/lib/module/web/interfaces.js +1 -1
  121. package/lib/module/web/interfaces.js.map +1 -1
  122. package/lib/module/web/tools/EventManager.js +18 -4
  123. package/lib/module/web/tools/EventManager.js.map +1 -1
  124. package/lib/module/web/tools/GestureHandlerDelegate.js +2 -0
  125. package/lib/module/web/tools/GestureHandlerDelegate.js.map +1 -0
  126. package/lib/module/web/tools/GestureHandlerOrchestrator.js +5 -6
  127. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  128. package/lib/module/web/tools/GestureHandlerWebDelegate.js +102 -0
  129. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -0
  130. package/lib/module/web/tools/PointerEventManager.js +39 -6
  131. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  132. package/lib/module/web/tools/TouchEventManager.js +2 -2
  133. package/lib/module/web/tools/TouchEventManager.js.map +1 -1
  134. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
  135. package/lib/typescript/RNGestureHandlerModule.web.d.ts +3 -1
  136. package/lib/typescript/RNGestureHandlerModule.windows.d.ts +1 -1
  137. package/lib/typescript/components/DrawerLayout.d.ts +7 -1
  138. package/lib/typescript/components/touchables/GenericTouchable.d.ts +3 -2
  139. package/lib/typescript/components/touchables/TouchableHighlight.d.ts +4 -3
  140. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +3 -2
  141. package/lib/typescript/components/touchables/TouchableOpacity.d.ts +4 -5
  142. package/lib/typescript/components/touchables/TouchableWithoutFeedback.d.ts +1 -0
  143. package/lib/typescript/components/touchables/index.d.ts +3 -0
  144. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  145. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -1
  146. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -1
  147. package/lib/typescript/handlers/gestures/gestureObjects.d.ts +2 -0
  148. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +32 -0
  149. package/lib/typescript/index.d.ts +4 -0
  150. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -6
  151. package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -17
  152. package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +10 -0
  153. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +0 -4
  154. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -1
  155. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -4
  156. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -6
  157. package/lib/typescript/web/interfaces.d.ts +4 -3
  158. package/lib/typescript/web/tools/EventManager.d.ts +9 -5
  159. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +22 -0
  160. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +21 -0
  161. package/lib/typescript/web/tools/NodeManager.d.ts +2 -2
  162. package/lib/typescript/web/tools/PointerEventManager.d.ts +1 -1
  163. package/lib/typescript/web/tools/TouchEventManager.d.ts +1 -1
  164. package/package.json +2 -2
  165. package/src/RNGestureHandlerModule.macos.ts +5 -1
  166. package/src/RNGestureHandlerModule.web.ts +7 -1
  167. package/src/RNGestureHandlerModule.windows.ts +5 -1
  168. package/src/components/DrawerLayout.tsx +9 -0
  169. package/src/components/touchables/GenericTouchable.tsx +4 -4
  170. package/src/components/touchables/TouchableHighlight.tsx +6 -3
  171. package/src/components/touchables/TouchableNativeFeedback.android.tsx +5 -4
  172. package/src/components/touchables/TouchableOpacity.tsx +6 -7
  173. package/src/components/touchables/TouchableWithoutFeedback.tsx +3 -1
  174. package/src/components/touchables/index.ts +3 -0
  175. package/src/handlers/createHandler.tsx +5 -3
  176. package/src/handlers/gestureHandlerCommon.ts +39 -0
  177. package/src/handlers/gestures/GestureDetector.tsx +3 -1
  178. package/src/handlers/gestures/gesture.ts +6 -0
  179. package/src/handlers/gestures/gestureObjects.ts +5 -0
  180. package/src/handlers/gestures/hoverGesture.ts +83 -0
  181. package/src/index.ts +8 -0
  182. package/src/web/handlers/FlingGestureHandler.ts +0 -11
  183. package/src/web/handlers/GestureHandler.ts +68 -88
  184. package/src/web/handlers/HoverGestureHandler.ts +43 -0
  185. package/src/web/handlers/LongPressGestureHandler.ts +5 -7
  186. package/src/web/handlers/NativeViewGestureHandler.ts +11 -4
  187. package/src/web/handlers/PanGestureHandler.ts +1 -6
  188. package/src/web/handlers/TapGestureHandler.ts +0 -11
  189. package/src/web/interfaces.ts +4 -2
  190. package/src/web/tools/EventManager.ts +15 -7
  191. package/src/web/tools/GestureHandlerDelegate.ts +23 -0
  192. package/src/web/tools/GestureHandlerOrchestrator.ts +7 -6
  193. package/src/web/tools/GestureHandlerWebDelegate.ts +115 -0
  194. package/src/web/tools/PointerEventManager.ts +46 -16
  195. package/src/web/tools/TouchEventManager.ts +3 -3
@@ -1,5 +1,4 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-function */
2
- import { findNodeHandle } from 'react-native';
3
2
  import { State } from '../../State';
4
3
  import {
5
4
  Config,
@@ -15,26 +14,22 @@ import {
15
14
  import EventManager from '../tools/EventManager';
16
15
  import GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';
17
16
  import InteractionManager from '../tools/InteractionManager';
18
- import PointerEventManager from '../tools/PointerEventManager';
19
17
  import PointerTracker, { TrackerElement } from '../tools/PointerTracker';
20
- import TouchEventManager from '../tools/TouchEventManager';
21
- import { isPointerInBounds } from '../utils';
18
+ import { GestureHandlerDelegate } from '../tools/GestureHandlerDelegate';
22
19
 
23
20
  export default abstract class GestureHandler {
24
21
  private lastSentState: State | null = null;
25
22
  protected currentState: State = State.UNDETERMINED;
26
23
 
27
24
  protected shouldCancellWhenOutside = false;
28
- protected hasCustomActivationCriteria: boolean;
25
+ protected hasCustomActivationCriteria = false;
29
26
  protected enabled = false;
30
27
 
31
- private ref!: number;
28
+ private viewRef!: number;
32
29
  private propsRef!: React.RefObject<unknown>;
33
30
  private handlerTag!: number;
34
31
  protected config: Config = { enabled: false };
35
- protected view!: HTMLElement;
36
32
 
37
- protected eventManagers: EventManager[] = [];
38
33
  protected tracker: PointerTracker = new PointerTracker();
39
34
 
40
35
  // Orchestrator properties
@@ -44,59 +39,38 @@ export default abstract class GestureHandler {
44
39
  protected shouldResetProgress = false;
45
40
  protected pointerType: PointerType = PointerType.NONE;
46
41
 
47
- public constructor() {
48
- this.hasCustomActivationCriteria = false;
42
+ protected delegate: GestureHandlerDelegate<unknown>;
43
+
44
+ public constructor(delegate: GestureHandlerDelegate<unknown>) {
45
+ this.delegate = delegate;
49
46
  }
50
47
 
51
48
  //
52
49
  // Initializing handler
53
50
  //
54
51
 
55
- protected init(ref: number, propsRef: React.RefObject<unknown>) {
52
+ protected init(viewRef: number, propsRef: React.RefObject<unknown>) {
56
53
  this.propsRef = propsRef;
57
- this.ref = ref;
54
+ this.viewRef = viewRef;
58
55
 
59
56
  this.currentState = State.UNDETERMINED;
60
57
 
61
- this.setView();
62
- this.addEventManager(new PointerEventManager(this.view));
63
- this.addEventManager(new TouchEventManager(this.view));
58
+ this.delegate.init(viewRef, this);
64
59
  }
65
60
 
66
- private setView() {
67
- if (!this.ref) {
68
- throw new Error(
69
- `Cannot find HTML Element for handler ${this.handlerTag}`
70
- );
71
- }
72
-
73
- this.view = findNodeHandle(this.ref) as unknown as HTMLElement;
74
- this.view.style['touchAction'] = 'none';
75
- //@ts-ignore This one disables default events on Safari
76
- this.view.style['WebkitTouchCallout'] = 'none';
77
-
78
- if (!this.config.userSelect) {
79
- this.view.style['webkitUserSelect'] = 'none';
80
- this.view.style['userSelect'] = 'none';
81
- } else {
82
- this.view.style['webkitUserSelect'] = this.config.userSelect;
83
- this.view.style['userSelect'] = this.config.userSelect;
84
- }
85
- }
86
-
87
- private addEventManager(manager: EventManager): void {
61
+ public attachEventManager(manager: EventManager<unknown>): void {
88
62
  manager.setOnPointerDown(this.onPointerDown.bind(this));
89
63
  manager.setOnPointerAdd(this.onPointerAdd.bind(this));
90
64
  manager.setOnPointerUp(this.onPointerUp.bind(this));
91
65
  manager.setOnPointerRemove(this.onPointerRemove.bind(this));
92
66
  manager.setOnPointerMove(this.onPointerMove.bind(this));
93
67
  manager.setOnPointerEnter(this.onPointerEnter.bind(this));
94
- manager.setOnPointerOut(this.onPointerOut.bind(this));
68
+ manager.setOnPointerLeave(this.onPointerLeave.bind(this));
95
69
  manager.setOnPointerCancel(this.onPointerCancel.bind(this));
96
70
  manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));
71
+ manager.setOnPointerMoveOver(this.onPointerMoveOver.bind(this));
72
+ manager.setOnPointerMoveOut(this.onPointerMoveOut.bind(this));
97
73
  manager.setListeners();
98
-
99
- this.eventManagers.push(manager);
100
74
  }
101
75
 
102
76
  //
@@ -111,9 +85,7 @@ export default abstract class GestureHandler {
111
85
  this.tracker.resetTracker();
112
86
  this.onReset();
113
87
  this.resetProgress();
114
- this.eventManagers.forEach((manager: EventManager) =>
115
- manager.resetManager()
116
- );
88
+ this.delegate.reset();
117
89
  this.currentState = State.UNDETERMINED;
118
90
  }
119
91
 
@@ -167,8 +139,11 @@ export default abstract class GestureHandler {
167
139
  this.currentState === State.ACTIVE ||
168
140
  this.currentState === State.BEGAN
169
141
  ) {
142
+ // Here the order of calling the delegate and moveToState is important.
143
+ // At this point we can use currentState as previuos state, because immediately after changing cursor we call moveToState method.
144
+ this.delegate.onFail();
145
+
170
146
  this.moveToState(State.FAILED, sendIfDisabled);
171
- this.view.style.cursor = 'auto';
172
147
  }
173
148
 
174
149
  this.resetProgress();
@@ -184,8 +159,11 @@ export default abstract class GestureHandler {
184
159
  this.currentState === State.BEGAN
185
160
  ) {
186
161
  this.onCancel();
162
+
163
+ // Same as above - order matters
164
+ this.delegate.onCancel();
165
+
187
166
  this.moveToState(State.CANCELLED, sendIfDisabled);
188
- this.view.style.cursor = 'auto';
189
167
  }
190
168
  }
191
169
 
@@ -194,8 +172,9 @@ export default abstract class GestureHandler {
194
172
  this.currentState === State.UNDETERMINED ||
195
173
  this.currentState === State.BEGAN
196
174
  ) {
175
+ this.delegate.onActivate();
176
+
197
177
  this.moveToState(State.ACTIVE);
198
- this.view.style.cursor = 'grab';
199
178
  }
200
179
  }
201
180
 
@@ -204,8 +183,10 @@ export default abstract class GestureHandler {
204
183
  this.currentState === State.BEGAN ||
205
184
  this.currentState === State.ACTIVE
206
185
  ) {
186
+ // Same as above - order matters
187
+ this.delegate.onEnd();
188
+
207
189
  this.moveToState(State.END);
208
- this.view.style.cursor = 'auto';
209
190
  }
210
191
 
211
192
  this.resetProgress();
@@ -326,7 +307,7 @@ export default abstract class GestureHandler {
326
307
  this.sendTouchEvent(event);
327
308
  }
328
309
  }
329
- protected onPointerOut(event: AdaptedEvent): void {
310
+ protected onPointerLeave(event: AdaptedEvent): void {
330
311
  if (this.shouldCancellWhenOutside) {
331
312
  switch (this.currentState) {
332
313
  case State.ACTIVE:
@@ -362,6 +343,12 @@ export default abstract class GestureHandler {
362
343
  this.sendTouchEvent(event);
363
344
  }
364
345
  }
346
+ protected onPointerMoveOver(_event: AdaptedEvent): void {
347
+ // used only by hover gesture handler atm
348
+ }
349
+ protected onPointerMoveOut(_event: AdaptedEvent): void {
350
+ // used only by hover gesture handler atm
351
+ }
365
352
  private tryToSendMoveEvent(out: boolean): void {
366
353
  if (
367
354
  this.enabled &&
@@ -421,13 +408,13 @@ export default abstract class GestureHandler {
421
408
  nativeEvent: {
422
409
  numberOfPointers: this.tracker.getTrackedPointersCount(),
423
410
  state: newState,
424
- pointerInside: isPointerInBounds(this.view, {
411
+ pointerInside: this.delegate.isPointerInBounds({
425
412
  x: this.tracker.getLastAvgX(),
426
413
  y: this.tracker.getLastAvgY(),
427
414
  }),
428
415
  ...this.transformNativeEvent(),
429
416
  handlerTag: this.handlerTag,
430
- target: this.ref,
417
+ target: this.viewRef,
431
418
  oldState: newState !== oldState ? oldState : undefined,
432
419
  },
433
420
  timeStamp: Date.now(),
@@ -437,7 +424,7 @@ export default abstract class GestureHandler {
437
424
  private transformTouchEvent(
438
425
  event: AdaptedEvent
439
426
  ): ResultTouchEvent | undefined {
440
- const rect = this.view.getBoundingClientRect();
427
+ const rect = this.delegate.measureView();
441
428
 
442
429
  const all: PointerData[] = [];
443
430
  const changed: PointerData[] = [];
@@ -457,8 +444,8 @@ export default abstract class GestureHandler {
457
444
 
458
445
  all.push({
459
446
  id: id,
460
- x: element.lastX - rect.left,
461
- y: element.lastY - rect.top,
447
+ x: element.lastX - rect.pageX,
448
+ y: element.lastY - rect.pageY,
462
449
  absoluteX: element.lastX,
463
450
  absoluteY: element.lastY,
464
451
  });
@@ -469,8 +456,8 @@ export default abstract class GestureHandler {
469
456
  if (event.eventType !== EventTypes.CANCEL) {
470
457
  changed.push({
471
458
  id: this.tracker.getMappedTouchEventId(event.pointerId),
472
- x: event.x - rect.left,
473
- y: event.y - rect.top,
459
+ x: event.x - rect.pageX,
460
+ y: event.y - rect.pageY,
474
461
  absoluteX: event.x,
475
462
  absoluteY: event.y,
476
463
  });
@@ -480,8 +467,8 @@ export default abstract class GestureHandler {
480
467
 
481
468
  changed.push({
482
469
  id: id,
483
- x: element.lastX - rect.left,
484
- y: element.lastY - rect.top,
470
+ x: element.lastX - rect.pageX,
471
+ y: element.lastY - rect.pageY,
485
472
  absoluteX: element.lastX,
486
473
  absoluteY: element.lastY,
487
474
  });
@@ -533,7 +520,7 @@ export default abstract class GestureHandler {
533
520
  }
534
521
 
535
522
  private cancelTouches(): void {
536
- const rect = this.view.getBoundingClientRect();
523
+ const rect = this.delegate.measureView();
537
524
 
538
525
  const all: PointerData[] = [];
539
526
  const changed: PointerData[] = [];
@@ -549,16 +536,16 @@ export default abstract class GestureHandler {
549
536
 
550
537
  all.push({
551
538
  id: id,
552
- x: element.lastX - rect.left,
553
- y: element.lastY - rect.top,
539
+ x: element.lastX - rect.pageX,
540
+ y: element.lastY - rect.pageY,
554
541
  absoluteX: element.lastX,
555
542
  absoluteY: element.lastY,
556
543
  });
557
544
 
558
545
  changed.push({
559
546
  id: id,
560
- x: element.lastX - rect.left,
561
- y: element.lastY - rect.top,
547
+ x: element.lastX - rect.pageX,
548
+ y: element.lastY - rect.pageY,
562
549
  absoluteX: element.lastX,
563
550
  absoluteY: element.lastY,
564
551
  });
@@ -582,8 +569,16 @@ export default abstract class GestureHandler {
582
569
  invokeNullableMethod(onGestureHandlerEvent, cancelEvent);
583
570
  }
584
571
 
585
- protected transformNativeEvent() {
586
- return {};
572
+ protected transformNativeEvent(): Record<string, unknown> {
573
+ // those properties are shared by most handlers and if not this method will be overriden
574
+ const rect = this.delegate.measureView();
575
+
576
+ return {
577
+ x: this.tracker.getLastAvgX() - rect.pageX,
578
+ y: this.tracker.getLastAvgY() - rect.pageY,
579
+ absoluteX: this.tracker.getLastAvgX(),
580
+ absoluteY: this.tracker.getLastAvgY(),
581
+ };
587
582
  }
588
583
 
589
584
  //
@@ -678,8 +673,7 @@ export default abstract class GestureHandler {
678
673
  return true;
679
674
  }
680
675
 
681
- const width = this.view.getBoundingClientRect().width;
682
- const height = this.view.getBoundingClientRect().height;
676
+ const { width, height } = this.delegate.measureView();
683
677
 
684
678
  let left = 0;
685
679
  let top = 0;
@@ -727,9 +721,9 @@ export default abstract class GestureHandler {
727
721
  }
728
722
  }
729
723
 
730
- const rect: DOMRect = this.view.getBoundingClientRect();
731
- const offsetX: number = this.tracker.getLastX() - rect.left;
732
- const offsetY: number = this.tracker.getLastY() - rect.top;
724
+ const rect = this.delegate.measureView();
725
+ const offsetX: number = this.tracker.getLastX() - rect.pageX;
726
+ const offsetY: number = this.tracker.getLastY() - rect.pageY;
733
727
 
734
728
  if (
735
729
  offsetX >= left &&
@@ -742,14 +736,6 @@ export default abstract class GestureHandler {
742
736
  return false;
743
737
  }
744
738
 
745
- public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
746
- const rect: DOMRect = this.view.getBoundingClientRect();
747
-
748
- return (
749
- x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
750
- );
751
- }
752
-
753
739
  protected resetConfig(): void {}
754
740
 
755
741
  //
@@ -759,24 +745,17 @@ export default abstract class GestureHandler {
759
745
  public getTag(): number {
760
746
  return this.handlerTag;
761
747
  }
748
+
762
749
  public setTag(tag: number): void {
763
750
  this.handlerTag = tag;
764
751
  }
765
752
 
766
- protected getConfig() {
753
+ public getConfig() {
767
754
  return this.config;
768
755
  }
769
756
 
770
- public getShouldEnableGestureOnSetup(): boolean {
771
- throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');
772
- }
773
-
774
- public getView(): HTMLElement {
775
- return this.view;
776
- }
777
-
778
- public getEventManagers(): EventManager[] {
779
- return this.eventManagers;
757
+ public getDelegate(): GestureHandlerDelegate<unknown> {
758
+ return this.delegate;
780
759
  }
781
760
 
782
761
  public getTracker(): PointerTracker {
@@ -806,6 +785,7 @@ export default abstract class GestureHandler {
806
785
  protected setShouldCancelWhenOutside(shouldCancel: boolean) {
807
786
  this.shouldCancellWhenOutside = shouldCancel;
808
787
  }
788
+
809
789
  protected getShouldCancelWhenOutside(): boolean {
810
790
  return this.shouldCancellWhenOutside;
811
791
  }
@@ -0,0 +1,43 @@
1
+ import { State } from '../../../src/State';
2
+ import { AdaptedEvent, Config } from '../interfaces';
3
+ import GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';
4
+ import GestureHandler from './GestureHandler';
5
+
6
+ export default class HoverGestureHandler extends GestureHandler {
7
+ public init(ref: number, propsRef: React.RefObject<unknown>) {
8
+ super.init(ref, propsRef);
9
+ }
10
+
11
+ public updateGestureConfig({ enabled = true, ...props }: Config): void {
12
+ super.updateGestureConfig({ enabled: enabled, ...props });
13
+ }
14
+
15
+ protected onPointerMoveOver(event: AdaptedEvent): void {
16
+ GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);
17
+
18
+ this.tracker.addToTracker(event);
19
+ super.onPointerMoveOver(event);
20
+
21
+ if (this.getState() === State.UNDETERMINED) {
22
+ this.begin();
23
+ this.activate();
24
+ }
25
+ }
26
+
27
+ protected onPointerMoveOut(event: AdaptedEvent): void {
28
+ this.tracker.addToTracker(event);
29
+ super.onPointerMoveOut(event);
30
+
31
+ this.end();
32
+ }
33
+
34
+ protected onPointerMove(event: AdaptedEvent): void {
35
+ this.tracker.track(event);
36
+ super.onPointerMove(event);
37
+ }
38
+
39
+ protected onPointerCancel(event: AdaptedEvent): void {
40
+ super.onPointerCancel(event);
41
+ this.reset();
42
+ }
43
+ }
@@ -1,3 +1,4 @@
1
+ import { Platform } from 'react-native';
1
2
  import { State } from '../../State';
2
3
  import { AdaptedEvent, Config } from '../interfaces';
3
4
 
@@ -23,17 +24,14 @@ export default class LongPressGestureHandler extends GestureHandler {
23
24
  public init(ref: number, propsRef: React.RefObject<unknown>) {
24
25
  super.init(ref, propsRef);
25
26
 
26
- this.view.oncontextmenu = () => false;
27
+ if (Platform.OS === 'web') {
28
+ (this.delegate.getView() as HTMLElement).oncontextmenu = () => false;
29
+ }
27
30
  }
28
31
 
29
32
  protected transformNativeEvent() {
30
- const rect: DOMRect = this.view.getBoundingClientRect();
31
-
32
33
  return {
33
- x: this.tracker.getLastAvgX() - rect.left,
34
- y: this.tracker.getLastAvgY() - rect.top,
35
- absoluteX: this.tracker.getLastAvgX(),
36
- absoluteY: this.tracker.getLastAvgY(),
34
+ ...super.transformNativeEvent(),
37
35
  duration: Date.now() - this.startTime,
38
36
  };
39
37
  }
@@ -1,3 +1,4 @@
1
+ import { Platform } from 'react-native';
1
2
  import { State } from '../../State';
2
3
  import { DEFAULT_TOUCH_SLOP } from '../constants';
3
4
  import { AdaptedEvent, Config } from '../interfaces';
@@ -20,12 +21,18 @@ export default class NativeViewGestureHandler extends GestureHandler {
20
21
 
21
22
  this.setShouldCancelWhenOutside(true);
22
23
 
23
- this.view.style['touchAction'] = 'auto';
24
+ if (Platform.OS !== 'web') {
25
+ return;
26
+ }
27
+
28
+ const view = this.delegate.getView() as HTMLElement;
29
+
30
+ view.style['touchAction'] = 'auto';
24
31
 
25
32
  //@ts-ignore Turns on defualt touch behavior on Safari
26
- this.view.style['WebkitTouchCallout'] = 'auto';
33
+ view.style['WebkitTouchCallout'] = 'auto';
27
34
 
28
- if (this.view.hasAttribute('role')) {
35
+ if (view.hasAttribute('role')) {
29
36
  this.buttonRole = true;
30
37
  } else {
31
38
  this.buttonRole = false;
@@ -89,7 +96,7 @@ export default class NativeViewGestureHandler extends GestureHandler {
89
96
  }
90
97
  }
91
98
 
92
- protected onPointerOut(): void {
99
+ protected onPointerLeave(): void {
93
100
  if (
94
101
  this.currentState === State.BEGAN ||
95
102
  this.currentState === State.ACTIVE
@@ -186,20 +186,15 @@ export default class PanGestureHandler extends GestureHandler {
186
186
  }
187
187
 
188
188
  protected transformNativeEvent() {
189
- const rect: DOMRect = this.view.getBoundingClientRect();
190
-
191
189
  const translationX: number = this.getTranslationX();
192
190
  const translationY: number = this.getTranslationY();
193
191
 
194
192
  return {
193
+ ...super.transformNativeEvent(),
195
194
  translationX: isNaN(translationX) ? 0 : translationX,
196
195
  translationY: isNaN(translationY) ? 0 : translationY,
197
- absoluteX: this.tracker.getLastAvgX(),
198
- absoluteY: this.tracker.getLastAvgY(),
199
196
  velocityX: this.velocityX,
200
197
  velocityY: this.velocityY,
201
- x: this.tracker.getLastAvgX() - rect.left,
202
- y: this.tracker.getLastAvgY() - rect.top,
203
198
  };
204
199
  }
205
200
 
@@ -79,17 +79,6 @@ export default class TapGestureHandler extends GestureHandler {
79
79
  this.minNumberOfPointers = DEFAULT_MIN_NUMBER_OF_POINTERS;
80
80
  }
81
81
 
82
- protected transformNativeEvent() {
83
- const rect: DOMRect = this.view.getBoundingClientRect();
84
-
85
- return {
86
- x: this.tracker.getLastAvgX() - rect.left,
87
- y: this.tracker.getLastAvgY() - rect.top,
88
- absoluteX: this.tracker.getLastAvgX(),
89
- absoluteY: this.tracker.getLastAvgY(),
90
- };
91
- }
92
-
93
82
  private clearTimeouts(): void {
94
83
  clearTimeout(this.waitTimeout);
95
84
  clearTimeout(this.delayTimeout);
@@ -1,4 +1,4 @@
1
- import { UserSelect } from '../handlers/gestureHandlerCommon';
1
+ import { UserSelect, ActiveCursor } from '../handlers/gestureHandlerCommon';
2
2
  import { Directions } from '../Directions';
3
3
  import { State } from '../State';
4
4
 
@@ -22,6 +22,7 @@ type ConfigArgs =
22
22
  | boolean
23
23
  | HitSlop
24
24
  | UserSelect
25
+ | ActiveCursor
25
26
  | Directions
26
27
  | Handler[]
27
28
  | null
@@ -34,6 +35,7 @@ export interface Config extends Record<string, ConfigArgs> {
34
35
  hitSlop?: HitSlop;
35
36
  shouldCancelWhenOutside?: boolean;
36
37
  userSelect?: UserSelect;
38
+ activeCursor?: ActiveCursor;
37
39
 
38
40
  activateAfterLongPress?: number;
39
41
  failOffsetXStart?: number;
@@ -144,7 +146,7 @@ export enum EventTypes {
144
146
  ADDITIONAL_POINTER_UP,
145
147
  MOVE,
146
148
  ENTER,
147
- OUT,
149
+ LEAVE,
148
150
  CANCEL,
149
151
  }
150
152
 
@@ -1,12 +1,12 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-function */
2
2
  import { AdaptedEvent, EventTypes, TouchEventType } from '../interfaces';
3
3
 
4
- export default abstract class EventManager {
5
- protected readonly view: HTMLElement;
4
+ export default abstract class EventManager<T> {
5
+ protected readonly view: T;
6
6
  protected pointersInBounds: number[] = [];
7
7
  protected activePointersCounter: number;
8
8
 
9
- constructor(view: HTMLElement) {
9
+ constructor(view: T) {
10
10
  this.view = view;
11
11
  this.activePointersCounter = 0;
12
12
  }
@@ -24,8 +24,8 @@ export default abstract class EventManager {
24
24
  protected onPointerUp(_event: AdaptedEvent): void {}
25
25
  protected onPointerRemove(_event: AdaptedEvent): void {}
26
26
  protected onPointerMove(_event: AdaptedEvent): void {}
27
- protected onPointerOut(_event: AdaptedEvent): void {}
28
- protected onPointerEnter(_event: AdaptedEvent): void {}
27
+ protected onPointerLeave(_event: AdaptedEvent): void {} // called only when pointer is pressed (or touching)
28
+ protected onPointerEnter(_event: AdaptedEvent): void {} // called only when pointer is pressed (or touching)
29
29
  protected onPointerCancel(_event: AdaptedEvent): void {
30
30
  // When pointer cancel is triggered and there are more pointers on the view, only one pointer is cancelled
31
31
  // Because we want all pointers to be cancelled by that event, we are doing it manually by reseting handler and changing activePointersCounter to 0
@@ -33,6 +33,8 @@ export default abstract class EventManager {
33
33
  // is equal to 0. This prevents counter from going to negative values, when pointers are removed from view after one of them has been cancelled
34
34
  }
35
35
  protected onPointerOutOfBounds(_event: AdaptedEvent): void {}
36
+ protected onPointerMoveOver(_event: AdaptedEvent): void {}
37
+ protected onPointerMoveOut(_event: AdaptedEvent): void {}
36
38
 
37
39
  public setOnPointerDown(callback: (event: AdaptedEvent) => void): void {
38
40
  this.onPointerDown = callback;
@@ -49,8 +51,8 @@ export default abstract class EventManager {
49
51
  public setOnPointerMove(callback: (event: AdaptedEvent) => void): void {
50
52
  this.onPointerMove = callback;
51
53
  }
52
- public setOnPointerOut(callback: (event: AdaptedEvent) => void): void {
53
- this.onPointerOut = callback;
54
+ public setOnPointerLeave(callback: (event: AdaptedEvent) => void): void {
55
+ this.onPointerLeave = callback;
54
56
  }
55
57
  public setOnPointerEnter(callback: (event: AdaptedEvent) => void): void {
56
58
  this.onPointerEnter = callback;
@@ -63,6 +65,12 @@ export default abstract class EventManager {
63
65
  ): void {
64
66
  this.onPointerOutOfBounds = callback;
65
67
  }
68
+ public setOnPointerMoveOver(callback: (event: AdaptedEvent) => void): void {
69
+ this.onPointerMoveOver = callback;
70
+ }
71
+ public setOnPointerMoveOut(callback: (event: AdaptedEvent) => void): void {
72
+ this.onPointerMoveOut = callback;
73
+ }
66
74
 
67
75
  protected markAsInBounds(pointerId: number): void {
68
76
  if (this.pointersInBounds.indexOf(pointerId) >= 0) {
@@ -0,0 +1,23 @@
1
+ import type GestureHandler from '../handlers/GestureHandler';
2
+
3
+ export interface MeasureResult {
4
+ pageX: number;
5
+ pageY: number;
6
+ width: number;
7
+ height: number;
8
+ }
9
+
10
+ export interface GestureHandlerDelegate<T> {
11
+ getView(): T;
12
+
13
+ init(viewRef: number, handler: GestureHandler): void;
14
+ isPointerInBounds({ x, y }: { x: number; y: number }): boolean;
15
+ measureView(): MeasureResult;
16
+ reset(): void;
17
+
18
+ onBegin(): void;
19
+ onActivate(): void;
20
+ onEnd(): void;
21
+ onCancel(): void;
22
+ onFail(): void;
23
+ }
@@ -3,7 +3,6 @@ import { PointerType } from '../interfaces';
3
3
 
4
4
  import GestureHandler from '../handlers/GestureHandler';
5
5
  import PointerTracker from './PointerTracker';
6
- import { isPointerInBounds } from '../utils';
7
6
 
8
7
  export default class GestureHandlerOrchestrator {
9
8
  private static instance: GestureHandlerOrchestrator;
@@ -301,7 +300,7 @@ export default class GestureHandlerOrchestrator {
301
300
 
302
301
  if (
303
302
  !PointerTracker.shareCommonPointers(handlerPointers, otherPointers) &&
304
- handler.getView() !== otherHandler.getView()
303
+ handler.getDelegate().getView() !== otherHandler.getDelegate().getView()
305
304
  ) {
306
305
  return this.checkOverlap(handler, otherHandler);
307
306
  }
@@ -329,8 +328,10 @@ export default class GestureHandlerOrchestrator {
329
328
  const handlerY: number = handler.getTracker().getLastY(pointer);
330
329
 
331
330
  if (
332
- isPointerInBounds(handler.getView(), { x: handlerX, y: handlerY }) &&
333
- isPointerInBounds(otherHandler.getView(), { x: handlerX, y: handlerY })
331
+ handler.getDelegate().isPointerInBounds({ x: handlerX, y: handlerY }) &&
332
+ otherHandler
333
+ .getDelegate()
334
+ .isPointerInBounds({ x: handlerX, y: handlerY })
334
335
  ) {
335
336
  overlap = true;
336
337
  }
@@ -341,8 +342,8 @@ export default class GestureHandlerOrchestrator {
341
342
  const otherY: number = otherHandler.getTracker().getLastY(pointer);
342
343
 
343
344
  if (
344
- isPointerInBounds(handler.getView(), { x: otherX, y: otherY }) &&
345
- isPointerInBounds(otherHandler.getView(), { x: otherX, y: otherY })
345
+ handler.getDelegate().isPointerInBounds({ x: otherX, y: otherY }) &&
346
+ otherHandler.getDelegate().isPointerInBounds({ x: otherX, y: otherY })
346
347
  ) {
347
348
  overlap = true;
348
349
  }