react-native-gesture-handler 2.6.0 → 2.6.1
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.
- 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 +20 -9
- 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.web.js +1 -1
- package/lib/commonjs/components/GestureComponents.web.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.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/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 +282 -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 +19 -10
- 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.web.js +1 -1
- package/lib/module/components/GestureComponents.web.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.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/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 +276 -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 +5 -2
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
- 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/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 +41 -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 +25 -10
- package/src/RNGestureHandlerModule.ts +4 -1
- package/src/RNGestureHandlerModule.web.ts +20 -7
- package/src/components/GestureComponents.web.tsx +1 -1
- package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
- package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
- package/src/handlers/gestures/GestureDetector.tsx +0 -1
- package/src/handlers/gestures/eventReceiver.ts +23 -24
- package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
- 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 +306 -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
|
-
);
|
|
88
|
-
|
|
89
|
-
this.eventManager.setListeners();
|
|
90
|
-
}
|
|
82
|
+
private addEventManager(manager: EventManager): void {
|
|
83
|
+
manager.setOnPointerDown(this.onPointerDown.bind(this));
|
|
84
|
+
manager.setOnPointerAdd(this.onPointerAdd.bind(this));
|
|
85
|
+
manager.setOnPointerUp(this.onPointerUp.bind(this));
|
|
86
|
+
manager.setOnPointerRemove(this.onPointerRemove.bind(this));
|
|
87
|
+
manager.setOnPointerMove(this.onPointerMove.bind(this));
|
|
88
|
+
manager.setOnPointerEnter(this.onPointerEnter.bind(this));
|
|
89
|
+
manager.setOnPointerOut(this.onPointerOut.bind(this));
|
|
90
|
+
manager.setOnPointerCancel(this.onPointerCancel.bind(this));
|
|
91
|
+
manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));
|
|
92
|
+
manager.setListeners();
|
|
91
93
|
|
|
92
|
-
|
|
93
|
-
this.interactionManager = manager;
|
|
94
|
+
this.eventManagers.push(manager);
|
|
94
95
|
}
|
|
95
96
|
|
|
96
97
|
//
|
|
@@ -104,6 +105,10 @@ export default abstract class GestureHandler {
|
|
|
104
105
|
public reset(): void {
|
|
105
106
|
this.tracker.resetTracker();
|
|
106
107
|
this.onReset();
|
|
108
|
+
this.resetProgress();
|
|
109
|
+
this.eventManagers.forEach((manager: EventManager) =>
|
|
110
|
+
manager.resetManager()
|
|
111
|
+
);
|
|
107
112
|
this.currentState = State.UNDETERMINED;
|
|
108
113
|
}
|
|
109
114
|
|
|
@@ -111,7 +116,7 @@ export default abstract class GestureHandler {
|
|
|
111
116
|
// State logic
|
|
112
117
|
//
|
|
113
118
|
|
|
114
|
-
public moveToState(newState: State,
|
|
119
|
+
public moveToState(newState: State, sendIfDisabled?: boolean) {
|
|
115
120
|
if (this.currentState === newState) {
|
|
116
121
|
return;
|
|
117
122
|
}
|
|
@@ -123,7 +128,7 @@ export default abstract class GestureHandler {
|
|
|
123
128
|
this,
|
|
124
129
|
newState,
|
|
125
130
|
oldState,
|
|
126
|
-
|
|
131
|
+
sendIfDisabled
|
|
127
132
|
);
|
|
128
133
|
|
|
129
134
|
this.onStateChange(newState, oldState);
|
|
@@ -131,53 +136,63 @@ export default abstract class GestureHandler {
|
|
|
131
136
|
|
|
132
137
|
protected onStateChange(_newState: State, _oldState: State): void {}
|
|
133
138
|
|
|
134
|
-
public begin(
|
|
135
|
-
if (!this.checkHitSlop(
|
|
139
|
+
public begin(): void {
|
|
140
|
+
if (!this.checkHitSlop()) {
|
|
136
141
|
return;
|
|
137
142
|
}
|
|
138
143
|
|
|
139
144
|
if (this.currentState === State.UNDETERMINED) {
|
|
140
|
-
this.moveToState(State.BEGAN
|
|
145
|
+
this.moveToState(State.BEGAN);
|
|
141
146
|
}
|
|
142
147
|
}
|
|
143
148
|
|
|
144
|
-
|
|
149
|
+
/**
|
|
150
|
+
* @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send fail event
|
|
151
|
+
*/
|
|
152
|
+
public fail(sendIfDisabled?: boolean): void {
|
|
145
153
|
if (
|
|
146
154
|
this.currentState === State.ACTIVE ||
|
|
147
155
|
this.currentState === State.BEGAN
|
|
148
156
|
) {
|
|
149
|
-
this.moveToState(State.FAILED,
|
|
157
|
+
this.moveToState(State.FAILED, sendIfDisabled);
|
|
158
|
+
this.view.style.cursor = 'auto';
|
|
150
159
|
}
|
|
151
160
|
|
|
152
161
|
this.resetProgress();
|
|
153
162
|
}
|
|
154
163
|
|
|
155
|
-
|
|
164
|
+
/**
|
|
165
|
+
* @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send cancel event
|
|
166
|
+
*/
|
|
167
|
+
public cancel(sendIfDisabled?: boolean): void {
|
|
156
168
|
if (
|
|
157
169
|
this.currentState === State.ACTIVE ||
|
|
158
170
|
this.currentState === State.UNDETERMINED ||
|
|
159
171
|
this.currentState === State.BEGAN
|
|
160
172
|
) {
|
|
161
173
|
this.onCancel();
|
|
162
|
-
this.moveToState(State.CANCELLED,
|
|
174
|
+
this.moveToState(State.CANCELLED, sendIfDisabled);
|
|
175
|
+
this.view.style.cursor = 'auto';
|
|
163
176
|
}
|
|
164
177
|
}
|
|
165
178
|
|
|
166
|
-
|
|
179
|
+
public activate(_force = false) {
|
|
167
180
|
if (
|
|
168
181
|
this.currentState === State.UNDETERMINED ||
|
|
169
182
|
this.currentState === State.BEGAN
|
|
170
183
|
) {
|
|
171
|
-
this.moveToState(State.ACTIVE
|
|
184
|
+
this.moveToState(State.ACTIVE);
|
|
185
|
+
this.view.style.cursor = 'grab';
|
|
172
186
|
}
|
|
173
187
|
}
|
|
174
188
|
|
|
175
|
-
public end(
|
|
189
|
+
public end() {
|
|
176
190
|
if (
|
|
177
191
|
this.currentState === State.BEGAN ||
|
|
178
192
|
this.currentState === State.ACTIVE
|
|
179
193
|
) {
|
|
180
|
-
this.moveToState(State.END
|
|
194
|
+
this.moveToState(State.END);
|
|
195
|
+
this.view.style.cursor = 'auto';
|
|
181
196
|
}
|
|
182
197
|
|
|
183
198
|
this.resetProgress();
|
|
@@ -220,7 +235,10 @@ export default abstract class GestureHandler {
|
|
|
220
235
|
return false;
|
|
221
236
|
}
|
|
222
237
|
|
|
223
|
-
return
|
|
238
|
+
return InteractionManager.getInstance().shouldWaitForHandlerFailure(
|
|
239
|
+
this,
|
|
240
|
+
handler
|
|
241
|
+
);
|
|
224
242
|
}
|
|
225
243
|
|
|
226
244
|
public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {
|
|
@@ -228,7 +246,7 @@ export default abstract class GestureHandler {
|
|
|
228
246
|
return false;
|
|
229
247
|
}
|
|
230
248
|
|
|
231
|
-
return
|
|
249
|
+
return InteractionManager.getInstance().shouldRequireHandlerToWaitForFailure(
|
|
232
250
|
this,
|
|
233
251
|
handler
|
|
234
252
|
);
|
|
@@ -239,7 +257,10 @@ export default abstract class GestureHandler {
|
|
|
239
257
|
return true;
|
|
240
258
|
}
|
|
241
259
|
|
|
242
|
-
return
|
|
260
|
+
return InteractionManager.getInstance().shouldRecognizeSimultaneously(
|
|
261
|
+
this,
|
|
262
|
+
handler
|
|
263
|
+
);
|
|
243
264
|
}
|
|
244
265
|
|
|
245
266
|
public shouldBeCancelledByOther(handler: GestureHandler): boolean {
|
|
@@ -247,36 +268,96 @@ export default abstract class GestureHandler {
|
|
|
247
268
|
return false;
|
|
248
269
|
}
|
|
249
270
|
|
|
250
|
-
return
|
|
271
|
+
return InteractionManager.getInstance().shouldHandlerBeCancelledBy(
|
|
272
|
+
this,
|
|
273
|
+
handler
|
|
274
|
+
);
|
|
251
275
|
}
|
|
252
276
|
|
|
253
277
|
//
|
|
254
278
|
// Event actions
|
|
255
279
|
//
|
|
256
280
|
|
|
257
|
-
protected onPointerDown(
|
|
281
|
+
protected onPointerDown(event: AdaptedEvent): void {
|
|
258
282
|
GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);
|
|
283
|
+
this.pointerType = event.pointerType;
|
|
284
|
+
|
|
285
|
+
if (this.pointerType === PointerType.TOUCH) {
|
|
286
|
+
GestureHandlerOrchestrator.getInstance().cancelMouseAndPenGestures(this);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (this.config.needsPointerData) {
|
|
290
|
+
this.sendTouchEvent(event);
|
|
291
|
+
}
|
|
259
292
|
}
|
|
260
293
|
// Adding another pointer to existing ones
|
|
261
|
-
protected onPointerAdd(
|
|
262
|
-
|
|
294
|
+
protected onPointerAdd(event: AdaptedEvent): void {
|
|
295
|
+
if (this.config.needsPointerData) {
|
|
296
|
+
this.sendTouchEvent(event);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
protected onPointerUp(event: AdaptedEvent): void {
|
|
300
|
+
if (this.config.needsPointerData) {
|
|
301
|
+
this.sendTouchEvent(event);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
263
304
|
// Removing pointer, when there is more than one pointers
|
|
264
|
-
protected onPointerRemove(
|
|
265
|
-
|
|
266
|
-
|
|
305
|
+
protected onPointerRemove(event: AdaptedEvent): void {
|
|
306
|
+
if (this.config.needsPointerData) {
|
|
307
|
+
this.sendTouchEvent(event);
|
|
308
|
+
}
|
|
267
309
|
}
|
|
268
|
-
protected
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
310
|
+
protected onPointerMove(event: AdaptedEvent): void {
|
|
311
|
+
this.tryToSendMoveEvent(false);
|
|
312
|
+
if (this.config.needsPointerData) {
|
|
313
|
+
this.sendTouchEvent(event);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
protected onPointerOut(event: AdaptedEvent): void {
|
|
317
|
+
if (this.config.needsPointerData) {
|
|
318
|
+
this.sendTouchEvent(event);
|
|
319
|
+
}
|
|
273
320
|
}
|
|
274
|
-
|
|
321
|
+
protected onPointerEnter(event: AdaptedEvent): void {
|
|
322
|
+
if (this.config.needsPointerData) {
|
|
323
|
+
this.sendTouchEvent(event);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
protected onPointerCancel(event: AdaptedEvent): void {
|
|
327
|
+
if (this.config.needsPointerData) {
|
|
328
|
+
this.sendTouchEvent(event);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
protected onPointerOutOfBounds(event: AdaptedEvent): void {
|
|
332
|
+
this.tryToSendMoveEvent(true);
|
|
333
|
+
if (this.config.needsPointerData) {
|
|
334
|
+
this.sendTouchEvent(event);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
private tryToSendMoveEvent(out: boolean): void {
|
|
275
338
|
if (
|
|
276
|
-
this.
|
|
339
|
+
this.enabled &&
|
|
340
|
+
this.active &&
|
|
277
341
|
(!out || (out && !this.shouldCancellWhenOutside))
|
|
278
342
|
) {
|
|
279
|
-
this.sendEvent(
|
|
343
|
+
this.sendEvent(this.currentState, this.currentState);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
public sendTouchEvent(event: AdaptedEvent): void {
|
|
348
|
+
if (!this.enabled) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
const { onGestureHandlerEvent }: PropsRef = this.propsRef
|
|
353
|
+
.current as PropsRef;
|
|
354
|
+
|
|
355
|
+
const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(
|
|
356
|
+
event
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
if (touchEvent) {
|
|
360
|
+
invokeNullableMethod(onGestureHandlerEvent, touchEvent);
|
|
280
361
|
}
|
|
281
362
|
}
|
|
282
363
|
|
|
@@ -284,18 +365,13 @@ export default abstract class GestureHandler {
|
|
|
284
365
|
// Events Sending
|
|
285
366
|
//
|
|
286
367
|
|
|
287
|
-
public sendEvent = (
|
|
288
|
-
event: AdaptedPointerEvent,
|
|
289
|
-
newState: State,
|
|
290
|
-
oldState: State
|
|
291
|
-
): void => {
|
|
368
|
+
public sendEvent = (newState: State, oldState: State): void => {
|
|
292
369
|
const {
|
|
293
370
|
onGestureHandlerEvent,
|
|
294
371
|
onGestureHandlerStateChange,
|
|
295
372
|
}: PropsRef = this.propsRef.current as PropsRef;
|
|
296
373
|
|
|
297
374
|
const resultEvent: ResultEvent = this.transformEventData(
|
|
298
|
-
event,
|
|
299
375
|
newState,
|
|
300
376
|
oldState
|
|
301
377
|
);
|
|
@@ -315,20 +391,16 @@ export default abstract class GestureHandler {
|
|
|
315
391
|
}
|
|
316
392
|
};
|
|
317
393
|
|
|
318
|
-
private transformEventData(
|
|
319
|
-
event: AdaptedPointerEvent,
|
|
320
|
-
newState: State,
|
|
321
|
-
oldState: State
|
|
322
|
-
): ResultEvent {
|
|
394
|
+
private transformEventData(newState: State, oldState: State): ResultEvent {
|
|
323
395
|
return {
|
|
324
396
|
nativeEvent: {
|
|
325
397
|
numberOfPointers: this.tracker.getTrackedPointersCount(),
|
|
326
398
|
state: newState,
|
|
327
|
-
pointerInside: this.
|
|
328
|
-
x:
|
|
329
|
-
y:
|
|
399
|
+
pointerInside: isPointerInBounds(this.view, {
|
|
400
|
+
x: this.tracker.getLastAvgX(),
|
|
401
|
+
y: this.tracker.getLastAvgY(),
|
|
330
402
|
}),
|
|
331
|
-
...this.transformNativeEvent(
|
|
403
|
+
...this.transformNativeEvent(),
|
|
332
404
|
handlerTag: this.handlerTag,
|
|
333
405
|
target: this.ref,
|
|
334
406
|
oldState: newState !== oldState ? oldState : undefined,
|
|
@@ -337,7 +409,105 @@ export default abstract class GestureHandler {
|
|
|
337
409
|
};
|
|
338
410
|
}
|
|
339
411
|
|
|
340
|
-
|
|
412
|
+
private transformTouchEvent(
|
|
413
|
+
event: AdaptedEvent
|
|
414
|
+
): ResultTouchEvent | undefined {
|
|
415
|
+
const rect = this.view.getBoundingClientRect();
|
|
416
|
+
|
|
417
|
+
const all: PointerData[] = [];
|
|
418
|
+
const changed: PointerData[] = [];
|
|
419
|
+
|
|
420
|
+
const trackerData = this.tracker.getData();
|
|
421
|
+
|
|
422
|
+
// This if handles edge case where all pointers have been cancelled
|
|
423
|
+
// When pointercancel is triggered, reset method is called. This means that tracker will be reset after first pointer being cancelled
|
|
424
|
+
// The problem is, that handler will receive another pointercancel event from the rest of the pointers
|
|
425
|
+
// To avoid crashing, we don't send event if tracker tracks no pointers, i.e. has been reset
|
|
426
|
+
if (trackerData.size === 0 || !trackerData.has(event.pointerId)) {
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
trackerData.forEach((element: TrackerElement, key: number): void => {
|
|
431
|
+
const id: number = this.tracker.getMappedTouchEventId(key);
|
|
432
|
+
|
|
433
|
+
all.push({
|
|
434
|
+
id: id,
|
|
435
|
+
x: element.lastX - rect.left,
|
|
436
|
+
y: element.lastY - rect.top,
|
|
437
|
+
absoluteX: element.lastX,
|
|
438
|
+
absoluteY: element.lastY,
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
// Each pointer sends its own event, so we want changed touches to contain only the pointer that has changed.
|
|
443
|
+
// However, if the event is cancel, we want to cancel all pointers to avoid crashes
|
|
444
|
+
if (event.eventType !== EventTypes.CANCEL) {
|
|
445
|
+
changed.push({
|
|
446
|
+
id: this.tracker.getMappedTouchEventId(event.pointerId),
|
|
447
|
+
x: event.x - rect.left,
|
|
448
|
+
y: event.y - rect.top,
|
|
449
|
+
absoluteX: event.x,
|
|
450
|
+
absoluteY: event.y,
|
|
451
|
+
});
|
|
452
|
+
} else {
|
|
453
|
+
trackerData.forEach((element: TrackerElement, key: number): void => {
|
|
454
|
+
const id: number = this.tracker.getMappedTouchEventId(key);
|
|
455
|
+
|
|
456
|
+
changed.push({
|
|
457
|
+
id: id,
|
|
458
|
+
x: element.lastX - rect.left,
|
|
459
|
+
y: element.lastY - rect.top,
|
|
460
|
+
absoluteX: element.lastX,
|
|
461
|
+
absoluteY: element.lastY,
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
let eventType: TouchEventType = TouchEventType.UNDETERMINED;
|
|
467
|
+
|
|
468
|
+
switch (event.eventType) {
|
|
469
|
+
case EventTypes.DOWN:
|
|
470
|
+
case EventTypes.ADDITIONAL_POINTER_DOWN:
|
|
471
|
+
eventType = TouchEventType.DOWN;
|
|
472
|
+
break;
|
|
473
|
+
case EventTypes.UP:
|
|
474
|
+
case EventTypes.ADDITIONAL_POINTER_UP:
|
|
475
|
+
eventType = TouchEventType.UP;
|
|
476
|
+
break;
|
|
477
|
+
case EventTypes.MOVE:
|
|
478
|
+
eventType = TouchEventType.MOVE;
|
|
479
|
+
break;
|
|
480
|
+
case EventTypes.CANCEL:
|
|
481
|
+
eventType = TouchEventType.CANCELLED;
|
|
482
|
+
break;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Here, when we receive up event, we want to decrease number of touches
|
|
486
|
+
// That's because we want handler to send information that there's one pointer less
|
|
487
|
+
// However, we still want this pointer to be present in allTouches array, so that its data can be accessed
|
|
488
|
+
let numberOfTouches: number = all.length;
|
|
489
|
+
|
|
490
|
+
if (
|
|
491
|
+
event.eventType === EventTypes.UP ||
|
|
492
|
+
event.eventType === EventTypes.ADDITIONAL_POINTER_UP
|
|
493
|
+
) {
|
|
494
|
+
--numberOfTouches;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return {
|
|
498
|
+
nativeEvent: {
|
|
499
|
+
handlerTag: this.handlerTag,
|
|
500
|
+
state: this.currentState,
|
|
501
|
+
eventType: event.touchEventType ?? eventType,
|
|
502
|
+
changedTouches: changed,
|
|
503
|
+
allTouches: all,
|
|
504
|
+
numberOfTouches: numberOfTouches,
|
|
505
|
+
},
|
|
506
|
+
timeStamp: Date.now(),
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
protected transformNativeEvent() {
|
|
341
511
|
return {};
|
|
342
512
|
}
|
|
343
513
|
|
|
@@ -345,9 +515,28 @@ export default abstract class GestureHandler {
|
|
|
345
515
|
// Handling config
|
|
346
516
|
//
|
|
347
517
|
|
|
348
|
-
public updateGestureConfig({ enabled = true, ...props }): void {
|
|
349
|
-
this.config = { enabled, ...props };
|
|
518
|
+
public updateGestureConfig({ enabled = true, ...props }: Config): void {
|
|
519
|
+
this.config = { enabled: enabled, ...props };
|
|
520
|
+
this.enabled = enabled;
|
|
350
521
|
this.validateHitSlops();
|
|
522
|
+
|
|
523
|
+
if (this.enabled) {
|
|
524
|
+
return;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
switch (this.currentState) {
|
|
528
|
+
case State.ACTIVE:
|
|
529
|
+
this.fail(true);
|
|
530
|
+
break;
|
|
531
|
+
case State.UNDETERMINED:
|
|
532
|
+
GestureHandlerOrchestrator.getInstance().removeHandlerFromOrchestrator(
|
|
533
|
+
this
|
|
534
|
+
);
|
|
535
|
+
break;
|
|
536
|
+
default:
|
|
537
|
+
this.cancel(true);
|
|
538
|
+
break;
|
|
539
|
+
}
|
|
351
540
|
}
|
|
352
541
|
|
|
353
542
|
protected checkCustomActivationCriteria(criterias: string[]): void {
|
|
@@ -404,8 +593,8 @@ export default abstract class GestureHandler {
|
|
|
404
593
|
}
|
|
405
594
|
}
|
|
406
595
|
|
|
407
|
-
private checkHitSlop(
|
|
408
|
-
if (!this.config.hitSlop
|
|
596
|
+
private checkHitSlop(): boolean {
|
|
597
|
+
if (!this.config.hitSlop) {
|
|
409
598
|
return true;
|
|
410
599
|
}
|
|
411
600
|
|
|
@@ -458,17 +647,29 @@ export default abstract class GestureHandler {
|
|
|
458
647
|
}
|
|
459
648
|
}
|
|
460
649
|
|
|
650
|
+
const rect: DOMRect = this.view.getBoundingClientRect();
|
|
651
|
+
const offsetX: number = this.tracker.getLastX() - rect.left;
|
|
652
|
+
const offsetY: number = this.tracker.getLastY() - rect.top;
|
|
653
|
+
|
|
461
654
|
if (
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
655
|
+
offsetX >= left &&
|
|
656
|
+
offsetX <= right &&
|
|
657
|
+
offsetY >= top &&
|
|
658
|
+
offsetY <= bottom
|
|
466
659
|
) {
|
|
467
660
|
return true;
|
|
468
661
|
}
|
|
469
662
|
return false;
|
|
470
663
|
}
|
|
471
664
|
|
|
665
|
+
public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {
|
|
666
|
+
const rect: DOMRect = this.view.getBoundingClientRect();
|
|
667
|
+
|
|
668
|
+
return (
|
|
669
|
+
x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom
|
|
670
|
+
);
|
|
671
|
+
}
|
|
672
|
+
|
|
472
673
|
protected resetConfig(): void {}
|
|
473
674
|
|
|
474
675
|
//
|
|
@@ -490,12 +691,12 @@ export default abstract class GestureHandler {
|
|
|
490
691
|
throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');
|
|
491
692
|
}
|
|
492
693
|
|
|
493
|
-
public getView(): HTMLElement
|
|
694
|
+
public getView(): HTMLElement {
|
|
494
695
|
return this.view;
|
|
495
696
|
}
|
|
496
697
|
|
|
497
|
-
public
|
|
498
|
-
return this.
|
|
698
|
+
public getEventManagers(): EventManager[] {
|
|
699
|
+
return this.eventManagers;
|
|
499
700
|
}
|
|
500
701
|
|
|
501
702
|
public getTracker(): PointerTracker {
|
|
@@ -510,20 +711,28 @@ export default abstract class GestureHandler {
|
|
|
510
711
|
return this.currentState;
|
|
511
712
|
}
|
|
512
713
|
|
|
513
|
-
|
|
514
|
-
this.
|
|
714
|
+
public isEnabled(): boolean {
|
|
715
|
+
return this.enabled;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
protected setShouldCancelWhenOutside(shouldCancel: boolean) {
|
|
719
|
+
this.shouldCancellWhenOutside = shouldCancel;
|
|
515
720
|
}
|
|
516
721
|
protected getShouldCancelWhenOutside(): boolean {
|
|
517
722
|
return this.shouldCancellWhenOutside;
|
|
518
723
|
}
|
|
724
|
+
|
|
725
|
+
public getPointerType(): PointerType {
|
|
726
|
+
return this.pointerType;
|
|
727
|
+
}
|
|
519
728
|
}
|
|
520
729
|
|
|
521
730
|
function invokeNullableMethod(
|
|
522
731
|
method:
|
|
523
|
-
| ((event: ResultEvent) => void)
|
|
524
|
-
| { __getHandler: () => (event: ResultEvent) => void }
|
|
732
|
+
| ((event: ResultEvent | ResultTouchEvent) => void)
|
|
733
|
+
| { __getHandler: () => (event: ResultEvent | ResultTouchEvent) => void }
|
|
525
734
|
| { __nodeConfig: { argMapping: unknown[] } },
|
|
526
|
-
event: ResultEvent
|
|
735
|
+
event: ResultEvent | ResultTouchEvent
|
|
527
736
|
): void {
|
|
528
737
|
if (!method) {
|
|
529
738
|
return;
|