react-native-gesture-handler 2.15.0 → 2.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RNGestureHandler.podspec +2 -23
- package/android/build.gradle +1 -1
- package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +2 -0
- package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +9 -0
- package/android/paper/src/main/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +3 -0
- package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +11 -6
- package/android/src/main/java/com/swmansion/gesturehandler/core/DiagonalDirections.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/FlingGestureHandler.kt +65 -24
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +86 -22
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +54 -29
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +3 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +5 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +5 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/TapGestureHandler.kt +7 -3
- package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +66 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +119 -19
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +1 -4
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +8 -5
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +7 -4
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +1 -4
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +4 -7
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/GestureHandlerEventDataBuilder.kt +3 -0
- package/android/src/main/jni/cpp-adapter.cpp +18 -22
- package/apple/Handlers/RNFlingHandler.m +5 -4
- package/apple/Handlers/RNForceTouchHandler.m +3 -1
- package/apple/Handlers/RNHoverHandler.m +2 -1
- package/apple/Handlers/RNLongPressHandler.m +8 -14
- package/apple/Handlers/RNManualHandler.m +1 -0
- package/apple/Handlers/RNNativeViewHandler.mm +9 -7
- package/apple/Handlers/RNPanHandler.m +7 -2
- package/apple/Handlers/RNPinchHandler.m +50 -26
- package/apple/Handlers/RNRotationHandler.m +43 -29
- package/apple/Handlers/RNTapHandler.m +6 -4
- package/apple/RNGestureHandler.h +9 -0
- package/apple/RNGestureHandler.m +41 -4
- package/apple/RNGestureHandlerEvents.h +18 -9
- package/apple/RNGestureHandlerEvents.m +29 -11
- package/apple/RNGestureHandlerManager.h +5 -0
- package/apple/RNGestureHandlerManager.mm +32 -6
- package/apple/RNGestureHandlerModule.h +5 -3
- package/apple/RNGestureHandlerModule.mm +33 -19
- package/apple/RNGestureHandlerPointerType.h +8 -0
- package/lib/commonjs/Directions.js +19 -6
- package/lib/commonjs/Directions.js.map +1 -1
- package/lib/commonjs/PointerType.js +16 -0
- package/lib/commonjs/PointerType.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.web.js +7 -61
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/components/DrawerLayout.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.android.js +17 -2
- package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.js +15 -2
- package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerRootView.web.js +15 -2
- package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -1
- package/lib/commonjs/components/Swipeable.js +3 -1
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/components/touchables/GenericTouchable.js +1 -0
- package/lib/commonjs/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/commonjs/getShadowNodeFromRef.js +19 -2
- package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +5 -0
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/customDirectEventTypes.js +14 -0
- package/lib/commonjs/handlers/customDirectEventTypes.js.map +1 -0
- package/lib/commonjs/handlers/customDirectEventTypes.web.js +11 -0
- package/lib/commonjs/handlers/customDirectEventTypes.web.js.map +1 -0
- package/lib/commonjs/handlers/gestureHandlerCommon.js +13 -2
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +10 -0
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/index.js +11 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/mocks.js +2 -0
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/commonjs/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/commonjs/web/Gestures.js +66 -0
- package/lib/commonjs/web/Gestures.js.map +1 -0
- package/lib/commonjs/web/constants.js +3 -8
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +36 -12
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +10 -5
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/IGestureHandler.js +2 -0
- package/lib/commonjs/web/handlers/IGestureHandler.js.map +1 -0
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +5 -6
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js +1 -23
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +117 -118
- package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +10 -5
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/InteractionManager.js +12 -3
- 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 +77 -27
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/TouchEventManager.js +29 -6
- package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/Vector.js +58 -0
- package/lib/commonjs/web/tools/Vector.js.map +1 -0
- package/lib/commonjs/web/utils.js +14 -0
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
- package/lib/module/Directions.js +16 -4
- package/lib/module/Directions.js.map +1 -1
- package/lib/module/PointerType.js +9 -0
- package/lib/module/PointerType.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.web.js +2 -39
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/components/DrawerLayout.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.android.js +15 -2
- package/lib/module/components/GestureHandlerRootView.android.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.js +15 -3
- package/lib/module/components/GestureHandlerRootView.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.web.js +15 -3
- package/lib/module/components/GestureHandlerRootView.web.js.map +1 -1
- package/lib/module/components/Swipeable.js +3 -1
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/components/touchables/GenericTouchable.js +1 -0
- package/lib/module/components/touchables/GenericTouchable.js.map +1 -1
- package/lib/module/getShadowNodeFromRef.js +19 -2
- package/lib/module/getShadowNodeFromRef.js.map +1 -1
- package/lib/module/handlers/createHandler.js +5 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/customDirectEventTypes.js +3 -0
- package/lib/module/handlers/customDirectEventTypes.js.map +1 -0
- package/lib/module/handlers/customDirectEventTypes.web.js +5 -0
- package/lib/module/handlers/customDirectEventTypes.web.js.map +1 -0
- package/lib/module/handlers/gestureHandlerCommon.js +11 -1
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +10 -0
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/index.js +2 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/mocks.js +2 -0
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/specs/NativeRNGestureHandlerModule.js.map +1 -1
- package/lib/module/specs/RNGestureHandlerButtonNativeComponent.js.map +1 -1
- package/lib/module/web/Gestures.js +39 -0
- package/lib/module/web/Gestures.js.map +1 -0
- package/lib/module/web/constants.js +1 -6
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +34 -12
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +7 -4
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/IGestureHandler.js +2 -0
- package/lib/module/web/handlers/IGestureHandler.js.map +1 -0
- package/lib/module/web/handlers/NativeViewGestureHandler.js +5 -6
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js +0 -20
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerOrchestrator.js +116 -117
- package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +9 -4
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/InteractionManager.js +9 -3
- 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 +75 -27
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/TouchEventManager.js +28 -6
- package/lib/module/web/tools/TouchEventManager.js.map +1 -1
- package/lib/module/web/tools/Vector.js +47 -0
- package/lib/module/web/tools/Vector.js.map +1 -0
- package/lib/module/web/utils.js +4 -0
- package/lib/module/web/utils.js.map +1 -1
- package/lib/module/web_hammer/NodeManager.js.map +1 -1
- package/lib/typescript/Directions.d.ts +7 -0
- package/lib/typescript/PointerType.d.ts +6 -0
- package/lib/typescript/RNGestureHandlerModule.web.d.ts +4 -39
- package/lib/typescript/components/DrawerLayout.d.ts +1 -2
- package/lib/typescript/components/GestureHandlerRootView.android.d.ts +1 -1
- package/lib/typescript/components/GestureHandlerRootView.d.ts +1 -1
- package/lib/typescript/components/GestureHandlerRootView.web.d.ts +1 -1
- package/lib/typescript/components/touchables/GenericTouchable.d.ts +2 -1
- package/lib/typescript/getShadowNodeFromRef.d.ts +1 -1
- package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
- package/lib/typescript/handlers/customDirectEventTypes.d.ts +1 -0
- package/lib/typescript/handlers/customDirectEventTypes.web.d.ts +2 -0
- package/lib/typescript/handlers/gestureHandlerCommon.d.ts +13 -2
- package/lib/typescript/handlers/gestures/GestureDetector.d.ts +2 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +1 -2
- package/lib/typescript/index.d.ts +2 -1
- package/lib/typescript/mocks.d.ts +1 -0
- package/lib/typescript/specs/NativeRNGestureHandlerModule.d.ts +6 -6
- package/lib/typescript/specs/RNGestureHandlerButtonNativeComponent.d.ts +4 -1
- package/lib/typescript/web/Gestures.d.ts +36 -0
- package/lib/typescript/web/constants.d.ts +1 -6
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +3 -3
- package/lib/typescript/web/handlers/GestureHandler.d.ts +12 -9
- package/lib/typescript/web/handlers/IGestureHandler.d.ts +38 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web/interfaces.d.ts +9 -16
- package/lib/typescript/web/tools/EventManager.d.ts +15 -12
- package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +3 -4
- package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +7 -5
- package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +3 -3
- package/lib/typescript/web/tools/InteractionManager.d.ts +6 -6
- package/lib/typescript/web/tools/NodeManager.d.ts +4 -3
- package/lib/typescript/web/tools/PointerEventManager.d.ts +11 -2
- package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -1
- package/lib/typescript/web/tools/Vector.d.ts +15 -0
- package/lib/typescript/web/utils.d.ts +6 -4
- package/lib/typescript/web_hammer/NodeManager.d.ts +1 -1
- package/package.json +2 -1
- package/src/Directions.ts +21 -4
- package/src/PointerType.ts +6 -0
- package/src/RNGestureHandlerModule.web.ts +3 -44
- package/src/components/DrawerLayout.tsx +1 -1
- package/src/components/GestureHandlerRootView.android.tsx +13 -5
- package/src/components/GestureHandlerRootView.tsx +10 -5
- package/src/components/GestureHandlerRootView.web.tsx +10 -5
- package/src/components/Swipeable.tsx +2 -0
- package/src/components/touchables/GenericTouchable.tsx +3 -0
- package/src/getShadowNodeFromRef.ts +28 -6
- package/src/handlers/createHandler.tsx +14 -2
- package/src/handlers/customDirectEventTypes.ts +2 -0
- package/src/handlers/customDirectEventTypes.web.ts +5 -0
- package/src/handlers/gestureHandlerCommon.ts +30 -1
- package/src/handlers/gestures/GestureDetector.tsx +15 -0
- package/src/handlers/gestures/gesture.ts +1 -1
- package/src/index.ts +2 -1
- package/src/mocks.ts +2 -0
- package/src/specs/NativeRNGestureHandlerModule.ts +8 -8
- package/src/specs/RNGestureHandlerButtonNativeComponent.ts +4 -0
- package/src/web/Gestures.ts +41 -0
- package/src/web/constants.ts +1 -7
- package/src/web/handlers/FlingGestureHandler.ts +54 -24
- package/src/web/handlers/GestureHandler.ts +17 -12
- package/src/web/handlers/IGestureHandler.ts +50 -0
- package/src/web/handlers/NativeViewGestureHandler.ts +5 -6
- package/src/web/interfaces.ts +15 -17
- package/src/web/tools/EventManager.ts +16 -14
- package/src/web/tools/GestureHandlerDelegate.ts +3 -4
- package/src/web/tools/GestureHandlerOrchestrator.ts +162 -147
- package/src/web/tools/GestureHandlerWebDelegate.ts +14 -9
- package/src/web/tools/InteractionManager.ts +18 -12
- package/src/web/tools/NodeManager.ts +4 -3
- package/src/web/tools/PointerEventManager.ts +189 -154
- package/src/web/tools/TouchEventManager.ts +128 -120
- package/src/web/tools/Vector.ts +60 -0
- package/src/web/utils.ts +16 -4
- package/src/web_hammer/NodeManager.ts +1 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { PointerType } from '../../PointerType';
|
|
1
2
|
import { State } from '../../State';
|
|
2
|
-
import { PointerType } from '../interfaces';
|
|
3
3
|
|
|
4
|
-
import
|
|
4
|
+
import type IGestureHandler from '../handlers/IGestureHandler';
|
|
5
5
|
import PointerTracker from './PointerTracker';
|
|
6
6
|
|
|
7
7
|
export default class GestureHandlerOrchestrator {
|
|
8
8
|
private static instance: GestureHandlerOrchestrator;
|
|
9
9
|
|
|
10
|
-
private gestureHandlers:
|
|
11
|
-
private awaitingHandlers:
|
|
10
|
+
private gestureHandlers: IGestureHandler[] = [];
|
|
11
|
+
private awaitingHandlers: IGestureHandler[] = [];
|
|
12
|
+
private awaitingHandlersTags: Set<number> = new Set();
|
|
12
13
|
|
|
13
14
|
private handlingChangeSemaphore = 0;
|
|
14
15
|
private activationIndex = 0;
|
|
@@ -23,94 +24,130 @@ export default class GestureHandlerOrchestrator {
|
|
|
23
24
|
}
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
private cleanHandler(handler:
|
|
27
|
+
private cleanHandler(handler: IGestureHandler): void {
|
|
27
28
|
handler.reset();
|
|
28
29
|
handler.setActive(false);
|
|
29
30
|
handler.setAwaiting(false);
|
|
30
31
|
handler.setActivationIndex(Number.MAX_VALUE);
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
public removeHandlerFromOrchestrator(handler:
|
|
34
|
-
this.gestureHandlers.
|
|
35
|
-
this.awaitingHandlers.
|
|
34
|
+
public removeHandlerFromOrchestrator(handler: IGestureHandler): void {
|
|
35
|
+
const indexInGestureHandlers = this.gestureHandlers.indexOf(handler);
|
|
36
|
+
const indexInAwaitingHandlers = this.awaitingHandlers.indexOf(handler);
|
|
37
|
+
|
|
38
|
+
if (indexInGestureHandlers >= 0) {
|
|
39
|
+
this.gestureHandlers.splice(indexInGestureHandlers, 1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (indexInAwaitingHandlers >= 0) {
|
|
43
|
+
this.awaitingHandlers.splice(indexInAwaitingHandlers, 1);
|
|
44
|
+
this.awaitingHandlersTags.delete(handler.getTag());
|
|
45
|
+
}
|
|
36
46
|
}
|
|
37
47
|
|
|
38
48
|
private cleanupFinishedHandlers(): void {
|
|
49
|
+
const handlersToRemove = new Set<IGestureHandler>();
|
|
50
|
+
|
|
39
51
|
for (let i = this.gestureHandlers.length - 1; i >= 0; --i) {
|
|
40
52
|
const handler = this.gestureHandlers[i];
|
|
41
53
|
|
|
42
|
-
if (!handler) {
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
54
|
if (this.isFinished(handler.getState()) && !handler.isAwaiting()) {
|
|
46
|
-
this.gestureHandlers.splice(i, 1);
|
|
47
|
-
|
|
48
55
|
this.cleanHandler(handler);
|
|
56
|
+
handlersToRemove.add(handler);
|
|
49
57
|
}
|
|
50
58
|
}
|
|
59
|
+
|
|
60
|
+
this.gestureHandlers = this.gestureHandlers.filter(
|
|
61
|
+
(handler) => !handlersToRemove.has(handler)
|
|
62
|
+
);
|
|
51
63
|
}
|
|
52
64
|
|
|
53
|
-
private hasOtherHandlerToWaitFor(handler:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (
|
|
57
|
-
otherHandler &&
|
|
65
|
+
private hasOtherHandlerToWaitFor(handler: IGestureHandler): boolean {
|
|
66
|
+
const hasToWaitFor = (otherHandler: IGestureHandler) => {
|
|
67
|
+
return (
|
|
58
68
|
!this.isFinished(otherHandler.getState()) &&
|
|
59
69
|
this.shouldHandlerWaitForOther(handler, otherHandler)
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
70
|
+
);
|
|
71
|
+
};
|
|
65
72
|
|
|
66
|
-
return
|
|
73
|
+
return this.gestureHandlers.some(hasToWaitFor);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private shouldBeCancelledByFinishedHandler(
|
|
77
|
+
handler: IGestureHandler
|
|
78
|
+
): boolean {
|
|
79
|
+
const shouldBeCancelled = (otherHandler: IGestureHandler) => {
|
|
80
|
+
return (
|
|
81
|
+
this.shouldHandlerWaitForOther(handler, otherHandler) &&
|
|
82
|
+
otherHandler.getState() === State.END
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
return this.gestureHandlers.some(shouldBeCancelled);
|
|
67
87
|
}
|
|
68
88
|
|
|
69
|
-
private tryActivate(handler:
|
|
89
|
+
private tryActivate(handler: IGestureHandler): void {
|
|
90
|
+
if (this.shouldBeCancelledByFinishedHandler(handler)) {
|
|
91
|
+
handler.cancel();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
70
95
|
if (this.hasOtherHandlerToWaitFor(handler)) {
|
|
71
96
|
this.addAwaitingHandler(handler);
|
|
72
|
-
|
|
73
|
-
handler.getState() !== State.CANCELLED &&
|
|
74
|
-
handler.getState() !== State.FAILED
|
|
75
|
-
) {
|
|
76
|
-
if (this.shouldActivate(handler)) {
|
|
77
|
-
this.makeActive(handler);
|
|
78
|
-
} else {
|
|
79
|
-
switch (handler.getState()) {
|
|
80
|
-
case State.ACTIVE:
|
|
81
|
-
handler.fail();
|
|
82
|
-
break;
|
|
83
|
-
case State.BEGAN:
|
|
84
|
-
handler.cancel();
|
|
85
|
-
}
|
|
86
|
-
}
|
|
97
|
+
return;
|
|
87
98
|
}
|
|
88
|
-
}
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
100
|
+
const handlerState = handler.getState();
|
|
101
|
+
|
|
102
|
+
if (handlerState === State.CANCELLED || handlerState === State.FAILED) {
|
|
103
|
+
return;
|
|
95
104
|
}
|
|
96
105
|
|
|
97
|
-
|
|
106
|
+
if (this.shouldActivate(handler)) {
|
|
107
|
+
this.makeActive(handler);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (handlerState === State.ACTIVE) {
|
|
112
|
+
handler.fail();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (handlerState === State.BEGAN) {
|
|
117
|
+
handler.cancel();
|
|
118
|
+
}
|
|
98
119
|
}
|
|
99
120
|
|
|
100
|
-
private
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
private shouldActivate(handler: IGestureHandler): boolean {
|
|
122
|
+
const shouldBeCancelledBy = (otherHandler: IGestureHandler) => {
|
|
123
|
+
return this.shouldHandlerBeCancelledBy(handler, otherHandler);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
return !this.gestureHandlers.some(shouldBeCancelledBy);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private cleanupAwaitingHandlers(handler: IGestureHandler): void {
|
|
130
|
+
const shouldWait = (otherHandler: IGestureHandler) => {
|
|
131
|
+
return (
|
|
132
|
+
!otherHandler.isAwaiting() &&
|
|
133
|
+
this.shouldHandlerWaitForOther(otherHandler, handler)
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
for (const otherHandler of this.awaitingHandlers) {
|
|
138
|
+
if (shouldWait(otherHandler)) {
|
|
139
|
+
this.cleanHandler(otherHandler);
|
|
140
|
+
this.awaitingHandlersTags.delete(otherHandler.getTag());
|
|
108
141
|
}
|
|
109
142
|
}
|
|
143
|
+
|
|
144
|
+
this.awaitingHandlers = this.awaitingHandlers.filter((otherHandler) =>
|
|
145
|
+
this.awaitingHandlersTags.has(otherHandler.getTag())
|
|
146
|
+
);
|
|
110
147
|
}
|
|
111
148
|
|
|
112
149
|
public onHandlerStateChange(
|
|
113
|
-
handler:
|
|
150
|
+
handler: IGestureHandler,
|
|
114
151
|
newState: State,
|
|
115
152
|
oldState: State,
|
|
116
153
|
sendIfDisabled?: boolean
|
|
@@ -122,23 +159,31 @@ export default class GestureHandlerOrchestrator {
|
|
|
122
159
|
this.handlingChangeSemaphore += 1;
|
|
123
160
|
|
|
124
161
|
if (this.isFinished(newState)) {
|
|
125
|
-
this.awaitingHandlers
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
162
|
+
for (const otherHandler of this.awaitingHandlers) {
|
|
163
|
+
if (
|
|
164
|
+
!this.shouldHandlerWaitForOther(otherHandler, handler) ||
|
|
165
|
+
!this.awaitingHandlersTags.has(otherHandler.getTag())
|
|
166
|
+
) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (newState !== State.END) {
|
|
171
|
+
this.tryActivate(otherHandler);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
otherHandler.cancel();
|
|
176
|
+
|
|
177
|
+
if (otherHandler.getState() === State.END) {
|
|
178
|
+
// Handle edge case, where discrete gestures end immediately after activation thus
|
|
179
|
+
// their state is set to END and when the gesture they are waiting for activates they
|
|
180
|
+
// should be cancelled, however `cancel` was never sent as gestures were already in the END state.
|
|
181
|
+
// Send synthetic BEGAN -> CANCELLED to properly handle JS logic
|
|
182
|
+
otherHandler.sendEvent(State.CANCELLED, State.BEGAN);
|
|
140
183
|
}
|
|
141
|
-
|
|
184
|
+
|
|
185
|
+
otherHandler.setAwaiting(false);
|
|
186
|
+
}
|
|
142
187
|
}
|
|
143
188
|
|
|
144
189
|
if (newState === State.ACTIVE) {
|
|
@@ -163,12 +208,12 @@ export default class GestureHandlerOrchestrator {
|
|
|
163
208
|
|
|
164
209
|
this.scheduleFinishedHandlersCleanup();
|
|
165
210
|
|
|
166
|
-
if (this.awaitingHandlers.
|
|
211
|
+
if (!this.awaitingHandlers.includes(handler)) {
|
|
167
212
|
this.cleanupAwaitingHandlers(handler);
|
|
168
213
|
}
|
|
169
214
|
}
|
|
170
215
|
|
|
171
|
-
private makeActive(handler:
|
|
216
|
+
private makeActive(handler: IGestureHandler): void {
|
|
172
217
|
const currentState = handler.getState();
|
|
173
218
|
|
|
174
219
|
handler.setActive(true);
|
|
@@ -181,12 +226,11 @@ export default class GestureHandlerOrchestrator {
|
|
|
181
226
|
}
|
|
182
227
|
}
|
|
183
228
|
|
|
184
|
-
this.awaitingHandlers
|
|
229
|
+
for (const otherHandler of this.awaitingHandlers) {
|
|
185
230
|
if (this.shouldHandlerBeCancelledBy(otherHandler, handler)) {
|
|
186
|
-
otherHandler
|
|
187
|
-
otherHandler?.setAwaiting(true);
|
|
231
|
+
otherHandler.setAwaiting(false);
|
|
188
232
|
}
|
|
189
|
-
}
|
|
233
|
+
}
|
|
190
234
|
|
|
191
235
|
handler.sendEvent(State.ACTIVE, State.BEGAN);
|
|
192
236
|
|
|
@@ -197,47 +241,31 @@ export default class GestureHandlerOrchestrator {
|
|
|
197
241
|
}
|
|
198
242
|
}
|
|
199
243
|
|
|
200
|
-
if (handler.isAwaiting()) {
|
|
201
|
-
|
|
202
|
-
for (let i = 0; i < this.awaitingHandlers.length; ++i) {
|
|
203
|
-
if (this.awaitingHandlers[i] === handler) {
|
|
204
|
-
this.awaitingHandlers.splice(i, 1);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
244
|
+
if (!handler.isAwaiting()) {
|
|
245
|
+
return;
|
|
207
246
|
}
|
|
208
|
-
}
|
|
209
247
|
|
|
210
|
-
|
|
211
|
-
let alreadyExists = false;
|
|
248
|
+
handler.setAwaiting(false);
|
|
212
249
|
|
|
213
|
-
this.awaitingHandlers.
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
});
|
|
250
|
+
this.awaitingHandlers = this.awaitingHandlers.filter(
|
|
251
|
+
(otherHandler) => otherHandler !== handler
|
|
252
|
+
);
|
|
253
|
+
}
|
|
219
254
|
|
|
220
|
-
|
|
255
|
+
private addAwaitingHandler(handler: IGestureHandler): void {
|
|
256
|
+
if (this.awaitingHandlers.includes(handler)) {
|
|
221
257
|
return;
|
|
222
258
|
}
|
|
223
259
|
|
|
224
260
|
this.awaitingHandlers.push(handler);
|
|
261
|
+
this.awaitingHandlersTags.add(handler.getTag());
|
|
225
262
|
|
|
226
263
|
handler.setAwaiting(true);
|
|
227
264
|
handler.setActivationIndex(this.activationIndex++);
|
|
228
265
|
}
|
|
229
266
|
|
|
230
|
-
public recordHandlerIfNotPresent(handler:
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
this.gestureHandlers.forEach((otherHandler) => {
|
|
234
|
-
if (otherHandler === handler) {
|
|
235
|
-
alreadyExists = true;
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
if (alreadyExists) {
|
|
267
|
+
public recordHandlerIfNotPresent(handler: IGestureHandler): void {
|
|
268
|
+
if (this.gestureHandlers.includes(handler)) {
|
|
241
269
|
return;
|
|
242
270
|
}
|
|
243
271
|
|
|
@@ -249,8 +277,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
249
277
|
}
|
|
250
278
|
|
|
251
279
|
private shouldHandlerWaitForOther(
|
|
252
|
-
handler:
|
|
253
|
-
otherHandler:
|
|
280
|
+
handler: IGestureHandler,
|
|
281
|
+
otherHandler: IGestureHandler
|
|
254
282
|
): boolean {
|
|
255
283
|
return (
|
|
256
284
|
handler !== otherHandler &&
|
|
@@ -260,8 +288,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
260
288
|
}
|
|
261
289
|
|
|
262
290
|
private canRunSimultaneously(
|
|
263
|
-
gh1:
|
|
264
|
-
gh2:
|
|
291
|
+
gh1: IGestureHandler,
|
|
292
|
+
gh2: IGestureHandler
|
|
265
293
|
): boolean {
|
|
266
294
|
return (
|
|
267
295
|
gh1 === gh2 ||
|
|
@@ -271,17 +299,14 @@ export default class GestureHandlerOrchestrator {
|
|
|
271
299
|
}
|
|
272
300
|
|
|
273
301
|
private shouldHandlerBeCancelledBy(
|
|
274
|
-
handler:
|
|
275
|
-
otherHandler:
|
|
302
|
+
handler: IGestureHandler,
|
|
303
|
+
otherHandler: IGestureHandler
|
|
276
304
|
): boolean {
|
|
277
305
|
if (this.canRunSimultaneously(handler, otherHandler)) {
|
|
278
306
|
return false;
|
|
279
307
|
}
|
|
280
308
|
|
|
281
|
-
if (
|
|
282
|
-
handler !== otherHandler &&
|
|
283
|
-
(handler.isAwaiting() || handler.getState() === State.ACTIVE)
|
|
284
|
-
) {
|
|
309
|
+
if (handler.isAwaiting() || handler.getState() === State.ACTIVE) {
|
|
285
310
|
// For now it always returns false
|
|
286
311
|
return handler.shouldBeCancelledByOther(otherHandler);
|
|
287
312
|
}
|
|
@@ -300,8 +325,8 @@ export default class GestureHandlerOrchestrator {
|
|
|
300
325
|
}
|
|
301
326
|
|
|
302
327
|
private checkOverlap(
|
|
303
|
-
handler:
|
|
304
|
-
otherHandler:
|
|
328
|
+
handler: IGestureHandler,
|
|
329
|
+
otherHandler: IGestureHandler
|
|
305
330
|
): boolean {
|
|
306
331
|
// If handlers don't have common pointers, default return value is false.
|
|
307
332
|
// However, if at least on pointer overlaps with both handlers, we return true
|
|
@@ -309,38 +334,28 @@ export default class GestureHandlerOrchestrator {
|
|
|
309
334
|
|
|
310
335
|
// TODO: Find better way to handle that issue, for example by activation order and handler cancelling
|
|
311
336
|
|
|
312
|
-
const
|
|
313
|
-
const otherPointers: number[] = otherHandler.getTrackedPointersID();
|
|
314
|
-
|
|
315
|
-
let overlap = false;
|
|
316
|
-
|
|
317
|
-
handlerPointers.forEach((pointer: number) => {
|
|
337
|
+
const isPointerWithinBothBounds = (pointer: number) => {
|
|
318
338
|
const handlerX: number = handler.getTracker().getLastX(pointer);
|
|
319
339
|
const handlerY: number = handler.getTracker().getLastY(pointer);
|
|
320
340
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
.isPointerInBounds({ x: handlerX, y: handlerY })
|
|
326
|
-
) {
|
|
327
|
-
overlap = true;
|
|
328
|
-
}
|
|
329
|
-
});
|
|
341
|
+
const point = {
|
|
342
|
+
x: handlerX,
|
|
343
|
+
y: handlerY,
|
|
344
|
+
};
|
|
330
345
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
346
|
+
return (
|
|
347
|
+
handler.getDelegate().isPointerInBounds(point) &&
|
|
348
|
+
otherHandler.getDelegate().isPointerInBounds(point)
|
|
349
|
+
);
|
|
350
|
+
};
|
|
334
351
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
otherHandler.getDelegate().isPointerInBounds({ x: otherX, y: otherY })
|
|
338
|
-
) {
|
|
339
|
-
overlap = true;
|
|
340
|
-
}
|
|
341
|
-
});
|
|
352
|
+
const handlerPointers: number[] = handler.getTrackedPointersID();
|
|
353
|
+
const otherPointers: number[] = otherHandler.getTrackedPointersID();
|
|
342
354
|
|
|
343
|
-
return
|
|
355
|
+
return (
|
|
356
|
+
handlerPointers.some(isPointerWithinBothBounds) ||
|
|
357
|
+
otherPointers.some(isPointerWithinBothBounds)
|
|
358
|
+
);
|
|
344
359
|
}
|
|
345
360
|
|
|
346
361
|
private isFinished(state: State): boolean {
|
|
@@ -355,11 +370,11 @@ export default class GestureHandlerOrchestrator {
|
|
|
355
370
|
// This became a problem because handler was left at active state without any signal to end or fail
|
|
356
371
|
// To handle this, when new touch event is received, we loop through active handlers and check which type of
|
|
357
372
|
// pointer they're using. If there are any handler with mouse/pen as a pointer, we cancel them
|
|
358
|
-
public cancelMouseAndPenGestures(currentHandler:
|
|
359
|
-
this.gestureHandlers.forEach((handler:
|
|
373
|
+
public cancelMouseAndPenGestures(currentHandler: IGestureHandler): void {
|
|
374
|
+
this.gestureHandlers.forEach((handler: IGestureHandler) => {
|
|
360
375
|
if (
|
|
361
376
|
handler.getPointerType() !== PointerType.MOUSE &&
|
|
362
|
-
handler.getPointerType() !== PointerType.
|
|
377
|
+
handler.getPointerType() !== PointerType.STYLUS
|
|
363
378
|
) {
|
|
364
379
|
return;
|
|
365
380
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { findNodeHandle } from 'react-native';
|
|
2
|
-
import type
|
|
2
|
+
import type IGestureHandler from '../handlers/IGestureHandler';
|
|
3
3
|
import {
|
|
4
4
|
GestureHandlerDelegate,
|
|
5
5
|
MeasureResult,
|
|
@@ -9,20 +9,21 @@ import TouchEventManager from './TouchEventManager';
|
|
|
9
9
|
import { State } from '../../State';
|
|
10
10
|
import { isPointerInBounds } from '../utils';
|
|
11
11
|
import EventManager from './EventManager';
|
|
12
|
-
import { Config
|
|
12
|
+
import { Config } from '../interfaces';
|
|
13
|
+
import { MouseButton } from '../../handlers/gestureHandlerCommon';
|
|
13
14
|
|
|
14
15
|
export class GestureHandlerWebDelegate
|
|
15
|
-
implements GestureHandlerDelegate<HTMLElement>
|
|
16
|
+
implements GestureHandlerDelegate<HTMLElement, IGestureHandler>
|
|
16
17
|
{
|
|
17
18
|
private view!: HTMLElement;
|
|
18
|
-
private gestureHandler!:
|
|
19
|
+
private gestureHandler!: IGestureHandler;
|
|
19
20
|
private eventManagers: EventManager<unknown>[] = [];
|
|
20
21
|
|
|
21
22
|
getView(): HTMLElement {
|
|
22
23
|
return this.view;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
init(viewRef: number, handler:
|
|
26
|
+
init(viewRef: number, handler: IGestureHandler): void {
|
|
26
27
|
if (!viewRef) {
|
|
27
28
|
throw new Error(
|
|
28
29
|
`Cannot find HTML Element for handler ${handler.getTag()}`
|
|
@@ -32,10 +33,6 @@ export class GestureHandlerWebDelegate
|
|
|
32
33
|
this.gestureHandler = handler;
|
|
33
34
|
this.view = findNodeHandle(viewRef) as unknown as HTMLElement;
|
|
34
35
|
|
|
35
|
-
this.view.style['touchAction'] = 'none';
|
|
36
|
-
//@ts-ignore This one disables default events on Safari
|
|
37
|
-
this.view.style['WebkitTouchCallout'] = 'none';
|
|
38
|
-
|
|
39
36
|
const config = handler.getConfig();
|
|
40
37
|
|
|
41
38
|
this.addContextMenuListeners(config);
|
|
@@ -48,6 +45,10 @@ export class GestureHandlerWebDelegate
|
|
|
48
45
|
this.view.style['userSelect'] = config.userSelect;
|
|
49
46
|
}
|
|
50
47
|
|
|
48
|
+
this.view.style['touchAction'] = config.touchAction ?? 'none';
|
|
49
|
+
//@ts-ignore This one disables default events on Safari
|
|
50
|
+
this.view.style['WebkitTouchCallout'] = 'none';
|
|
51
|
+
|
|
51
52
|
this.eventManagers.push(new PointerEventManager(this.view));
|
|
52
53
|
this.eventManagers.push(new TouchEventManager(this.view));
|
|
53
54
|
|
|
@@ -150,5 +151,9 @@ export class GestureHandlerWebDelegate
|
|
|
150
151
|
|
|
151
152
|
public destroy(config: Config): void {
|
|
152
153
|
this.removeContextMenuListeners(config);
|
|
154
|
+
|
|
155
|
+
this.eventManagers.forEach((manager) => {
|
|
156
|
+
manager.unregisterListeners();
|
|
157
|
+
});
|
|
153
158
|
}
|
|
154
159
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type IGestureHandler from '../handlers/IGestureHandler';
|
|
2
|
+
import { State } from '../../State';
|
|
2
3
|
import { Config, Handler } from '../interfaces';
|
|
3
4
|
|
|
4
5
|
export default class InteractionManager {
|
|
@@ -11,7 +12,7 @@ export default class InteractionManager {
|
|
|
11
12
|
// eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
|
|
12
13
|
private constructor() {}
|
|
13
14
|
|
|
14
|
-
public configureInteractions(handler:
|
|
15
|
+
public configureInteractions(handler: IGestureHandler, config: Config) {
|
|
15
16
|
this.dropRelationsForHandlerWithTag(handler.getTag());
|
|
16
17
|
|
|
17
18
|
if (config.waitFor) {
|
|
@@ -57,8 +58,8 @@ export default class InteractionManager {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
public shouldWaitForHandlerFailure(
|
|
60
|
-
handler:
|
|
61
|
-
otherHandler:
|
|
61
|
+
handler: IGestureHandler,
|
|
62
|
+
otherHandler: IGestureHandler
|
|
62
63
|
): boolean {
|
|
63
64
|
const waitFor: number[] | undefined = this.waitForRelations.get(
|
|
64
65
|
handler.getTag()
|
|
@@ -72,8 +73,8 @@ export default class InteractionManager {
|
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
public shouldRecognizeSimultaneously(
|
|
75
|
-
handler:
|
|
76
|
-
otherHandler:
|
|
76
|
+
handler: IGestureHandler,
|
|
77
|
+
otherHandler: IGestureHandler
|
|
77
78
|
): boolean {
|
|
78
79
|
const simultaneousHandlers: number[] | undefined =
|
|
79
80
|
this.simultaneousRelations.get(handler.getTag());
|
|
@@ -86,8 +87,8 @@ export default class InteractionManager {
|
|
|
86
87
|
}
|
|
87
88
|
|
|
88
89
|
public shouldRequireHandlerToWaitForFailure(
|
|
89
|
-
handler:
|
|
90
|
-
otherHandler:
|
|
90
|
+
handler: IGestureHandler,
|
|
91
|
+
otherHandler: IGestureHandler
|
|
91
92
|
): boolean {
|
|
92
93
|
const waitFor: number[] | undefined = this.blocksHandlersRelations.get(
|
|
93
94
|
handler.getTag()
|
|
@@ -101,11 +102,16 @@ export default class InteractionManager {
|
|
|
101
102
|
}
|
|
102
103
|
|
|
103
104
|
public shouldHandlerBeCancelledBy(
|
|
104
|
-
_handler:
|
|
105
|
-
|
|
105
|
+
_handler: IGestureHandler,
|
|
106
|
+
otherHandler: IGestureHandler
|
|
106
107
|
): boolean {
|
|
107
|
-
//
|
|
108
|
-
|
|
108
|
+
// We check constructor name instead of using `instanceof` in order do avoid circular dependencies
|
|
109
|
+
const isNativeHandler =
|
|
110
|
+
otherHandler.constructor.name === 'NativeViewGestureHandler';
|
|
111
|
+
const isActive = otherHandler.getState() === State.ACTIVE;
|
|
112
|
+
const isButton = otherHandler.isButton?.() === true;
|
|
113
|
+
|
|
114
|
+
return isNativeHandler && isActive && !isButton;
|
|
109
115
|
}
|
|
110
116
|
|
|
111
117
|
public dropRelationsForHandlerWithTag(handlerTag: number): void {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ValueOf } from '../../typeUtils';
|
|
2
|
-
import { Gestures } from '
|
|
2
|
+
import { Gestures } from '../Gestures';
|
|
3
|
+
import type IGestureHandler from '../handlers/IGestureHandler';
|
|
3
4
|
|
|
4
5
|
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
|
|
5
6
|
export default abstract class NodeManager {
|
|
@@ -8,9 +9,9 @@ export default abstract class NodeManager {
|
|
|
8
9
|
InstanceType<ValueOf<typeof Gestures>>
|
|
9
10
|
> = {};
|
|
10
11
|
|
|
11
|
-
public static getHandler(tag: number) {
|
|
12
|
+
public static getHandler(tag: number): IGestureHandler {
|
|
12
13
|
if (tag in this.gestures) {
|
|
13
|
-
return this.gestures[tag];
|
|
14
|
+
return this.gestures[tag] as IGestureHandler;
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
throw new Error(`No handler for tag ${tag}`);
|