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.
- package/android/build.gradle +2 -2
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js +7 -0
- package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js +1 -1
- package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.macos.js +22 -13
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +23 -10
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js +6 -4
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.web.js +1 -1
- package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +4 -4
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
- package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
- package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +4 -2
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
- package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
- package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
- package/lib/commonjs/utils.js +10 -6
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
- package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
- package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +330 -79
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
- package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js +22 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js +40 -96
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/commonjs/web/tools/InteractionManager.js +24 -10
- package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
- package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
- package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerTracker.js +97 -7
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
- package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
- package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
- package/lib/commonjs/web/utils.js +15 -0
- package/lib/commonjs/web/utils.js.map +1 -0
- package/lib/module/EnableExperimentalWebImplementation.js +5 -0
- package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.js +1 -1
- package/lib/module/RNGestureHandlerModule.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.macos.js +21 -14
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +22 -11
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/GestureComponents.js +6 -4
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/GestureComponents.web.js +1 -1
- package/lib/module/components/GestureComponents.web.js.map +1 -1
- package/lib/module/components/Swipeable.js +4 -4
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
- package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
- package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +5 -3
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/eventReceiver.js +14 -20
- package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
- package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
- package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
- package/lib/module/utils.js +7 -6
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
- package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
- package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
- package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +324 -79
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
- package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +57 -41
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/TapGestureHandler.js +52 -50
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js +19 -0
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js +39 -95
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/module/web/tools/InteractionManager.js +24 -10
- package/lib/module/web/tools/InteractionManager.js.map +1 -1
- package/lib/module/web/tools/NodeManager.js.map +1 -1
- package/lib/module/web/tools/PointerEventManager.js +116 -0
- package/lib/module/web/tools/PointerEventManager.js.map +1 -0
- package/lib/module/web/tools/PointerTracker.js +97 -7
- package/lib/module/web/tools/PointerTracker.js.map +1 -1
- package/lib/module/web/tools/TouchEventManager.js +124 -0
- package/lib/module/web/tools/TouchEventManager.js.map +1 -0
- package/lib/module/web/utils.js +8 -0
- package/lib/module/web/utils.js.map +1 -0
- package/lib/typescript/RNGestureHandlerModule.macos.d.ts +6 -3
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
- package/lib/typescript/components/Swipeable.d.ts +3 -3
- package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
- package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
- package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
- package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
- package/lib/typescript/utils.d.ts +4 -0
- package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
- package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
- package/lib/typescript/web/handlers/GestureHandler.d.ts +42 -32
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
- package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
- package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
- package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
- package/lib/typescript/web/interfaces.d.ts +50 -10
- package/lib/typescript/web/tools/EventManager.d.ts +28 -26
- package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
- package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
- package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
- package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
- package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
- package/lib/typescript/web/utils.d.ts +4 -0
- package/package.json +2 -2
- package/src/EnableExperimentalWebImplementation.ts +9 -0
- package/src/RNGestureHandlerModule.macos.ts +28 -13
- package/src/RNGestureHandlerModule.ts +4 -1
- package/src/RNGestureHandlerModule.web.ts +20 -7
- package/src/components/GestureComponents.tsx +12 -16
- package/src/components/GestureComponents.web.tsx +1 -1
- package/src/components/Swipeable.tsx +11 -7
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
- package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
- package/src/handlers/gestures/GestureDetector.tsx +8 -4
- package/src/handlers/gestures/eventReceiver.ts +23 -24
- package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
- package/src/utils.ts +6 -6
- package/src/web/detectors/RotationGestureDetector.ts +20 -52
- package/src/web/detectors/ScaleGestureDetector.ts +9 -45
- package/src/web/handlers/FlingGestureHandler.ts +45 -22
- package/src/web/handlers/GestureHandler.ts +365 -97
- package/src/web/handlers/LongPressGestureHandler.ts +30 -24
- package/src/web/handlers/ManualGestureHandler.ts +39 -0
- package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
- package/src/web/handlers/PanGestureHandler.ts +68 -53
- package/src/web/handlers/PinchGestureHandler.ts +47 -44
- package/src/web/handlers/RotationGestureHandler.ts +52 -51
- package/src/web/handlers/TapGestureHandler.ts +74 -56
- package/src/web/interfaces.ts +57 -10
- package/src/web/tools/EventManager.ts +58 -148
- package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
- package/src/web/tools/InteractionManager.ts +25 -9
- package/src/web/tools/NodeManager.ts +6 -6
- package/src/web/tools/PointerEventManager.ts +134 -0
- package/src/web/tools/PointerTracker.ts +120 -10
- package/src/web/tools/TouchEventManager.ts +167 -0
- 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
|
-
|
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
|
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
|
34
|
+
protected config: Config = { enabled: false };
|
35
|
+
protected view!: HTMLElement;
|
28
36
|
|
29
|
-
protected
|
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(
|
54
|
-
this.
|
61
|
+
this.setView();
|
62
|
+
this.addEventManager(new PointerEventManager(this.view));
|
63
|
+
this.addEventManager(new TouchEventManager(this.view));
|
55
64
|
}
|
56
65
|
|
57
|
-
private setView(
|
58
|
-
if (!ref) {
|
59
|
-
|
60
|
-
|
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
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
this.
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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.
|
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,
|
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
|
-
|
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(
|
135
|
-
if (!this.checkHitSlop(
|
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
|
154
|
+
this.moveToState(State.BEGAN);
|
141
155
|
}
|
142
156
|
}
|
143
157
|
|
144
|
-
|
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,
|
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
|
-
|
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,
|
183
|
+
this.moveToState(State.CANCELLED, sendIfDisabled);
|
184
|
+
this.view.style.cursor = 'auto';
|
163
185
|
}
|
164
186
|
}
|
165
187
|
|
166
|
-
|
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
|
193
|
+
this.moveToState(State.ACTIVE);
|
194
|
+
this.view.style.cursor = 'grab';
|
172
195
|
}
|
173
196
|
}
|
174
197
|
|
175
|
-
public end(
|
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
|
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
|
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
|
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
|
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
|
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(
|
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(
|
262
|
-
|
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(
|
265
|
-
|
266
|
-
|
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(
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
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
|
-
|
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.
|
348
|
+
this.enabled &&
|
349
|
+
this.active &&
|
277
350
|
(!out || (out && !this.shouldCancellWhenOutside))
|
278
351
|
) {
|
279
|
-
this.sendEvent(
|
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.
|
328
|
-
x:
|
329
|
-
y:
|
408
|
+
pointerInside: isPointerInBounds(this.view, {
|
409
|
+
x: this.tracker.getLastAvgX(),
|
410
|
+
y: this.tracker.getLastAvgY(),
|
330
411
|
}),
|
331
|
-
...this.transformNativeEvent(
|
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
|
-
|
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(
|
408
|
-
if (!this.config.hitSlop
|
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
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
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
|
753
|
+
public getView(): HTMLElement {
|
494
754
|
return this.view;
|
495
755
|
}
|
496
756
|
|
497
|
-
public
|
498
|
-
return this.
|
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
|
-
|
514
|
-
this.
|
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;
|