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
|
@@ -8,6 +8,8 @@ exports.default = void 0;
|
|
|
8
8
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
9
|
|
|
10
10
|
class InteractionManager {
|
|
11
|
+
// Private becaues of singleton
|
|
12
|
+
// eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
|
|
11
13
|
constructor() {
|
|
12
14
|
_defineProperty(this, "waitForRelations", new Map());
|
|
13
15
|
|
|
@@ -19,11 +21,13 @@ class InteractionManager {
|
|
|
19
21
|
|
|
20
22
|
if (config.waitFor) {
|
|
21
23
|
const waitFor = [];
|
|
22
|
-
config.waitFor.forEach(
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
config.waitFor.forEach(otherHandler => {
|
|
25
|
+
// New API reference
|
|
26
|
+
if (typeof otherHandler === 'number') {
|
|
27
|
+
waitFor.push(otherHandler);
|
|
25
28
|
} else {
|
|
26
|
-
|
|
29
|
+
// Old API reference
|
|
30
|
+
waitFor.push(otherHandler.handlerTag);
|
|
27
31
|
}
|
|
28
32
|
});
|
|
29
33
|
this.waitForRelations.set(handler.getTag(), waitFor);
|
|
@@ -31,17 +35,15 @@ class InteractionManager {
|
|
|
31
35
|
|
|
32
36
|
if (config.simultaneousHandlers) {
|
|
33
37
|
const simultaneousHandlers = [];
|
|
34
|
-
config.simultaneousHandlers.forEach(
|
|
35
|
-
if (typeof
|
|
36
|
-
simultaneousHandlers.push(
|
|
38
|
+
config.simultaneousHandlers.forEach(otherHandler => {
|
|
39
|
+
if (typeof otherHandler === 'number') {
|
|
40
|
+
simultaneousHandlers.push(otherHandler);
|
|
37
41
|
} else {
|
|
38
|
-
simultaneousHandlers.push(
|
|
42
|
+
simultaneousHandlers.push(otherHandler.handlerTag);
|
|
39
43
|
}
|
|
40
44
|
});
|
|
41
45
|
this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);
|
|
42
46
|
}
|
|
43
|
-
|
|
44
|
-
handler.setInteractionManager(this);
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
shouldWaitForHandlerFailure(handler, otherHandler) {
|
|
@@ -79,10 +81,12 @@ class InteractionManager {
|
|
|
79
81
|
}
|
|
80
82
|
|
|
81
83
|
shouldRequireHandlerToWaitForFailure(_handler, _otherHandler) {
|
|
84
|
+
//TODO: Implement logic
|
|
82
85
|
return false;
|
|
83
86
|
}
|
|
84
87
|
|
|
85
88
|
shouldHandlerBeCancelledBy(_handler, _otherHandler) {
|
|
89
|
+
//TODO: Implement logic
|
|
86
90
|
return false;
|
|
87
91
|
}
|
|
88
92
|
|
|
@@ -96,7 +100,17 @@ class InteractionManager {
|
|
|
96
100
|
this.simultaneousRelations.clear();
|
|
97
101
|
}
|
|
98
102
|
|
|
103
|
+
static getInstance() {
|
|
104
|
+
if (!this.instance) {
|
|
105
|
+
this.instance = new InteractionManager();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return this.instance;
|
|
109
|
+
}
|
|
110
|
+
|
|
99
111
|
}
|
|
100
112
|
|
|
101
113
|
exports.default = InteractionManager;
|
|
114
|
+
|
|
115
|
+
_defineProperty(InteractionManager, "instance", void 0);
|
|
102
116
|
//# sourceMappingURL=InteractionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["InteractionManager.ts"],"names":["InteractionManager","Map","configureInteractions","handler","config","dropRelationsForHandlerWithTag","getTag","waitFor","forEach","push","handlerTag","waitForRelations","set","simultaneousHandlers","simultaneousRelations","
|
|
1
|
+
{"version":3,"sources":["InteractionManager.ts"],"names":["InteractionManager","constructor","Map","configureInteractions","handler","config","dropRelationsForHandlerWithTag","getTag","waitFor","forEach","otherHandler","push","handlerTag","waitForRelations","set","simultaneousHandlers","simultaneousRelations","shouldWaitForHandlerFailure","get","shouldWait","tag","shouldRecognizeSimultaneously","shouldRequireHandlerToWaitForFailure","_handler","_otherHandler","shouldHandlerBeCancelledBy","delete","reset","clear","getInstance","instance"],"mappings":"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","sourcesContent":["import GestureHandler from '../handlers/GestureHandler';\nimport { Config, Handler } from '../interfaces';\n\nexport default class InteractionManager {\n private static instance: InteractionManager;\n private readonly waitForRelations: Map<number, number[]> = new Map();\n private readonly simultaneousRelations: Map<number, number[]> = new Map();\n\n // Private becaues of singleton\n // eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function\n private constructor() {}\n\n public configureInteractions(handler: GestureHandler, config: Config) {\n this.dropRelationsForHandlerWithTag(handler.getTag());\n\n if (config.waitFor) {\n const waitFor: number[] = [];\n config.waitFor.forEach((otherHandler: Handler): void => {\n // New API reference\n if (typeof otherHandler === 'number') {\n waitFor.push(otherHandler);\n } else {\n // Old API reference\n waitFor.push(otherHandler.handlerTag);\n }\n });\n\n this.waitForRelations.set(handler.getTag(), waitFor);\n }\n\n if (config.simultaneousHandlers) {\n const simultaneousHandlers: number[] = [];\n config.simultaneousHandlers.forEach((otherHandler: Handler): void => {\n if (typeof otherHandler === 'number') {\n simultaneousHandlers.push(otherHandler);\n } else {\n simultaneousHandlers.push(otherHandler.handlerTag);\n }\n });\n\n this.simultaneousRelations.set(handler.getTag(), simultaneousHandlers);\n }\n }\n\n public shouldWaitForHandlerFailure(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n const waitFor: number[] | undefined = this.waitForRelations.get(\n handler.getTag()\n );\n if (!waitFor) {\n return false;\n }\n\n let shouldWait = false;\n\n waitFor.forEach((tag: number): void => {\n if (tag === otherHandler.getTag()) {\n shouldWait = true;\n return; //Returns from callback\n }\n });\n\n return shouldWait;\n }\n\n public shouldRecognizeSimultaneously(\n handler: GestureHandler,\n otherHandler: GestureHandler\n ): boolean {\n const simultaneousHandlers:\n | number[]\n | undefined = this.simultaneousRelations.get(handler.getTag());\n if (!simultaneousHandlers) {\n return false;\n }\n\n let shouldRecognizeSimultaneously = false;\n\n simultaneousHandlers.forEach((tag: number): void => {\n if (tag === otherHandler.getTag()) {\n shouldRecognizeSimultaneously = true;\n return;\n }\n });\n\n return shouldRecognizeSimultaneously;\n }\n\n public shouldRequireHandlerToWaitForFailure(\n _handler: GestureHandler,\n _otherHandler: GestureHandler\n ): boolean {\n //TODO: Implement logic\n return false;\n }\n\n public shouldHandlerBeCancelledBy(\n _handler: GestureHandler,\n _otherHandler: GestureHandler\n ): boolean {\n //TODO: Implement logic\n return false;\n }\n\n public dropRelationsForHandlerWithTag(handlerTag: number): void {\n this.waitForRelations.delete(handlerTag);\n this.simultaneousRelations.delete(handlerTag);\n }\n\n public reset() {\n this.waitForRelations.clear();\n this.simultaneousRelations.clear();\n }\n\n public static getInstance(): InteractionManager {\n if (!this.instance) {\n this.instance = new InteractionManager();\n }\n\n return this.instance;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["NodeManager.ts"],"names":["NodeManager","getHandler","tag","gestures","Error","createGestureHandler","handlerTag","handler","setTag","dropGestureHandler","getNodes"],"mappings":";;;;;;;;;AAGA;AACe,
|
|
1
|
+
{"version":3,"sources":["NodeManager.ts"],"names":["NodeManager","getHandler","tag","gestures","Error","createGestureHandler","handlerTag","handler","setTag","dropGestureHandler","getNodes"],"mappings":";;;;;;;;;AAGA;AACe,MAAeA,WAAf,CAA2B;AAMhB,SAAVC,UAAU,CAACC,GAAD,EAAc;AACpC,QAAIA,GAAG,IAAI,KAAKC,QAAhB,EAA0B;AACxB,aAAO,KAAKA,QAAL,CAAcD,GAAd,CAAP;AACD;;AAED,UAAM,IAAIE,KAAJ,CAAW,sBAAqBF,GAAI,EAApC,CAAN;AACD;;AAEiC,SAApBG,oBAAoB,CAChCC,UADgC,EAEhCC,OAFgC,EAG1B;AACN,QAAID,UAAU,IAAI,KAAKH,QAAvB,EAAiC;AAC/B,YAAM,IAAIC,KAAJ,CAAW,oBAAmBE,UAAW,iBAAzC,CAAN;AACD;;AAED,SAAKH,QAAL,CAAcG,UAAd,IAA4BC,OAA5B;AACA,SAAKJ,QAAL,CAAcG,UAAd,EAA0BE,MAA1B,CAAiCF,UAAjC;AACD;;AAE+B,SAAlBG,kBAAkB,CAACH,UAAD,EAA2B;AACzD,QAAI,EAAEA,UAAU,IAAI,KAAKH,QAArB,CAAJ,EAAoC;AAClC;AACD,KAHwD,CAKzD;;;AACA,WAAO,KAAKA,QAAL,CAAcG,UAAd,CAAP;AACD;;AAEqB,SAARI,QAAQ,GAAG;AACvB,WAAO,EAAE,GAAG,KAAKP;AAAV,KAAP;AACD;;AArCuC;;;;gBAAZH,W,cAIxB,E","sourcesContent":["import { ValueOf } from '../../typeUtils';\nimport { Gestures } from '../../RNGestureHandlerModule.web';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport default abstract class NodeManager {\n private static gestures: Record<\n number,\n InstanceType<ValueOf<typeof Gestures>>\n > = {};\n\n public static getHandler(tag: number) {\n if (tag in this.gestures) {\n return this.gestures[tag];\n }\n\n throw new Error(`No handler for tag ${tag}`);\n }\n\n public static createGestureHandler(\n handlerTag: number,\n handler: InstanceType<ValueOf<typeof Gestures>>\n ): void {\n if (handlerTag in this.gestures) {\n throw new Error(`Handler with tag ${handlerTag} already exists`);\n }\n\n this.gestures[handlerTag] = handler;\n this.gestures[handlerTag].setTag(handlerTag);\n }\n\n public static dropGestureHandler(handlerTag: number): void {\n if (!(handlerTag in this.gestures)) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.gestures[handlerTag];\n }\n\n public static getNodes() {\n return { ...this.gestures };\n }\n}\n"]}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _interfaces = require("../interfaces");
|
|
9
|
+
|
|
10
|
+
var _EventManager = _interopRequireDefault(require("./EventManager"));
|
|
11
|
+
|
|
12
|
+
var _utils = require("../utils");
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
class PointerEventManager extends _EventManager.default {
|
|
17
|
+
setListeners() {
|
|
18
|
+
this.view.addEventListener('pointerdown', event => {
|
|
19
|
+
if (event.pointerType === _interfaces.PointerType.TOUCH) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (!(0, _utils.isPointerInBounds)(this.view, {
|
|
24
|
+
x: event.clientX,
|
|
25
|
+
y: event.clientY
|
|
26
|
+
})) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.DOWN);
|
|
31
|
+
const target = event.target;
|
|
32
|
+
target.setPointerCapture(adaptedEvent.pointerId);
|
|
33
|
+
this.markAsInBounds(adaptedEvent.pointerId);
|
|
34
|
+
|
|
35
|
+
if (++this.activePointersCounter > 1) {
|
|
36
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_DOWN;
|
|
37
|
+
this.onPointerAdd(adaptedEvent);
|
|
38
|
+
} else {
|
|
39
|
+
this.onPointerDown(adaptedEvent);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
this.view.addEventListener('pointerup', event => {
|
|
43
|
+
if (event.pointerType === _interfaces.PointerType.TOUCH) {
|
|
44
|
+
return;
|
|
45
|
+
} // When we call reset on gesture handlers, it also resets their event managers
|
|
46
|
+
// In some handlers (like RotationGestureHandler) reset is called before all pointers leave view
|
|
47
|
+
// This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view
|
|
48
|
+
// Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
if (this.activePointersCounter === 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.UP);
|
|
56
|
+
const target = event.target;
|
|
57
|
+
target.releasePointerCapture(adaptedEvent.pointerId);
|
|
58
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
59
|
+
|
|
60
|
+
if (--this.activePointersCounter > 0) {
|
|
61
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_UP;
|
|
62
|
+
this.onPointerRemove(adaptedEvent);
|
|
63
|
+
} else {
|
|
64
|
+
this.onPointerUp(adaptedEvent);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
this.view.addEventListener('pointermove', event => {
|
|
68
|
+
if (event.pointerType === _interfaces.PointerType.TOUCH) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (event.pointerType === _interfaces.PointerType.MOUSE && event.buttons !== _interfaces.MouseButtons.LEFT) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.MOVE);
|
|
77
|
+
const inBounds = (0, _utils.isPointerInBounds)(this.view, {
|
|
78
|
+
x: adaptedEvent.x,
|
|
79
|
+
y: adaptedEvent.y
|
|
80
|
+
});
|
|
81
|
+
const pointerIndex = this.pointersInBounds.indexOf(adaptedEvent.pointerId);
|
|
82
|
+
|
|
83
|
+
if (inBounds) {
|
|
84
|
+
if (pointerIndex < 0) {
|
|
85
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ENTER;
|
|
86
|
+
this.onPointerEnter(adaptedEvent);
|
|
87
|
+
this.markAsInBounds(adaptedEvent.pointerId);
|
|
88
|
+
} else {
|
|
89
|
+
this.onPointerMove(adaptedEvent);
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
if (pointerIndex >= 0) {
|
|
93
|
+
adaptedEvent.eventType = _interfaces.EventTypes.OUT;
|
|
94
|
+
this.onPointerOut(adaptedEvent);
|
|
95
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
96
|
+
} else {
|
|
97
|
+
this.onPointerOutOfBounds(adaptedEvent);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
this.view.addEventListener('pointercancel', event => {
|
|
102
|
+
if (event.pointerType === _interfaces.PointerType.TOUCH) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.CANCEL);
|
|
107
|
+
this.onPointerCancel(adaptedEvent);
|
|
108
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
109
|
+
this.activePointersCounter = 0;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
mapEvent(event, eventType) {
|
|
114
|
+
return {
|
|
115
|
+
x: event.clientX,
|
|
116
|
+
y: event.clientY,
|
|
117
|
+
offsetX: event.offsetX,
|
|
118
|
+
offsetY: event.offsetY,
|
|
119
|
+
pointerId: event.pointerId,
|
|
120
|
+
eventType: eventType,
|
|
121
|
+
pointerType: event.pointerType,
|
|
122
|
+
buttons: event.buttons,
|
|
123
|
+
time: event.timeStamp
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
exports.default = PointerEventManager;
|
|
130
|
+
//# sourceMappingURL=PointerEventManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["PointerEventManager.ts"],"names":["PointerEventManager","EventManager","setListeners","view","addEventListener","event","pointerType","PointerType","TOUCH","x","clientX","y","clientY","adaptedEvent","mapEvent","EventTypes","DOWN","target","setPointerCapture","pointerId","markAsInBounds","activePointersCounter","eventType","ADDITIONAL_POINTER_DOWN","onPointerAdd","onPointerDown","UP","releasePointerCapture","markAsOutOfBounds","ADDITIONAL_POINTER_UP","onPointerRemove","onPointerUp","MOUSE","buttons","MouseButtons","LEFT","MOVE","inBounds","pointerIndex","pointersInBounds","indexOf","ENTER","onPointerEnter","onPointerMove","OUT","onPointerOut","onPointerOutOfBounds","CANCEL","onPointerCancel","offsetX","offsetY","time","timeStamp"],"mappings":"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","sourcesContent":["import {\n AdaptedEvent,\n EventTypes,\n MouseButtons,\n PointerType,\n} from '../interfaces';\nimport EventManager from './EventManager';\nimport { isPointerInBounds } from '../utils';\n\nexport default class PointerEventManager extends EventManager {\n public setListeners(): void {\n this.view.addEventListener('pointerdown', (event: PointerEvent): void => {\n if (event.pointerType === PointerType.TOUCH) {\n return;\n }\n if (\n !isPointerInBounds(this.view, { x: event.clientX, y: event.clientY })\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.DOWN);\n const target = event.target as HTMLElement;\n\n target.setPointerCapture(adaptedEvent.pointerId);\n this.markAsInBounds(adaptedEvent.pointerId);\n\n if (++this.activePointersCounter > 1) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;\n this.onPointerAdd(adaptedEvent);\n } else {\n this.onPointerDown(adaptedEvent);\n }\n });\n\n this.view.addEventListener('pointerup', (event: PointerEvent): void => {\n if (event.pointerType === PointerType.TOUCH) {\n return;\n }\n\n // When we call reset on gesture handlers, it also resets their event managers\n // In some handlers (like RotationGestureHandler) reset is called before all pointers leave view\n // This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view\n // Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly\n if (this.activePointersCounter === 0) {\n return;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.UP);\n const target = event.target as HTMLElement;\n\n target.releasePointerCapture(adaptedEvent.pointerId);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n\n if (--this.activePointersCounter > 0) {\n adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;\n this.onPointerRemove(adaptedEvent);\n } else {\n this.onPointerUp(adaptedEvent);\n }\n });\n\n this.view.addEventListener('pointermove', (event: PointerEvent): void => {\n if (event.pointerType === PointerType.TOUCH) {\n return;\n }\n\n if (\n event.pointerType === PointerType.MOUSE &&\n event.buttons !== MouseButtons.LEFT\n ) {\n return;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(event, EventTypes.MOVE);\n\n const inBounds: boolean = isPointerInBounds(this.view, {\n x: adaptedEvent.x,\n y: adaptedEvent.y,\n });\n\n const pointerIndex: number = this.pointersInBounds.indexOf(\n adaptedEvent.pointerId\n );\n\n if (inBounds) {\n if (pointerIndex < 0) {\n adaptedEvent.eventType = EventTypes.ENTER;\n this.onPointerEnter(adaptedEvent);\n this.markAsInBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerMove(adaptedEvent);\n }\n } else {\n if (pointerIndex >= 0) {\n adaptedEvent.eventType = EventTypes.OUT;\n this.onPointerOut(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n } else {\n this.onPointerOutOfBounds(adaptedEvent);\n }\n }\n });\n\n this.view.addEventListener('pointercancel', (event: PointerEvent): void => {\n if (event.pointerType === PointerType.TOUCH) {\n return;\n }\n\n const adaptedEvent: AdaptedEvent = this.mapEvent(\n event,\n EventTypes.CANCEL\n );\n\n this.onPointerCancel(adaptedEvent);\n this.markAsOutOfBounds(adaptedEvent.pointerId);\n this.activePointersCounter = 0;\n });\n }\n\n protected mapEvent(event: PointerEvent, eventType: EventTypes): AdaptedEvent {\n return {\n x: event.clientX,\n y: event.clientY,\n offsetX: event.offsetX,\n offsetY: event.offsetY,\n pointerId: event.pointerId,\n eventType: eventType,\n pointerType: event.pointerType as PointerType,\n buttons: event.buttons,\n time: event.timeStamp,\n };\n }\n}\n"]}
|
|
@@ -7,11 +7,28 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
9
9
|
|
|
10
|
+
// Used to scale velocity so that it is similar to velocity in Android/iOS
|
|
10
11
|
const VELOCITY_FACTOR = 0.2;
|
|
12
|
+
const MAX_POINTERS = 20;
|
|
11
13
|
|
|
12
14
|
class PointerTracker {
|
|
13
15
|
constructor() {
|
|
14
16
|
_defineProperty(this, "trackedPointers", new Map());
|
|
17
|
+
|
|
18
|
+
_defineProperty(this, "touchEventsIds", new Map());
|
|
19
|
+
|
|
20
|
+
_defineProperty(this, "lastMovedPointerId", void 0);
|
|
21
|
+
|
|
22
|
+
_defineProperty(this, "cachedAverages", {
|
|
23
|
+
x: 0,
|
|
24
|
+
y: 0
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
this.lastMovedPointerId = NaN;
|
|
28
|
+
|
|
29
|
+
for (let i = 0; i < MAX_POINTERS; ++i) {
|
|
30
|
+
this.touchEventsIds.set(i, NaN);
|
|
31
|
+
}
|
|
15
32
|
}
|
|
16
33
|
|
|
17
34
|
addToTracker(event) {
|
|
@@ -19,6 +36,7 @@ class PointerTracker {
|
|
|
19
36
|
return;
|
|
20
37
|
}
|
|
21
38
|
|
|
39
|
+
this.lastMovedPointerId = event.pointerId;
|
|
22
40
|
const newElement = {
|
|
23
41
|
lastX: event.x,
|
|
24
42
|
lastY: event.y,
|
|
@@ -27,10 +45,16 @@ class PointerTracker {
|
|
|
27
45
|
velocityY: 0
|
|
28
46
|
};
|
|
29
47
|
this.trackedPointers.set(event.pointerId, newElement);
|
|
48
|
+
this.mapTouchEventId(event.pointerId);
|
|
49
|
+
this.cachedAverages = {
|
|
50
|
+
x: this.getLastAvgX(),
|
|
51
|
+
y: this.getLastAvgY()
|
|
52
|
+
};
|
|
30
53
|
}
|
|
31
54
|
|
|
32
55
|
removeFromTracker(pointerId) {
|
|
33
56
|
this.trackedPointers.delete(pointerId);
|
|
57
|
+
this.removeMappedTouchId(pointerId);
|
|
34
58
|
}
|
|
35
59
|
|
|
36
60
|
track(event) {
|
|
@@ -40,6 +64,7 @@ class PointerTracker {
|
|
|
40
64
|
return;
|
|
41
65
|
}
|
|
42
66
|
|
|
67
|
+
this.lastMovedPointerId = event.pointerId;
|
|
43
68
|
const dx = event.x - element.lastX;
|
|
44
69
|
const dy = event.y - element.lastY;
|
|
45
70
|
const dt = event.time - element.timeStamp;
|
|
@@ -48,6 +73,40 @@ class PointerTracker {
|
|
|
48
73
|
element.lastX = event.x;
|
|
49
74
|
element.lastY = event.y;
|
|
50
75
|
this.trackedPointers.set(event.pointerId, element);
|
|
76
|
+
const avgX = this.getLastAvgX();
|
|
77
|
+
const avgY = this.getLastAvgY();
|
|
78
|
+
this.cachedAverages = {
|
|
79
|
+
x: avgX,
|
|
80
|
+
y: avgY
|
|
81
|
+
};
|
|
82
|
+
} //Mapping TouchEvents ID
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
mapTouchEventId(id) {
|
|
86
|
+
for (const [mappedId, touchId] of this.touchEventsIds) {
|
|
87
|
+
if (isNaN(touchId)) {
|
|
88
|
+
this.touchEventsIds.set(mappedId, id);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
removeMappedTouchId(id) {
|
|
95
|
+
const mappedId = this.getMappedTouchEventId(id);
|
|
96
|
+
|
|
97
|
+
if (!isNaN(mappedId)) {
|
|
98
|
+
this.touchEventsIds.set(mappedId, NaN);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getMappedTouchEventId(touchEventId) {
|
|
103
|
+
for (const [key, value] of this.touchEventsIds.entries()) {
|
|
104
|
+
if (value === touchEventId) {
|
|
105
|
+
return key;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return NaN;
|
|
51
110
|
}
|
|
52
111
|
|
|
53
112
|
getVelocityX(pointerId) {
|
|
@@ -61,25 +120,51 @@ class PointerTracker {
|
|
|
61
120
|
|
|
62
121
|
return (_this$trackedPointers2 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers2 === void 0 ? void 0 : _this$trackedPointers2.velocityY;
|
|
63
122
|
}
|
|
123
|
+
/**
|
|
124
|
+
* Returns X coordinate of last moved pointer
|
|
125
|
+
*/
|
|
126
|
+
|
|
64
127
|
|
|
65
128
|
getLastX(pointerId) {
|
|
66
|
-
|
|
129
|
+
if (pointerId) {
|
|
130
|
+
var _this$trackedPointers3;
|
|
131
|
+
|
|
132
|
+
return (_this$trackedPointers3 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers3 === void 0 ? void 0 : _this$trackedPointers3.lastX;
|
|
133
|
+
} else {
|
|
134
|
+
var _this$trackedPointers4;
|
|
67
135
|
|
|
68
|
-
|
|
136
|
+
return (_this$trackedPointers4 = this.trackedPointers.get(this.lastMovedPointerId)) === null || _this$trackedPointers4 === void 0 ? void 0 : _this$trackedPointers4.lastX;
|
|
137
|
+
}
|
|
69
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns Y coordinate of last moved pointer
|
|
141
|
+
*/
|
|
142
|
+
|
|
70
143
|
|
|
71
144
|
getLastY(pointerId) {
|
|
72
|
-
|
|
145
|
+
if (pointerId) {
|
|
146
|
+
var _this$trackedPointers5;
|
|
147
|
+
|
|
148
|
+
return (_this$trackedPointers5 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers5 === void 0 ? void 0 : _this$trackedPointers5.lastY;
|
|
149
|
+
} else {
|
|
150
|
+
var _this$trackedPointers6;
|
|
151
|
+
|
|
152
|
+
return (_this$trackedPointers6 = this.trackedPointers.get(this.lastMovedPointerId)) === null || _this$trackedPointers6 === void 0 ? void 0 : _this$trackedPointers6.lastY;
|
|
153
|
+
}
|
|
154
|
+
} // Some handlers use these methods to send average values in native event.
|
|
155
|
+
// This may happen when pointers have already been removed from tracker (i.e. pointerup event).
|
|
156
|
+
// In situation when NaN would be sent as a response, we return cached value.
|
|
157
|
+
// That prevents handlers from crashing
|
|
73
158
|
|
|
74
|
-
return (_this$trackedPointers4 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers4 === void 0 ? void 0 : _this$trackedPointers4.lastY;
|
|
75
|
-
}
|
|
76
159
|
|
|
77
160
|
getLastAvgX() {
|
|
78
|
-
|
|
161
|
+
const avgX = this.getSumX() / this.trackedPointers.size;
|
|
162
|
+
return isNaN(avgX) ? this.cachedAverages.x : avgX;
|
|
79
163
|
}
|
|
80
164
|
|
|
81
165
|
getLastAvgY() {
|
|
82
|
-
|
|
166
|
+
const avgY = this.getSumY() / this.trackedPointers.size;
|
|
167
|
+
return isNaN(avgY) ? this.cachedAverages.y : avgY;
|
|
83
168
|
}
|
|
84
169
|
|
|
85
170
|
getSumX(ignoredPointer) {
|
|
@@ -120,6 +205,11 @@ class PointerTracker {
|
|
|
120
205
|
|
|
121
206
|
resetTracker() {
|
|
122
207
|
this.trackedPointers.clear();
|
|
208
|
+
this.lastMovedPointerId = NaN;
|
|
209
|
+
|
|
210
|
+
for (let i = 0; i < MAX_POINTERS; ++i) {
|
|
211
|
+
this.touchEventsIds.set(i, NaN);
|
|
212
|
+
}
|
|
123
213
|
}
|
|
124
214
|
|
|
125
215
|
static shareCommonPointers(stPointers, ndPointers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["PointerTracker.ts"],"names":["VELOCITY_FACTOR","PointerTracker","Map","addToTracker","event","trackedPointers","has","pointerId","newElement","lastX","x","lastY","y","timeStamp","time","velocityX","velocityY","set","removeFromTracker","delete","track","element","get","dx","dy","dt","getVelocityX","getVelocityY","getLastX","getLastY","getLastAvgX","getSumX","size","getLastAvgY","getSumY","ignoredPointer","sumX","forEach","value","key","sumY","getTrackedPointersCount","getTrackedPointersID","keys","_value","push","getData","resetTracker","clear","shareCommonPointers","stPointers","ndPointers","some","includes"],"mappings":"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","sourcesContent":["import { AdaptedPointerEvent } from '../interfaces';\n\ninterface TrackerElement {\n lastX: number;\n lastY: number;\n\n timeStamp: number;\n\n velocityX: number;\n velocityY: number;\n}\n\nconst VELOCITY_FACTOR = 0.2;\n\nexport default class PointerTracker {\n private trackedPointers: Map<number, TrackerElement> = new Map<\n number,\n TrackerElement\n >();\n\n public addToTracker(event: AdaptedPointerEvent): void {\n if (this.trackedPointers.has(event.pointerId)) {\n return;\n }\n\n const newElement: TrackerElement = {\n lastX: event.x,\n lastY: event.y,\n timeStamp: event.time,\n velocityX: 0,\n velocityY: 0,\n };\n\n this.trackedPointers.set(event.pointerId, newElement);\n }\n\n public removeFromTracker(pointerId: number): void {\n this.trackedPointers.delete(pointerId);\n }\n\n public track(event: AdaptedPointerEvent): void {\n const element: TrackerElement = this.trackedPointers.get(\n event.pointerId\n ) as TrackerElement;\n\n if (!element) {\n return;\n }\n\n const dx = event.x - element.lastX;\n const dy = event.y - element.lastY;\n const dt = event.time - element.timeStamp;\n\n element.velocityX = (dx / dt) * 1000 * VELOCITY_FACTOR;\n element.velocityY = (dy / dt) * 1000 * VELOCITY_FACTOR;\n\n element.lastX = event.x;\n element.lastY = event.y;\n\n this.trackedPointers.set(event.pointerId, element);\n }\n\n public getVelocityX(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityX as number;\n }\n public getVelocityY(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityY as number;\n }\n public getLastX(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.lastX as number;\n }\n public getLastY(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.lastY as number;\n }\n public getLastAvgX(): number {\n return this.getSumX() / this.trackedPointers.size;\n }\n public getLastAvgY(): number {\n return this.getSumY() / this.trackedPointers.size;\n }\n public getSumX(ignoredPointer?: number): number {\n let sumX = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumX += value.lastX;\n }\n });\n\n return sumX;\n }\n public getSumY(ignoredPointer?: number): number {\n let sumY = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumY += value.lastY;\n }\n });\n\n return sumY;\n }\n public getTrackedPointersCount(): number {\n return this.trackedPointers.size;\n }\n public getTrackedPointersID(): number[] {\n const keys: number[] = [];\n\n this.trackedPointers.forEach((_value, key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n public getData(): Map<number, TrackerElement> {\n return this.trackedPointers;\n }\n\n public resetTracker(): void {\n this.trackedPointers.clear();\n }\n\n public static shareCommonPointers(\n stPointers: number[],\n ndPointers: number[]\n ): boolean {\n return stPointers.some((pointerId) => ndPointers.includes(pointerId));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["PointerTracker.ts"],"names":["VELOCITY_FACTOR","MAX_POINTERS","PointerTracker","constructor","Map","x","y","lastMovedPointerId","NaN","i","touchEventsIds","set","addToTracker","event","trackedPointers","has","pointerId","newElement","lastX","lastY","timeStamp","time","velocityX","velocityY","mapTouchEventId","cachedAverages","getLastAvgX","getLastAvgY","removeFromTracker","delete","removeMappedTouchId","track","element","get","dx","dy","dt","avgX","avgY","id","mappedId","touchId","isNaN","getMappedTouchEventId","touchEventId","key","value","entries","getVelocityX","getVelocityY","getLastX","getLastY","getSumX","size","getSumY","ignoredPointer","sumX","forEach","sumY","getTrackedPointersCount","getTrackedPointersID","keys","_value","push","getData","resetTracker","clear","shareCommonPointers","stPointers","ndPointers","some","includes"],"mappings":"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","sourcesContent":["import { AdaptedEvent } from '../interfaces';\n\nexport interface TrackerElement {\n lastX: number;\n lastY: number;\n\n timeStamp: number;\n\n velocityX: number;\n velocityY: number;\n}\n\n// Used to scale velocity so that it is similar to velocity in Android/iOS\nconst VELOCITY_FACTOR = 0.2;\nconst MAX_POINTERS = 20;\n\nexport default class PointerTracker {\n private trackedPointers: Map<number, TrackerElement> = new Map<\n number,\n TrackerElement\n >();\n\n private touchEventsIds: Map<number, number> = new Map<number, number>();\n\n private lastMovedPointerId: number;\n\n private cachedAverages: { x: number; y: number } = { x: 0, y: 0 };\n\n public constructor() {\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public addToTracker(event: AdaptedEvent): void {\n if (this.trackedPointers.has(event.pointerId)) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const newElement: TrackerElement = {\n lastX: event.x,\n lastY: event.y,\n timeStamp: event.time,\n velocityX: 0,\n velocityY: 0,\n };\n\n this.trackedPointers.set(event.pointerId, newElement);\n this.mapTouchEventId(event.pointerId);\n\n this.cachedAverages = {\n x: this.getLastAvgX(),\n y: this.getLastAvgY(),\n };\n }\n\n public removeFromTracker(pointerId: number): void {\n this.trackedPointers.delete(pointerId);\n this.removeMappedTouchId(pointerId);\n }\n\n public track(event: AdaptedEvent): void {\n const element: TrackerElement = this.trackedPointers.get(\n event.pointerId\n ) as TrackerElement;\n\n if (!element) {\n return;\n }\n\n this.lastMovedPointerId = event.pointerId;\n\n const dx = event.x - element.lastX;\n const dy = event.y - element.lastY;\n const dt = event.time - element.timeStamp;\n\n element.velocityX = (dx / dt) * 1000 * VELOCITY_FACTOR;\n element.velocityY = (dy / dt) * 1000 * VELOCITY_FACTOR;\n\n element.lastX = event.x;\n element.lastY = event.y;\n\n this.trackedPointers.set(event.pointerId, element);\n\n const avgX: number = this.getLastAvgX();\n const avgY: number = this.getLastAvgY();\n\n this.cachedAverages = {\n x: avgX,\n y: avgY,\n };\n }\n\n //Mapping TouchEvents ID\n private mapTouchEventId(id: number): void {\n for (const [mappedId, touchId] of this.touchEventsIds) {\n if (isNaN(touchId)) {\n this.touchEventsIds.set(mappedId, id);\n break;\n }\n }\n }\n\n private removeMappedTouchId(id: number): void {\n const mappedId: number = this.getMappedTouchEventId(id);\n if (!isNaN(mappedId)) {\n this.touchEventsIds.set(mappedId, NaN);\n }\n }\n\n public getMappedTouchEventId(touchEventId: number): number {\n for (const [key, value] of this.touchEventsIds.entries()) {\n if (value === touchEventId) {\n return key;\n }\n }\n\n return NaN;\n }\n\n public getVelocityX(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityX as number;\n }\n public getVelocityY(pointerId: number): number {\n return this.trackedPointers.get(pointerId)?.velocityY as number;\n }\n\n /**\n * Returns X coordinate of last moved pointer\n */\n public getLastX(): number;\n\n /**\n *\n * @param pointerId\n * Returns X coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastX(pointerId: number): number;\n\n public getLastX(pointerId?: number): number {\n if (pointerId) {\n return this.trackedPointers.get(pointerId)?.lastX as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastX as number;\n }\n }\n\n /**\n * Returns Y coordinate of last moved pointer\n */\n public getLastY(): number;\n\n /**\n *\n * @param pointerId\n * Returns Y coordinate of given pointer\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n public getLastY(pointerId: number): number;\n\n public getLastY(pointerId?: number): number {\n if (pointerId) {\n return this.trackedPointers.get(pointerId)?.lastY as number;\n } else {\n return this.trackedPointers.get(this.lastMovedPointerId)?.lastY as number;\n }\n }\n\n // Some handlers use these methods to send average values in native event.\n // This may happen when pointers have already been removed from tracker (i.e. pointerup event).\n // In situation when NaN would be sent as a response, we return cached value.\n // That prevents handlers from crashing\n public getLastAvgX(): number {\n const avgX: number = this.getSumX() / this.trackedPointers.size;\n return isNaN(avgX) ? this.cachedAverages.x : avgX;\n }\n public getLastAvgY(): number {\n const avgY: number = this.getSumY() / this.trackedPointers.size;\n return isNaN(avgY) ? this.cachedAverages.y : avgY;\n }\n public getSumX(ignoredPointer?: number): number {\n let sumX = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumX += value.lastX;\n }\n });\n\n return sumX;\n }\n public getSumY(ignoredPointer?: number): number {\n let sumY = 0;\n\n this.trackedPointers.forEach((value, key) => {\n if (key !== ignoredPointer) {\n sumY += value.lastY;\n }\n });\n\n return sumY;\n }\n public getTrackedPointersCount(): number {\n return this.trackedPointers.size;\n }\n public getTrackedPointersID(): number[] {\n const keys: number[] = [];\n\n this.trackedPointers.forEach((_value, key) => {\n keys.push(key);\n });\n\n return keys;\n }\n\n public getData(): Map<number, TrackerElement> {\n return this.trackedPointers;\n }\n\n public resetTracker(): void {\n this.trackedPointers.clear();\n this.lastMovedPointerId = NaN;\n\n for (let i = 0; i < MAX_POINTERS; ++i) {\n this.touchEventsIds.set(i, NaN);\n }\n }\n\n public static shareCommonPointers(\n stPointers: number[],\n ndPointers: number[]\n ): boolean {\n return stPointers.some((pointerId) => ndPointers.includes(pointerId));\n }\n}\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _interfaces = require("../interfaces");
|
|
9
|
+
|
|
10
|
+
var _EventManager = _interopRequireDefault(require("./EventManager"));
|
|
11
|
+
|
|
12
|
+
var _utils = require("../utils");
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
class TouchEventManager extends _EventManager.default {
|
|
17
|
+
setListeners() {
|
|
18
|
+
this.view.addEventListener('touchstart', event => {
|
|
19
|
+
for (let i = 0; i < event.changedTouches.length; ++i) {
|
|
20
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.DOWN, i, _interfaces.TouchEventType.DOWN); // Here we skip stylus, because in case of anything different than touch we want to handle it by using PointerEvents
|
|
21
|
+
// If we leave stylus to send touch events, handlers will receive every action twice
|
|
22
|
+
|
|
23
|
+
if (!(0, _utils.isPointerInBounds)(this.view, {
|
|
24
|
+
x: adaptedEvent.x,
|
|
25
|
+
y: adaptedEvent.y
|
|
26
|
+
}) || //@ts-ignore touchType field does exist
|
|
27
|
+
event.changedTouches[i].touchType === 'stylus') {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
this.markAsInBounds(adaptedEvent.pointerId);
|
|
32
|
+
|
|
33
|
+
if (++this.activePointersCounter > 1) {
|
|
34
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_DOWN;
|
|
35
|
+
this.onPointerAdd(adaptedEvent);
|
|
36
|
+
} else {
|
|
37
|
+
this.onPointerDown(adaptedEvent);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
this.view.addEventListener('touchmove', event => {
|
|
42
|
+
for (let i = 0; i < event.changedTouches.length; ++i) {
|
|
43
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.MOVE, i, _interfaces.TouchEventType.MOVE); //@ts-ignore touchType field does exist
|
|
44
|
+
|
|
45
|
+
if (event.changedTouches[i].touchType === 'stylus') {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const inBounds = (0, _utils.isPointerInBounds)(this.view, {
|
|
50
|
+
x: adaptedEvent.x,
|
|
51
|
+
y: adaptedEvent.y
|
|
52
|
+
});
|
|
53
|
+
const pointerIndex = this.pointersInBounds.indexOf(adaptedEvent.pointerId);
|
|
54
|
+
|
|
55
|
+
if (inBounds) {
|
|
56
|
+
if (pointerIndex < 0) {
|
|
57
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ENTER;
|
|
58
|
+
this.onPointerEnter(adaptedEvent);
|
|
59
|
+
this.markAsInBounds(adaptedEvent.pointerId);
|
|
60
|
+
} else {
|
|
61
|
+
this.onPointerMove(adaptedEvent);
|
|
62
|
+
}
|
|
63
|
+
} else {
|
|
64
|
+
if (pointerIndex >= 0) {
|
|
65
|
+
adaptedEvent.eventType = _interfaces.EventTypes.OUT;
|
|
66
|
+
this.onPointerOut(adaptedEvent);
|
|
67
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
68
|
+
} else {
|
|
69
|
+
this.onPointerOutOfBounds(adaptedEvent);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
this.view.addEventListener('touchend', event => {
|
|
75
|
+
for (let i = 0; i < event.changedTouches.length; ++i) {
|
|
76
|
+
// When we call reset on gesture handlers, it also resets their event managers
|
|
77
|
+
// In some handlers (like RotationGestureHandler) reset is called before all pointers leave view
|
|
78
|
+
// This means, that activePointersCounter will be set to 0, while there are still remaining pointers on view
|
|
79
|
+
// Removing them will end in activePointersCounter going below 0, therefore handlers won't behave properly
|
|
80
|
+
if (this.activePointersCounter === 0) {
|
|
81
|
+
break;
|
|
82
|
+
} //@ts-ignore touchType field does exist
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
if (event.changedTouches[i].touchType === 'stylus') {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.UP, i, _interfaces.TouchEventType.UP);
|
|
90
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
91
|
+
|
|
92
|
+
if (--this.activePointersCounter > 0) {
|
|
93
|
+
adaptedEvent.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_UP;
|
|
94
|
+
this.onPointerRemove(adaptedEvent);
|
|
95
|
+
} else {
|
|
96
|
+
this.onPointerUp(adaptedEvent);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
this.view.addEventListener('touchcancel', event => {
|
|
101
|
+
for (let i = 0; i < event.changedTouches.length; ++i) {
|
|
102
|
+
const adaptedEvent = this.mapEvent(event, _interfaces.EventTypes.CANCEL, i, _interfaces.TouchEventType.CANCELLED); //@ts-ignore touchType field does exist
|
|
103
|
+
|
|
104
|
+
if (event.changedTouches[i].touchType === 'stylus') {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this.onPointerCancel(adaptedEvent);
|
|
109
|
+
this.markAsOutOfBounds(adaptedEvent.pointerId);
|
|
110
|
+
this.activePointersCounter = 0;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
mapEvent(event, eventType, index, touchEventType) {
|
|
116
|
+
const rect = this.view.getBoundingClientRect();
|
|
117
|
+
const clientX = event.changedTouches[index].clientX;
|
|
118
|
+
const clientY = event.changedTouches[index].clientY;
|
|
119
|
+
return {
|
|
120
|
+
x: clientX,
|
|
121
|
+
y: clientY,
|
|
122
|
+
offsetX: clientX - rect.left,
|
|
123
|
+
offsetY: clientY - rect.top,
|
|
124
|
+
pointerId: event.changedTouches[index].identifier,
|
|
125
|
+
eventType: eventType,
|
|
126
|
+
pointerType: _interfaces.PointerType.TOUCH,
|
|
127
|
+
buttons: _interfaces.MouseButtons.NONE,
|
|
128
|
+
time: event.timeStamp,
|
|
129
|
+
allTouches: event.touches,
|
|
130
|
+
changedTouches: event.changedTouches,
|
|
131
|
+
touchEventType: touchEventType
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
exports.default = TouchEventManager;
|
|
138
|
+
//# sourceMappingURL=TouchEventManager.js.map
|