react-native-gesture-handler 2.12.1 → 2.13.1

Sign up to get free protection for your applications and to get access to all the features.
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 +3 -3
  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 +3 -1
  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 +3 -3
  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 +2 -1
  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 +4 -2
  176. package/src/handlers/gestureHandlerCommon.ts +39 -0
  177. package/src/handlers/gestures/GestureDetector.tsx +2 -0
  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
package/src/index.ts CHANGED
@@ -73,6 +73,7 @@ export type { RotationGestureType as RotationGesture } from './handlers/gestures
73
73
  export type { ForceTouchGestureType as ForceTouchGesture } from './handlers/gestures/forceTouchGesture';
74
74
  export type { NativeGestureType as NativeGesture } from './handlers/gestures/nativeGesture';
75
75
  export type { ManualGestureType as ManualGesture } from './handlers/gestures/manualGesture';
76
+ export type { HoverGestureType as HoverGesture } from './handlers/gestures/hoverGesture';
76
77
  export type {
77
78
  ComposedGestureType as ComposedGesture,
78
79
  RaceGestureType as RaceGesture,
@@ -94,6 +95,11 @@ export {
94
95
  BorderlessButton,
95
96
  PureNativeButton,
96
97
  } from './components/GestureButtons';
98
+ export type {
99
+ TouchableHighlightProps,
100
+ TouchableOpacityProps,
101
+ TouchableWithoutFeedbackProps,
102
+ } from './components/touchables';
97
103
  export {
98
104
  TouchableHighlight,
99
105
  TouchableNativeFeedback,
@@ -108,6 +114,7 @@ export {
108
114
  FlatList,
109
115
  RefreshControl,
110
116
  } from './components/GestureComponents';
117
+ export { HoverEffect } from './handlers/gestures/hoverGesture';
111
118
  export type {
112
119
  //events
113
120
  GestureHandlerGestureEvent,
@@ -147,6 +154,7 @@ export type {
147
154
  BorderlessButtonProperties,
148
155
  } from './handlers/gestureHandlerTypesCompat';
149
156
 
157
+ export type { SwipeableProps } from './components/Swipeable';
150
158
  export { default as Swipeable } from './components/Swipeable';
151
159
  export type {
152
160
  DrawerLayoutProps,
@@ -39,17 +39,6 @@ export default class FlingGestureHandler extends GestureHandler {
39
39
  }
40
40
  }
41
41
 
42
- protected transformNativeEvent() {
43
- const rect: DOMRect = this.view.getBoundingClientRect();
44
-
45
- return {
46
- x: this.tracker.getLastAvgX() - rect.left,
47
- y: this.tracker.getLastAvgY() - rect.top,
48
- absoluteX: this.tracker.getLastAvgX(),
49
- absoluteY: this.tracker.getLastAvgY(),
50
- };
51
- }
52
-
53
42
  private startFling(): void {
54
43
  this.startX = this.tracker.getLastX(this.keyPointer);
55
44
  this.startY = this.tracker.getLastY(this.keyPointer);
@@ -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 '../../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
+ }