react-native-gesture-handler 2.6.2 → 2.7.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/android/build.gradle +0 -8
- package/android/gradle.properties +1 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +7 -7
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +46 -26
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +76 -29
- package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +4 -6
- package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +6 -6
- package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +1 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +1 -1
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +11 -11
- package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +17 -9
- package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +15 -8
- package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +10 -10
- package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
- package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +31 -12
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
- package/ios/RNGestureHandlerButtonComponentView.mm +4 -4
- package/lib/commonjs/web/handlers/GestureHandler.js +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/tools/PointerTracker.js +2 -2
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +1 -1
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/tools/PointerTracker.js +2 -2
- package/lib/module/web/tools/PointerTracker.js.map +1 -1
- package/package.json +4 -8
- package/src/web/handlers/GestureHandler.ts +1 -0
- package/src/web/tools/PointerTracker.ts +2 -2
@@ -104,28 +104,28 @@ class TapGestureHandler : GestureHandler<TapGestureHandler>() {
|
|
104
104
|
return maxDistSq != MAX_VALUE_IGNORE && dist > maxDistSq
|
105
105
|
}
|
106
106
|
|
107
|
-
override fun onHandle(event: MotionEvent) {
|
107
|
+
override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) {
|
108
108
|
val state = state
|
109
|
-
val action =
|
109
|
+
val action = sourceEvent.actionMasked
|
110
110
|
if (state == STATE_UNDETERMINED) {
|
111
111
|
offsetX = 0f
|
112
112
|
offsetY = 0f
|
113
|
-
startX =
|
114
|
-
startY =
|
113
|
+
startX = getLastPointerX(sourceEvent, true)
|
114
|
+
startY = getLastPointerY(sourceEvent, true)
|
115
115
|
}
|
116
116
|
if (action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_POINTER_DOWN) {
|
117
117
|
offsetX += lastX - startX
|
118
118
|
offsetY += lastY - startY
|
119
|
-
lastX = getLastPointerX(
|
120
|
-
lastY = getLastPointerY(
|
119
|
+
lastX = getLastPointerX(sourceEvent, true)
|
120
|
+
lastY = getLastPointerY(sourceEvent, true)
|
121
121
|
startX = lastX
|
122
122
|
startY = lastY
|
123
123
|
} else {
|
124
|
-
lastX = getLastPointerX(
|
125
|
-
lastY = getLastPointerY(
|
124
|
+
lastX = getLastPointerX(sourceEvent, true)
|
125
|
+
lastY = getLastPointerY(sourceEvent, true)
|
126
126
|
}
|
127
|
-
if (currentMaxNumberOfPointers <
|
128
|
-
currentMaxNumberOfPointers =
|
127
|
+
if (currentMaxNumberOfPointers < sourceEvent.pointerCount) {
|
128
|
+
currentMaxNumberOfPointers = sourceEvent.pointerCount
|
129
129
|
}
|
130
130
|
if (shouldFail()) {
|
131
131
|
fail()
|
package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt
CHANGED
@@ -3,7 +3,7 @@ package com.swmansion.gesturehandler
|
|
3
3
|
import com.facebook.react.bridge.ReactContext
|
4
4
|
import com.facebook.react.uimanager.events.Event
|
5
5
|
|
6
|
-
|
6
|
+
class ReanimatedEventDispatcher {
|
7
7
|
fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
|
8
8
|
// no-op
|
9
9
|
}
|
package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt
CHANGED
@@ -4,7 +4,7 @@ import com.facebook.react.bridge.ReactContext
|
|
4
4
|
import com.facebook.react.uimanager.events.Event
|
5
5
|
import com.swmansion.reanimated.ReanimatedModule
|
6
6
|
|
7
|
-
|
7
|
+
class ReanimatedEventDispatcher {
|
8
8
|
private var reanimatedModule: ReanimatedModule? = null
|
9
9
|
|
10
10
|
fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
|
@@ -167,6 +167,10 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
167
167
|
* [com.swmansion.gesturehandler.NativeViewGestureHandler.onHandle] */
|
168
168
|
@SuppressLint("ClickableViewAccessibility")
|
169
169
|
override fun onTouchEvent(event: MotionEvent): Boolean {
|
170
|
+
if (event.action == MotionEvent.ACTION_CANCEL) {
|
171
|
+
tryFreeingResponder()
|
172
|
+
}
|
173
|
+
|
170
174
|
val eventTime = event.eventTime
|
171
175
|
val action = event.action
|
172
176
|
// always true when lastEventTime or lastAction have default value (-1)
|
@@ -267,7 +271,7 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
267
271
|
}
|
268
272
|
|
269
273
|
override fun drawableHotspotChanged(x: Float, y: Float) {
|
270
|
-
if (
|
274
|
+
if (touchResponder == null || touchResponder === this) {
|
271
275
|
super.drawableHotspotChanged(x, y)
|
272
276
|
}
|
273
277
|
}
|
@@ -280,19 +284,31 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
280
284
|
return isResponder
|
281
285
|
}
|
282
286
|
|
287
|
+
override fun afterGestureEnd(event: MotionEvent) {
|
288
|
+
tryFreeingResponder()
|
289
|
+
isTouched = false
|
290
|
+
}
|
291
|
+
|
292
|
+
private fun tryFreeingResponder() {
|
293
|
+
if (touchResponder === this) {
|
294
|
+
touchResponder = null
|
295
|
+
soundResponder = this
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
283
299
|
private fun tryGrabbingResponder(): Boolean {
|
284
300
|
if (isChildTouched()) {
|
285
301
|
return false
|
286
302
|
}
|
287
303
|
|
288
|
-
if (
|
289
|
-
|
304
|
+
if (touchResponder == null) {
|
305
|
+
touchResponder = this
|
290
306
|
return true
|
291
307
|
}
|
292
308
|
return if (exclusive) {
|
293
|
-
|
309
|
+
touchResponder === this
|
294
310
|
} else {
|
295
|
-
!(
|
311
|
+
!(touchResponder?.exclusive ?: false)
|
296
312
|
}
|
297
313
|
}
|
298
314
|
|
@@ -313,7 +329,8 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
313
329
|
override fun performClick(): Boolean {
|
314
330
|
// don't preform click when a child button is pressed (mainly to prevent sound effect of
|
315
331
|
// a parent button from playing)
|
316
|
-
return if (!isChildTouched()) {
|
332
|
+
return if (!isChildTouched() && soundResponder == this) {
|
333
|
+
soundResponder = null
|
317
334
|
super.performClick()
|
318
335
|
} else {
|
319
336
|
false
|
@@ -327,22 +344,23 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
327
344
|
// when canStart is called eventually, tryGrabbingResponder will return true if the button
|
328
345
|
// already is a responder
|
329
346
|
if (pressed) {
|
330
|
-
tryGrabbingResponder()
|
347
|
+
if (tryGrabbingResponder()) {
|
348
|
+
soundResponder = this
|
349
|
+
}
|
331
350
|
}
|
332
351
|
|
333
352
|
// button can be pressed alongside other button if both are non-exclusive and it doesn't have
|
334
353
|
// any pressed children (to prevent pressing the parent when children is pressed).
|
335
|
-
val canBePressedAlongsideOther = !exclusive &&
|
354
|
+
val canBePressedAlongsideOther = !exclusive && touchResponder?.exclusive != true && !isChildTouched()
|
336
355
|
|
337
|
-
if (!pressed ||
|
356
|
+
if (!pressed || touchResponder === this || canBePressedAlongsideOther) {
|
338
357
|
// we set pressed state only for current responder or any non-exclusive button when responder
|
339
358
|
// is null or non-exclusive, assuming it doesn't have pressed children
|
340
359
|
isTouched = pressed
|
341
360
|
super.setPressed(pressed)
|
342
361
|
}
|
343
|
-
if (!pressed &&
|
362
|
+
if (!pressed && touchResponder === this) {
|
344
363
|
// if the responder is no longer pressed we release button responder
|
345
|
-
responder = null
|
346
364
|
isTouched = false
|
347
365
|
}
|
348
366
|
}
|
@@ -354,7 +372,8 @@ class RNGestureHandlerButtonViewManager : ViewGroupManager<ButtonViewGroup>(), R
|
|
354
372
|
|
355
373
|
companion object {
|
356
374
|
var resolveOutValue = TypedValue()
|
357
|
-
var
|
375
|
+
var touchResponder: ButtonViewGroup? = null
|
376
|
+
var soundResponder: ButtonViewGroup? = null
|
358
377
|
var dummyClickListener = OnClickListener { }
|
359
378
|
}
|
360
379
|
}
|
@@ -346,7 +346,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
|
|
346
346
|
val registry: RNGestureHandlerRegistry = RNGestureHandlerRegistry()
|
347
347
|
private val interactionManager = RNGestureHandlerInteractionManager()
|
348
348
|
private val roots: MutableList<RNGestureHandlerRootHelper> = ArrayList()
|
349
|
-
private val
|
349
|
+
private val reanimatedEventDispatcher = ReanimatedEventDispatcher()
|
350
350
|
override fun getName() = MODULE_NAME
|
351
351
|
|
352
352
|
@ReactMethod
|
@@ -593,7 +593,7 @@ class RNGestureHandlerModule(reactContext: ReactApplicationContext?)
|
|
593
593
|
// Delivers the event to Reanimated.
|
594
594
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
595
595
|
// Send event directly to Reanimated
|
596
|
-
|
596
|
+
reanimatedEventDispatcher.sendEvent(event, reactApplicationContext)
|
597
597
|
} else {
|
598
598
|
// In the old architecture, Reanimated subscribes for specific direct events.
|
599
599
|
sendEventForDirectEvent(event)
|
package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt
CHANGED
@@ -54,7 +54,7 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
|
|
54
54
|
}
|
55
55
|
|
56
56
|
private inner class RootViewGestureHandler : GestureHandler<RootViewGestureHandler>() {
|
57
|
-
override fun onHandle(event: MotionEvent) {
|
57
|
+
override fun onHandle(event: MotionEvent, sourceEvent: MotionEvent) {
|
58
58
|
val currentState = state
|
59
59
|
if (currentState == STATE_UNDETERMINED) {
|
60
60
|
begin()
|
@@ -5,10 +5,10 @@
|
|
5
5
|
#import <React/RCTConversions.h>
|
6
6
|
#import <React/RCTFabricComponentsPlugins.h>
|
7
7
|
|
8
|
-
#import <react/renderer/components/
|
9
|
-
#import <react/renderer/components/
|
10
|
-
#import <react/renderer/components/
|
11
|
-
#import <react/renderer/components/
|
8
|
+
#import <react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.h>
|
9
|
+
#import <react/renderer/components/rngesturehandler_codegen/EventEmitters.h>
|
10
|
+
#import <react/renderer/components/rngesturehandler_codegen/Props.h>
|
11
|
+
#import <react/renderer/components/rngesturehandler_codegen/RCTComponentViewHelpers.h>
|
12
12
|
|
13
13
|
#import "RNGestureHandlerButton.h"
|
14
14
|
|
@@ -154,7 +154,7 @@ class GestureHandler {
|
|
154
154
|
return;
|
155
155
|
}
|
156
156
|
|
157
|
-
if (this.tracker.getTrackedPointersCount() > 0 && (newState === _State.State.END || newState === _State.State.CANCELLED || newState === _State.State.FAILED)) {
|
157
|
+
if (this.tracker.getTrackedPointersCount() > 0 && this.config.needsPointerData && (newState === _State.State.END || newState === _State.State.CANCELLED || newState === _State.State.FAILED)) {
|
158
158
|
this.cancelTouches();
|
159
159
|
}
|
160
160
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["GestureHandler.ts"],"names":["GestureHandler","constructor","State","UNDETERMINED","enabled","PointerTracker","PointerType","NONE","newState","oldState","onGestureHandlerEvent","onGestureHandlerStateChange","propsRef","current","resultEvent","transformEventData","lastSentState","invokeNullableMethod","currentState","ACTIVE","nativeEvent","undefined","hasCustomActivationCriteria","init","ref","setView","addEventManager","PointerEventManager","view","TouchEventManager","Error","handlerTag","style","manager","setOnPointerDown","onPointerDown","bind","setOnPointerAdd","onPointerAdd","setOnPointerUp","onPointerUp","setOnPointerRemove","onPointerRemove","setOnPointerMove","onPointerMove","setOnPointerEnter","onPointerEnter","setOnPointerOut","onPointerOut","setOnPointerCancel","onPointerCancel","setOnPointerOutOfBounds","onPointerOutOfBounds","setListeners","eventManagers","push","onCancel","onReset","resetProgress","reset","tracker","resetTracker","forEach","resetManager","moveToState","sendIfDisabled","getTrackedPointersCount","END","CANCELLED","FAILED","cancelTouches","GestureHandlerOrchestrator","getInstance","onHandlerStateChange","onStateChange","_newState","_oldState","begin","checkHitSlop","BEGAN","fail","cursor","cancel","activate","_force","end","isAwaiting","awaiting","setAwaiting","value","isActive","active","setActive","getShouldResetProgress","shouldResetProgress","setShouldResetProgress","getActivationIndex","activationIndex","setActivationIndex","shouldWaitForHandlerFailure","handler","InteractionManager","shouldRequireToWaitForFailure","shouldRequireHandlerToWaitForFailure","shouldRecognizeSimultaneously","shouldBeCancelledByOther","shouldHandlerBeCancelledBy","event","recordHandlerIfNotPresent","pointerType","TOUCH","cancelMouseAndPenGestures","config","needsPointerData","sendTouchEvent","tryToSendMoveEvent","out","shouldCancellWhenOutside","sendEvent","touchEvent","transformTouchEvent","numberOfPointers","state","pointerInside","x","getLastAvgX","y","getLastAvgY","transformNativeEvent","target","timeStamp","Date","now","rect","getBoundingClientRect","all","changed","trackerData","getData","size","has","pointerId","element","key","id","getMappedTouchEventId","lastX","left","lastY","top","absoluteX","absoluteY","eventType","EventTypes","CANCEL","TouchEventType","DOWN","ADDITIONAL_POINTER_DOWN","UP","ADDITIONAL_POINTER_UP","MOVE","numberOfTouches","length","touchEventType","changedTouches","allTouches","cancelEvent","updateGestureConfig","props","validateHitSlops","removeHandlerFromOrchestrator","checkCustomActivationCriteria","criterias","indexOf","hitSlop","right","width","height","bottom","horizontal","vertical","offsetX","getLastX","offsetY","getLastY","isPointerInBounds","resetConfig","getTag","setTag","tag","getConfig","getShouldEnableGestureOnSetup","getView","getEventManagers","getTracker","getTrackedPointersID","getState","isEnabled","setShouldCancelWhenOutside","shouldCancel","getShouldCancelWhenOutside","getPointerType","method","__getHandler","argMapping","__nodeConfig","Array","isArray","index","entries","nativeValue","setValue"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\nimport { findNodeHandle } from 'react-native';\nimport { State } from '../../State';\nimport {\n Config,\n AdaptedEvent,\n PropsRef,\n ResultEvent,\n PointerData,\n ResultTouchEvent,\n PointerType,\n TouchEventType,\n EventTypes,\n} from '../interfaces';\nimport EventManager from '../tools/EventManager';\nimport GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';\nimport InteractionManager from '../tools/InteractionManager';\nimport PointerEventManager from '../tools/PointerEventManager';\nimport PointerTracker, { TrackerElement } from '../tools/PointerTracker';\nimport TouchEventManager from '../tools/TouchEventManager';\nimport { isPointerInBounds } from '../utils';\n\nexport default abstract class GestureHandler {\n private lastSentState: State | null = null;\n protected currentState: State = State.UNDETERMINED;\n\n protected shouldCancellWhenOutside = false;\n protected hasCustomActivationCriteria: boolean;\n protected enabled = false;\n\n private ref!: number;\n private propsRef!: React.RefObject<unknown>;\n private handlerTag!: number;\n protected config: Config = { enabled: false };\n protected view!: HTMLElement;\n\n protected eventManagers: EventManager[] = [];\n protected tracker: PointerTracker = new PointerTracker();\n\n // Orchestrator properties\n protected activationIndex = 0;\n protected awaiting = false;\n protected active = false;\n protected shouldResetProgress = false;\n protected pointerType: PointerType = PointerType.NONE;\n\n public constructor() {\n this.hasCustomActivationCriteria = false;\n }\n\n //\n // Initializing handler\n //\n\n protected init(ref: number, propsRef: React.RefObject<unknown>) {\n this.propsRef = propsRef;\n this.ref = ref;\n\n this.currentState = State.UNDETERMINED;\n\n this.setView();\n this.addEventManager(new PointerEventManager(this.view));\n this.addEventManager(new TouchEventManager(this.view));\n }\n\n private setView() {\n if (!this.ref) {\n throw new Error(\n `Cannot find HTML Element for handler ${this.handlerTag}`\n );\n }\n\n this.view = (findNodeHandle(this.ref) as unknown) as HTMLElement;\n this.view.style['touchAction'] = 'none';\n this.view.style['webkitUserSelect'] = 'none';\n this.view.style['userSelect'] = 'none';\n\n //@ts-ignore This one disables default events on Safari\n this.view.style['WebkitTouchCallout'] = 'none';\n }\n\n private addEventManager(manager: EventManager): void {\n manager.setOnPointerDown(this.onPointerDown.bind(this));\n manager.setOnPointerAdd(this.onPointerAdd.bind(this));\n manager.setOnPointerUp(this.onPointerUp.bind(this));\n manager.setOnPointerRemove(this.onPointerRemove.bind(this));\n manager.setOnPointerMove(this.onPointerMove.bind(this));\n manager.setOnPointerEnter(this.onPointerEnter.bind(this));\n manager.setOnPointerOut(this.onPointerOut.bind(this));\n manager.setOnPointerCancel(this.onPointerCancel.bind(this));\n manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));\n manager.setListeners();\n\n this.eventManagers.push(manager);\n }\n\n //\n // Resetting handler\n //\n\n protected onCancel(): void {}\n protected onReset(): void {}\n protected resetProgress(): void {}\n\n public reset(): void {\n this.tracker.resetTracker();\n this.onReset();\n this.resetProgress();\n this.eventManagers.forEach((manager: EventManager) =>\n manager.resetManager()\n );\n this.currentState = State.UNDETERMINED;\n }\n\n //\n // State logic\n //\n\n public moveToState(newState: State, sendIfDisabled?: boolean) {\n if (this.currentState === newState) {\n return;\n }\n\n if (\n this.tracker.getTrackedPointersCount() > 0 &&\n (newState === State.END ||\n newState === State.CANCELLED ||\n newState === State.FAILED)\n ) {\n this.cancelTouches();\n }\n\n const oldState = this.currentState;\n this.currentState = newState;\n\n GestureHandlerOrchestrator.getInstance().onHandlerStateChange(\n this,\n newState,\n oldState,\n sendIfDisabled\n );\n\n this.onStateChange(newState, oldState);\n }\n\n protected onStateChange(_newState: State, _oldState: State): void {}\n\n public begin(): void {\n if (!this.checkHitSlop()) {\n return;\n }\n\n if (this.currentState === State.UNDETERMINED) {\n this.moveToState(State.BEGAN);\n }\n }\n\n /**\n * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send fail event\n */\n public fail(sendIfDisabled?: boolean): void {\n if (\n this.currentState === State.ACTIVE ||\n this.currentState === State.BEGAN\n ) {\n this.moveToState(State.FAILED, sendIfDisabled);\n this.view.style.cursor = 'auto';\n }\n\n this.resetProgress();\n }\n\n /**\n * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send cancel event\n */\n public cancel(sendIfDisabled?: boolean): void {\n if (\n this.currentState === State.ACTIVE ||\n this.currentState === State.UNDETERMINED ||\n this.currentState === State.BEGAN\n ) {\n this.onCancel();\n this.moveToState(State.CANCELLED, sendIfDisabled);\n this.view.style.cursor = 'auto';\n }\n }\n\n public activate(_force = false) {\n if (\n this.currentState === State.UNDETERMINED ||\n this.currentState === State.BEGAN\n ) {\n this.moveToState(State.ACTIVE);\n this.view.style.cursor = 'grab';\n }\n }\n\n public end() {\n if (\n this.currentState === State.BEGAN ||\n this.currentState === State.ACTIVE\n ) {\n this.moveToState(State.END);\n this.view.style.cursor = 'auto';\n }\n\n this.resetProgress();\n }\n\n //\n // Methods for orchestrator\n //\n\n public isAwaiting(): boolean {\n return this.awaiting;\n }\n public setAwaiting(value: boolean): void {\n this.awaiting = value;\n }\n\n public isActive(): boolean {\n return this.active;\n }\n public setActive(value: boolean): void {\n this.active = value;\n }\n\n public getShouldResetProgress(): boolean {\n return this.shouldResetProgress;\n }\n public setShouldResetProgress(value: boolean): void {\n this.shouldResetProgress = value;\n }\n\n public getActivationIndex(): number {\n return this.activationIndex;\n }\n public setActivationIndex(value: number): void {\n this.activationIndex = value;\n }\n\n public shouldWaitForHandlerFailure(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldWaitForHandlerFailure(\n this,\n handler\n );\n }\n\n public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldRequireHandlerToWaitForFailure(\n this,\n handler\n );\n }\n\n public shouldRecognizeSimultaneously(handler: GestureHandler): boolean {\n if (handler === this) {\n return true;\n }\n\n return InteractionManager.getInstance().shouldRecognizeSimultaneously(\n this,\n handler\n );\n }\n\n public shouldBeCancelledByOther(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldHandlerBeCancelledBy(\n this,\n handler\n );\n }\n\n //\n // Event actions\n //\n\n protected onPointerDown(event: AdaptedEvent): void {\n GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);\n this.pointerType = event.pointerType;\n\n if (this.pointerType === PointerType.TOUCH) {\n GestureHandlerOrchestrator.getInstance().cancelMouseAndPenGestures(this);\n }\n\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n // Adding another pointer to existing ones\n protected onPointerAdd(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerUp(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n // Removing pointer, when there is more than one pointers\n protected onPointerRemove(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerMove(event: AdaptedEvent): void {\n this.tryToSendMoveEvent(false);\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerOut(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerEnter(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerCancel(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerOutOfBounds(event: AdaptedEvent): void {\n this.tryToSendMoveEvent(true);\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n private tryToSendMoveEvent(out: boolean): void {\n if (\n this.enabled &&\n this.active &&\n (!out || (out && !this.shouldCancellWhenOutside))\n ) {\n this.sendEvent(this.currentState, this.currentState);\n }\n }\n\n public sendTouchEvent(event: AdaptedEvent): void {\n if (!this.enabled) {\n return;\n }\n\n const { onGestureHandlerEvent }: PropsRef = this.propsRef\n .current as PropsRef;\n\n const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(\n event\n );\n\n if (touchEvent) {\n invokeNullableMethod(onGestureHandlerEvent, touchEvent);\n }\n }\n\n //\n // Events Sending\n //\n\n public sendEvent = (newState: State, oldState: State): void => {\n const {\n onGestureHandlerEvent,\n onGestureHandlerStateChange,\n }: PropsRef = this.propsRef.current as PropsRef;\n\n const resultEvent: ResultEvent = this.transformEventData(\n newState,\n oldState\n );\n\n // In the new API oldState field has to be undefined, unless we send event state changed\n // Here the order is flipped to avoid workarounds such as making backup of the state and setting it to undefined first, then changing it back\n // Flipping order with setting oldState to undefined solves issue, when events were being sent twice instead of once\n // However, this may cause trouble in the future (but for now we don't know that)\n\n if (this.lastSentState !== newState) {\n this.lastSentState = newState;\n invokeNullableMethod(onGestureHandlerStateChange, resultEvent);\n }\n if (this.currentState === State.ACTIVE) {\n resultEvent.nativeEvent.oldState = undefined;\n invokeNullableMethod(onGestureHandlerEvent, resultEvent);\n }\n };\n\n private transformEventData(newState: State, oldState: State): ResultEvent {\n return {\n nativeEvent: {\n numberOfPointers: this.tracker.getTrackedPointersCount(),\n state: newState,\n pointerInside: isPointerInBounds(this.view, {\n x: this.tracker.getLastAvgX(),\n y: this.tracker.getLastAvgY(),\n }),\n ...this.transformNativeEvent(),\n handlerTag: this.handlerTag,\n target: this.ref,\n oldState: newState !== oldState ? oldState : undefined,\n },\n timeStamp: Date.now(),\n };\n }\n\n private transformTouchEvent(\n event: AdaptedEvent\n ): ResultTouchEvent | undefined {\n const rect = this.view.getBoundingClientRect();\n\n const all: PointerData[] = [];\n const changed: PointerData[] = [];\n\n const trackerData = this.tracker.getData();\n\n // This if handles edge case where all pointers have been cancelled\n // When pointercancel is triggered, reset method is called. This means that tracker will be reset after first pointer being cancelled\n // The problem is, that handler will receive another pointercancel event from the rest of the pointers\n // To avoid crashing, we don't send event if tracker tracks no pointers, i.e. has been reset\n if (trackerData.size === 0 || !trackerData.has(event.pointerId)) {\n return;\n }\n\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n all.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n\n // Each pointer sends its own event, so we want changed touches to contain only the pointer that has changed.\n // However, if the event is cancel, we want to cancel all pointers to avoid crashes\n if (event.eventType !== EventTypes.CANCEL) {\n changed.push({\n id: this.tracker.getMappedTouchEventId(event.pointerId),\n x: event.x - rect.left,\n y: event.y - rect.top,\n absoluteX: event.x,\n absoluteY: event.y,\n });\n } else {\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n changed.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n }\n\n let eventType: TouchEventType = TouchEventType.UNDETERMINED;\n\n switch (event.eventType) {\n case EventTypes.DOWN:\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n eventType = TouchEventType.DOWN;\n break;\n case EventTypes.UP:\n case EventTypes.ADDITIONAL_POINTER_UP:\n eventType = TouchEventType.UP;\n break;\n case EventTypes.MOVE:\n eventType = TouchEventType.MOVE;\n break;\n case EventTypes.CANCEL:\n eventType = TouchEventType.CANCELLED;\n break;\n }\n\n // Here, when we receive up event, we want to decrease number of touches\n // That's because we want handler to send information that there's one pointer less\n // However, we still want this pointer to be present in allTouches array, so that its data can be accessed\n let numberOfTouches: number = all.length;\n\n if (\n event.eventType === EventTypes.UP ||\n event.eventType === EventTypes.ADDITIONAL_POINTER_UP\n ) {\n --numberOfTouches;\n }\n\n return {\n nativeEvent: {\n handlerTag: this.handlerTag,\n state: this.currentState,\n eventType: event.touchEventType ?? eventType,\n changedTouches: changed,\n allTouches: all,\n numberOfTouches: numberOfTouches,\n },\n timeStamp: Date.now(),\n };\n }\n\n private cancelTouches(): void {\n const rect = this.view.getBoundingClientRect();\n\n const all: PointerData[] = [];\n const changed: PointerData[] = [];\n\n const trackerData = this.tracker.getData();\n\n if (trackerData.size === 0) {\n return;\n }\n\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n all.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n\n changed.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n\n const cancelEvent: ResultTouchEvent = {\n nativeEvent: {\n handlerTag: this.handlerTag,\n state: this.currentState,\n eventType: TouchEventType.CANCELLED,\n changedTouches: changed,\n allTouches: all,\n numberOfTouches: all.length,\n },\n timeStamp: Date.now(),\n };\n\n const { onGestureHandlerEvent }: PropsRef = this.propsRef\n .current as PropsRef;\n\n invokeNullableMethod(onGestureHandlerEvent, cancelEvent);\n }\n\n protected transformNativeEvent() {\n return {};\n }\n\n //\n // Handling config\n //\n\n public updateGestureConfig({ enabled = true, ...props }: Config): void {\n this.config = { enabled: enabled, ...props };\n this.enabled = enabled;\n this.validateHitSlops();\n\n if (this.enabled) {\n return;\n }\n\n switch (this.currentState) {\n case State.ACTIVE:\n this.fail(true);\n break;\n case State.UNDETERMINED:\n GestureHandlerOrchestrator.getInstance().removeHandlerFromOrchestrator(\n this\n );\n break;\n default:\n this.cancel(true);\n break;\n }\n }\n\n protected checkCustomActivationCriteria(criterias: string[]): void {\n for (const key in this.config) {\n if (criterias.indexOf(key) >= 0) {\n this.hasCustomActivationCriteria = true;\n }\n }\n }\n\n private validateHitSlops(): void {\n if (!this.config.hitSlop) {\n return;\n }\n\n if (\n this.config.hitSlop.left !== undefined &&\n this.config.hitSlop.right !== undefined &&\n this.config.hitSlop.width !== undefined\n ) {\n throw new Error(\n 'HitSlop Error: Cannot define left, right and width at the same time'\n );\n }\n\n if (\n this.config.hitSlop.width !== undefined &&\n this.config.hitSlop.left === undefined &&\n this.config.hitSlop.right === undefined\n ) {\n throw new Error(\n 'HitSlop Error: When width is defined, either left or right has to be defined'\n );\n }\n\n if (\n this.config.hitSlop.height !== undefined &&\n this.config.hitSlop.top !== undefined &&\n this.config.hitSlop.bottom !== undefined\n ) {\n throw new Error(\n 'HitSlop Error: Cannot define top, bottom and height at the same time'\n );\n }\n\n if (\n this.config.hitSlop.height !== undefined &&\n this.config.hitSlop.top === undefined &&\n this.config.hitSlop.bottom === undefined\n ) {\n throw new Error(\n 'HitSlop Error: When height is defined, either top or bottom has to be defined'\n );\n }\n }\n\n private checkHitSlop(): boolean {\n if (!this.config.hitSlop) {\n return true;\n }\n\n const width = this.view.getBoundingClientRect().width;\n const height = this.view.getBoundingClientRect().height;\n\n let left = 0;\n let top = 0;\n let right: number = width;\n let bottom: number = height;\n\n if (this.config.hitSlop.horizontal !== undefined) {\n left -= this.config.hitSlop.horizontal;\n right += this.config.hitSlop.horizontal;\n }\n\n if (this.config.hitSlop.vertical !== undefined) {\n top -= this.config.hitSlop.vertical;\n bottom += this.config.hitSlop.vertical;\n }\n\n if (this.config.hitSlop.left !== undefined) {\n left = -this.config.hitSlop.left;\n }\n\n if (this.config.hitSlop.right !== undefined) {\n right = width + this.config.hitSlop.right;\n }\n\n if (this.config.hitSlop.top !== undefined) {\n top = -this.config.hitSlop.top;\n }\n\n if (this.config.hitSlop.bottom !== undefined) {\n bottom = width + this.config.hitSlop.bottom;\n }\n if (this.config.hitSlop.width !== undefined) {\n if (this.config.hitSlop.left !== undefined) {\n right = left + this.config.hitSlop.width;\n } else if (this.config.hitSlop.right !== undefined) {\n left = right - this.config.hitSlop.width;\n }\n }\n\n if (this.config.hitSlop.height !== undefined) {\n if (this.config.hitSlop.top !== undefined) {\n bottom = top + this.config.hitSlop.height;\n } else if (this.config.hitSlop.bottom !== undefined) {\n top = bottom - this.config.hitSlop.height;\n }\n }\n\n const rect: DOMRect = this.view.getBoundingClientRect();\n const offsetX: number = this.tracker.getLastX() - rect.left;\n const offsetY: number = this.tracker.getLastY() - rect.top;\n\n if (\n offsetX >= left &&\n offsetX <= right &&\n offsetY >= top &&\n offsetY <= bottom\n ) {\n return true;\n }\n return false;\n }\n\n public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {\n const rect: DOMRect = this.view.getBoundingClientRect();\n\n return (\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n );\n }\n\n protected resetConfig(): void {}\n\n //\n // Getters and setters\n //\n\n public getTag(): number {\n return this.handlerTag;\n }\n public setTag(tag: number): void {\n this.handlerTag = tag;\n }\n\n protected getConfig() {\n return this.config;\n }\n\n public getShouldEnableGestureOnSetup(): boolean {\n throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');\n }\n\n public getView(): HTMLElement {\n return this.view;\n }\n\n public getEventManagers(): EventManager[] {\n return this.eventManagers;\n }\n\n public getTracker(): PointerTracker {\n return this.tracker;\n }\n\n public getTrackedPointersID(): number[] {\n return this.tracker.getTrackedPointersID();\n }\n\n public getState(): State {\n return this.currentState;\n }\n\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n protected setShouldCancelWhenOutside(shouldCancel: boolean) {\n this.shouldCancellWhenOutside = shouldCancel;\n }\n protected getShouldCancelWhenOutside(): boolean {\n return this.shouldCancellWhenOutside;\n }\n\n public getPointerType(): PointerType {\n return this.pointerType;\n }\n}\n\nfunction invokeNullableMethod(\n method:\n | ((event: ResultEvent | ResultTouchEvent) => void)\n | { __getHandler: () => (event: ResultEvent | ResultTouchEvent) => void }\n | { __nodeConfig: { argMapping: unknown[] } },\n event: ResultEvent | ResultTouchEvent\n): void {\n if (!method) {\n return;\n }\n\n if (typeof method === 'function') {\n method(event);\n return;\n }\n\n if ('__getHandler' in method && typeof method.__getHandler === 'function') {\n const handler = method.__getHandler();\n invokeNullableMethod(handler, event);\n return;\n }\n\n if (!('__nodeConfig' in method)) {\n return;\n }\n\n const { argMapping } = method.__nodeConfig;\n if (!Array.isArray(argMapping)) {\n return;\n }\n\n for (const [index, [key, value]] of argMapping.entries()) {\n if (!(key in event.nativeEvent)) {\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const nativeValue = event.nativeEvent[key];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (value?.setValue) {\n //Reanimated API\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n value.setValue(nativeValue);\n } else {\n //RN Animated API\n method.__nodeConfig.argMapping[index] = [key, nativeValue];\n }\n }\n\n return;\n}\n"]}
|
1
|
+
{"version":3,"sources":["GestureHandler.ts"],"names":["GestureHandler","constructor","State","UNDETERMINED","enabled","PointerTracker","PointerType","NONE","newState","oldState","onGestureHandlerEvent","onGestureHandlerStateChange","propsRef","current","resultEvent","transformEventData","lastSentState","invokeNullableMethod","currentState","ACTIVE","nativeEvent","undefined","hasCustomActivationCriteria","init","ref","setView","addEventManager","PointerEventManager","view","TouchEventManager","Error","handlerTag","style","manager","setOnPointerDown","onPointerDown","bind","setOnPointerAdd","onPointerAdd","setOnPointerUp","onPointerUp","setOnPointerRemove","onPointerRemove","setOnPointerMove","onPointerMove","setOnPointerEnter","onPointerEnter","setOnPointerOut","onPointerOut","setOnPointerCancel","onPointerCancel","setOnPointerOutOfBounds","onPointerOutOfBounds","setListeners","eventManagers","push","onCancel","onReset","resetProgress","reset","tracker","resetTracker","forEach","resetManager","moveToState","sendIfDisabled","getTrackedPointersCount","config","needsPointerData","END","CANCELLED","FAILED","cancelTouches","GestureHandlerOrchestrator","getInstance","onHandlerStateChange","onStateChange","_newState","_oldState","begin","checkHitSlop","BEGAN","fail","cursor","cancel","activate","_force","end","isAwaiting","awaiting","setAwaiting","value","isActive","active","setActive","getShouldResetProgress","shouldResetProgress","setShouldResetProgress","getActivationIndex","activationIndex","setActivationIndex","shouldWaitForHandlerFailure","handler","InteractionManager","shouldRequireToWaitForFailure","shouldRequireHandlerToWaitForFailure","shouldRecognizeSimultaneously","shouldBeCancelledByOther","shouldHandlerBeCancelledBy","event","recordHandlerIfNotPresent","pointerType","TOUCH","cancelMouseAndPenGestures","sendTouchEvent","tryToSendMoveEvent","out","shouldCancellWhenOutside","sendEvent","touchEvent","transformTouchEvent","numberOfPointers","state","pointerInside","x","getLastAvgX","y","getLastAvgY","transformNativeEvent","target","timeStamp","Date","now","rect","getBoundingClientRect","all","changed","trackerData","getData","size","has","pointerId","element","key","id","getMappedTouchEventId","lastX","left","lastY","top","absoluteX","absoluteY","eventType","EventTypes","CANCEL","TouchEventType","DOWN","ADDITIONAL_POINTER_DOWN","UP","ADDITIONAL_POINTER_UP","MOVE","numberOfTouches","length","touchEventType","changedTouches","allTouches","cancelEvent","updateGestureConfig","props","validateHitSlops","removeHandlerFromOrchestrator","checkCustomActivationCriteria","criterias","indexOf","hitSlop","right","width","height","bottom","horizontal","vertical","offsetX","getLastX","offsetY","getLastY","isPointerInBounds","resetConfig","getTag","setTag","tag","getConfig","getShouldEnableGestureOnSetup","getView","getEventManagers","getTracker","getTrackedPointersID","getState","isEnabled","setShouldCancelWhenOutside","shouldCancel","getShouldCancelWhenOutside","getPointerType","method","__getHandler","argMapping","__nodeConfig","Array","isArray","index","entries","nativeValue","setValue"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-empty-function */\nimport { findNodeHandle } from 'react-native';\nimport { State } from '../../State';\nimport {\n Config,\n AdaptedEvent,\n PropsRef,\n ResultEvent,\n PointerData,\n ResultTouchEvent,\n PointerType,\n TouchEventType,\n EventTypes,\n} from '../interfaces';\nimport EventManager from '../tools/EventManager';\nimport GestureHandlerOrchestrator from '../tools/GestureHandlerOrchestrator';\nimport InteractionManager from '../tools/InteractionManager';\nimport PointerEventManager from '../tools/PointerEventManager';\nimport PointerTracker, { TrackerElement } from '../tools/PointerTracker';\nimport TouchEventManager from '../tools/TouchEventManager';\nimport { isPointerInBounds } from '../utils';\n\nexport default abstract class GestureHandler {\n private lastSentState: State | null = null;\n protected currentState: State = State.UNDETERMINED;\n\n protected shouldCancellWhenOutside = false;\n protected hasCustomActivationCriteria: boolean;\n protected enabled = false;\n\n private ref!: number;\n private propsRef!: React.RefObject<unknown>;\n private handlerTag!: number;\n protected config: Config = { enabled: false };\n protected view!: HTMLElement;\n\n protected eventManagers: EventManager[] = [];\n protected tracker: PointerTracker = new PointerTracker();\n\n // Orchestrator properties\n protected activationIndex = 0;\n protected awaiting = false;\n protected active = false;\n protected shouldResetProgress = false;\n protected pointerType: PointerType = PointerType.NONE;\n\n public constructor() {\n this.hasCustomActivationCriteria = false;\n }\n\n //\n // Initializing handler\n //\n\n protected init(ref: number, propsRef: React.RefObject<unknown>) {\n this.propsRef = propsRef;\n this.ref = ref;\n\n this.currentState = State.UNDETERMINED;\n\n this.setView();\n this.addEventManager(new PointerEventManager(this.view));\n this.addEventManager(new TouchEventManager(this.view));\n }\n\n private setView() {\n if (!this.ref) {\n throw new Error(\n `Cannot find HTML Element for handler ${this.handlerTag}`\n );\n }\n\n this.view = (findNodeHandle(this.ref) as unknown) as HTMLElement;\n this.view.style['touchAction'] = 'none';\n this.view.style['webkitUserSelect'] = 'none';\n this.view.style['userSelect'] = 'none';\n\n //@ts-ignore This one disables default events on Safari\n this.view.style['WebkitTouchCallout'] = 'none';\n }\n\n private addEventManager(manager: EventManager): void {\n manager.setOnPointerDown(this.onPointerDown.bind(this));\n manager.setOnPointerAdd(this.onPointerAdd.bind(this));\n manager.setOnPointerUp(this.onPointerUp.bind(this));\n manager.setOnPointerRemove(this.onPointerRemove.bind(this));\n manager.setOnPointerMove(this.onPointerMove.bind(this));\n manager.setOnPointerEnter(this.onPointerEnter.bind(this));\n manager.setOnPointerOut(this.onPointerOut.bind(this));\n manager.setOnPointerCancel(this.onPointerCancel.bind(this));\n manager.setOnPointerOutOfBounds(this.onPointerOutOfBounds.bind(this));\n manager.setListeners();\n\n this.eventManagers.push(manager);\n }\n\n //\n // Resetting handler\n //\n\n protected onCancel(): void {}\n protected onReset(): void {}\n protected resetProgress(): void {}\n\n public reset(): void {\n this.tracker.resetTracker();\n this.onReset();\n this.resetProgress();\n this.eventManagers.forEach((manager: EventManager) =>\n manager.resetManager()\n );\n this.currentState = State.UNDETERMINED;\n }\n\n //\n // State logic\n //\n\n public moveToState(newState: State, sendIfDisabled?: boolean) {\n if (this.currentState === newState) {\n return;\n }\n\n if (\n this.tracker.getTrackedPointersCount() > 0 &&\n this.config.needsPointerData &&\n (newState === State.END ||\n newState === State.CANCELLED ||\n newState === State.FAILED)\n ) {\n this.cancelTouches();\n }\n\n const oldState = this.currentState;\n this.currentState = newState;\n\n GestureHandlerOrchestrator.getInstance().onHandlerStateChange(\n this,\n newState,\n oldState,\n sendIfDisabled\n );\n\n this.onStateChange(newState, oldState);\n }\n\n protected onStateChange(_newState: State, _oldState: State): void {}\n\n public begin(): void {\n if (!this.checkHitSlop()) {\n return;\n }\n\n if (this.currentState === State.UNDETERMINED) {\n this.moveToState(State.BEGAN);\n }\n }\n\n /**\n * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send fail event\n */\n public fail(sendIfDisabled?: boolean): void {\n if (\n this.currentState === State.ACTIVE ||\n this.currentState === State.BEGAN\n ) {\n this.moveToState(State.FAILED, sendIfDisabled);\n this.view.style.cursor = 'auto';\n }\n\n this.resetProgress();\n }\n\n /**\n * @param {boolean} sendIfDisabled - Used when handler becomes disabled. With this flag orchestrator will be forced to send cancel event\n */\n public cancel(sendIfDisabled?: boolean): void {\n if (\n this.currentState === State.ACTIVE ||\n this.currentState === State.UNDETERMINED ||\n this.currentState === State.BEGAN\n ) {\n this.onCancel();\n this.moveToState(State.CANCELLED, sendIfDisabled);\n this.view.style.cursor = 'auto';\n }\n }\n\n public activate(_force = false) {\n if (\n this.currentState === State.UNDETERMINED ||\n this.currentState === State.BEGAN\n ) {\n this.moveToState(State.ACTIVE);\n this.view.style.cursor = 'grab';\n }\n }\n\n public end() {\n if (\n this.currentState === State.BEGAN ||\n this.currentState === State.ACTIVE\n ) {\n this.moveToState(State.END);\n this.view.style.cursor = 'auto';\n }\n\n this.resetProgress();\n }\n\n //\n // Methods for orchestrator\n //\n\n public isAwaiting(): boolean {\n return this.awaiting;\n }\n public setAwaiting(value: boolean): void {\n this.awaiting = value;\n }\n\n public isActive(): boolean {\n return this.active;\n }\n public setActive(value: boolean): void {\n this.active = value;\n }\n\n public getShouldResetProgress(): boolean {\n return this.shouldResetProgress;\n }\n public setShouldResetProgress(value: boolean): void {\n this.shouldResetProgress = value;\n }\n\n public getActivationIndex(): number {\n return this.activationIndex;\n }\n public setActivationIndex(value: number): void {\n this.activationIndex = value;\n }\n\n public shouldWaitForHandlerFailure(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldWaitForHandlerFailure(\n this,\n handler\n );\n }\n\n public shouldRequireToWaitForFailure(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldRequireHandlerToWaitForFailure(\n this,\n handler\n );\n }\n\n public shouldRecognizeSimultaneously(handler: GestureHandler): boolean {\n if (handler === this) {\n return true;\n }\n\n return InteractionManager.getInstance().shouldRecognizeSimultaneously(\n this,\n handler\n );\n }\n\n public shouldBeCancelledByOther(handler: GestureHandler): boolean {\n if (handler === this) {\n return false;\n }\n\n return InteractionManager.getInstance().shouldHandlerBeCancelledBy(\n this,\n handler\n );\n }\n\n //\n // Event actions\n //\n\n protected onPointerDown(event: AdaptedEvent): void {\n GestureHandlerOrchestrator.getInstance().recordHandlerIfNotPresent(this);\n this.pointerType = event.pointerType;\n\n if (this.pointerType === PointerType.TOUCH) {\n GestureHandlerOrchestrator.getInstance().cancelMouseAndPenGestures(this);\n }\n\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n // Adding another pointer to existing ones\n protected onPointerAdd(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerUp(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n // Removing pointer, when there is more than one pointers\n protected onPointerRemove(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerMove(event: AdaptedEvent): void {\n this.tryToSendMoveEvent(false);\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerOut(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerEnter(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerCancel(event: AdaptedEvent): void {\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n protected onPointerOutOfBounds(event: AdaptedEvent): void {\n this.tryToSendMoveEvent(true);\n if (this.config.needsPointerData) {\n this.sendTouchEvent(event);\n }\n }\n private tryToSendMoveEvent(out: boolean): void {\n if (\n this.enabled &&\n this.active &&\n (!out || (out && !this.shouldCancellWhenOutside))\n ) {\n this.sendEvent(this.currentState, this.currentState);\n }\n }\n\n public sendTouchEvent(event: AdaptedEvent): void {\n if (!this.enabled) {\n return;\n }\n\n const { onGestureHandlerEvent }: PropsRef = this.propsRef\n .current as PropsRef;\n\n const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(\n event\n );\n\n if (touchEvent) {\n invokeNullableMethod(onGestureHandlerEvent, touchEvent);\n }\n }\n\n //\n // Events Sending\n //\n\n public sendEvent = (newState: State, oldState: State): void => {\n const {\n onGestureHandlerEvent,\n onGestureHandlerStateChange,\n }: PropsRef = this.propsRef.current as PropsRef;\n\n const resultEvent: ResultEvent = this.transformEventData(\n newState,\n oldState\n );\n\n // In the new API oldState field has to be undefined, unless we send event state changed\n // Here the order is flipped to avoid workarounds such as making backup of the state and setting it to undefined first, then changing it back\n // Flipping order with setting oldState to undefined solves issue, when events were being sent twice instead of once\n // However, this may cause trouble in the future (but for now we don't know that)\n\n if (this.lastSentState !== newState) {\n this.lastSentState = newState;\n invokeNullableMethod(onGestureHandlerStateChange, resultEvent);\n }\n if (this.currentState === State.ACTIVE) {\n resultEvent.nativeEvent.oldState = undefined;\n invokeNullableMethod(onGestureHandlerEvent, resultEvent);\n }\n };\n\n private transformEventData(newState: State, oldState: State): ResultEvent {\n return {\n nativeEvent: {\n numberOfPointers: this.tracker.getTrackedPointersCount(),\n state: newState,\n pointerInside: isPointerInBounds(this.view, {\n x: this.tracker.getLastAvgX(),\n y: this.tracker.getLastAvgY(),\n }),\n ...this.transformNativeEvent(),\n handlerTag: this.handlerTag,\n target: this.ref,\n oldState: newState !== oldState ? oldState : undefined,\n },\n timeStamp: Date.now(),\n };\n }\n\n private transformTouchEvent(\n event: AdaptedEvent\n ): ResultTouchEvent | undefined {\n const rect = this.view.getBoundingClientRect();\n\n const all: PointerData[] = [];\n const changed: PointerData[] = [];\n\n const trackerData = this.tracker.getData();\n\n // This if handles edge case where all pointers have been cancelled\n // When pointercancel is triggered, reset method is called. This means that tracker will be reset after first pointer being cancelled\n // The problem is, that handler will receive another pointercancel event from the rest of the pointers\n // To avoid crashing, we don't send event if tracker tracks no pointers, i.e. has been reset\n if (trackerData.size === 0 || !trackerData.has(event.pointerId)) {\n return;\n }\n\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n all.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n\n // Each pointer sends its own event, so we want changed touches to contain only the pointer that has changed.\n // However, if the event is cancel, we want to cancel all pointers to avoid crashes\n if (event.eventType !== EventTypes.CANCEL) {\n changed.push({\n id: this.tracker.getMappedTouchEventId(event.pointerId),\n x: event.x - rect.left,\n y: event.y - rect.top,\n absoluteX: event.x,\n absoluteY: event.y,\n });\n } else {\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n changed.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n }\n\n let eventType: TouchEventType = TouchEventType.UNDETERMINED;\n\n switch (event.eventType) {\n case EventTypes.DOWN:\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n eventType = TouchEventType.DOWN;\n break;\n case EventTypes.UP:\n case EventTypes.ADDITIONAL_POINTER_UP:\n eventType = TouchEventType.UP;\n break;\n case EventTypes.MOVE:\n eventType = TouchEventType.MOVE;\n break;\n case EventTypes.CANCEL:\n eventType = TouchEventType.CANCELLED;\n break;\n }\n\n // Here, when we receive up event, we want to decrease number of touches\n // That's because we want handler to send information that there's one pointer less\n // However, we still want this pointer to be present in allTouches array, so that its data can be accessed\n let numberOfTouches: number = all.length;\n\n if (\n event.eventType === EventTypes.UP ||\n event.eventType === EventTypes.ADDITIONAL_POINTER_UP\n ) {\n --numberOfTouches;\n }\n\n return {\n nativeEvent: {\n handlerTag: this.handlerTag,\n state: this.currentState,\n eventType: event.touchEventType ?? eventType,\n changedTouches: changed,\n allTouches: all,\n numberOfTouches: numberOfTouches,\n },\n timeStamp: Date.now(),\n };\n }\n\n private cancelTouches(): void {\n const rect = this.view.getBoundingClientRect();\n\n const all: PointerData[] = [];\n const changed: PointerData[] = [];\n\n const trackerData = this.tracker.getData();\n\n if (trackerData.size === 0) {\n return;\n }\n\n trackerData.forEach((element: TrackerElement, key: number): void => {\n const id: number = this.tracker.getMappedTouchEventId(key);\n\n all.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n\n changed.push({\n id: id,\n x: element.lastX - rect.left,\n y: element.lastY - rect.top,\n absoluteX: element.lastX,\n absoluteY: element.lastY,\n });\n });\n\n const cancelEvent: ResultTouchEvent = {\n nativeEvent: {\n handlerTag: this.handlerTag,\n state: this.currentState,\n eventType: TouchEventType.CANCELLED,\n changedTouches: changed,\n allTouches: all,\n numberOfTouches: all.length,\n },\n timeStamp: Date.now(),\n };\n\n const { onGestureHandlerEvent }: PropsRef = this.propsRef\n .current as PropsRef;\n\n invokeNullableMethod(onGestureHandlerEvent, cancelEvent);\n }\n\n protected transformNativeEvent() {\n return {};\n }\n\n //\n // Handling config\n //\n\n public updateGestureConfig({ enabled = true, ...props }: Config): void {\n this.config = { enabled: enabled, ...props };\n this.enabled = enabled;\n this.validateHitSlops();\n\n if (this.enabled) {\n return;\n }\n\n switch (this.currentState) {\n case State.ACTIVE:\n this.fail(true);\n break;\n case State.UNDETERMINED:\n GestureHandlerOrchestrator.getInstance().removeHandlerFromOrchestrator(\n this\n );\n break;\n default:\n this.cancel(true);\n break;\n }\n }\n\n protected checkCustomActivationCriteria(criterias: string[]): void {\n for (const key in this.config) {\n if (criterias.indexOf(key) >= 0) {\n this.hasCustomActivationCriteria = true;\n }\n }\n }\n\n private validateHitSlops(): void {\n if (!this.config.hitSlop) {\n return;\n }\n\n if (\n this.config.hitSlop.left !== undefined &&\n this.config.hitSlop.right !== undefined &&\n this.config.hitSlop.width !== undefined\n ) {\n throw new Error(\n 'HitSlop Error: Cannot define left, right and width at the same time'\n );\n }\n\n if (\n this.config.hitSlop.width !== undefined &&\n this.config.hitSlop.left === undefined &&\n this.config.hitSlop.right === undefined\n ) {\n throw new Error(\n 'HitSlop Error: When width is defined, either left or right has to be defined'\n );\n }\n\n if (\n this.config.hitSlop.height !== undefined &&\n this.config.hitSlop.top !== undefined &&\n this.config.hitSlop.bottom !== undefined\n ) {\n throw new Error(\n 'HitSlop Error: Cannot define top, bottom and height at the same time'\n );\n }\n\n if (\n this.config.hitSlop.height !== undefined &&\n this.config.hitSlop.top === undefined &&\n this.config.hitSlop.bottom === undefined\n ) {\n throw new Error(\n 'HitSlop Error: When height is defined, either top or bottom has to be defined'\n );\n }\n }\n\n private checkHitSlop(): boolean {\n if (!this.config.hitSlop) {\n return true;\n }\n\n const width = this.view.getBoundingClientRect().width;\n const height = this.view.getBoundingClientRect().height;\n\n let left = 0;\n let top = 0;\n let right: number = width;\n let bottom: number = height;\n\n if (this.config.hitSlop.horizontal !== undefined) {\n left -= this.config.hitSlop.horizontal;\n right += this.config.hitSlop.horizontal;\n }\n\n if (this.config.hitSlop.vertical !== undefined) {\n top -= this.config.hitSlop.vertical;\n bottom += this.config.hitSlop.vertical;\n }\n\n if (this.config.hitSlop.left !== undefined) {\n left = -this.config.hitSlop.left;\n }\n\n if (this.config.hitSlop.right !== undefined) {\n right = width + this.config.hitSlop.right;\n }\n\n if (this.config.hitSlop.top !== undefined) {\n top = -this.config.hitSlop.top;\n }\n\n if (this.config.hitSlop.bottom !== undefined) {\n bottom = width + this.config.hitSlop.bottom;\n }\n if (this.config.hitSlop.width !== undefined) {\n if (this.config.hitSlop.left !== undefined) {\n right = left + this.config.hitSlop.width;\n } else if (this.config.hitSlop.right !== undefined) {\n left = right - this.config.hitSlop.width;\n }\n }\n\n if (this.config.hitSlop.height !== undefined) {\n if (this.config.hitSlop.top !== undefined) {\n bottom = top + this.config.hitSlop.height;\n } else if (this.config.hitSlop.bottom !== undefined) {\n top = bottom - this.config.hitSlop.height;\n }\n }\n\n const rect: DOMRect = this.view.getBoundingClientRect();\n const offsetX: number = this.tracker.getLastX() - rect.left;\n const offsetY: number = this.tracker.getLastY() - rect.top;\n\n if (\n offsetX >= left &&\n offsetX <= right &&\n offsetY >= top &&\n offsetY <= bottom\n ) {\n return true;\n }\n return false;\n }\n\n public isPointerInBounds({ x, y }: { x: number; y: number }): boolean {\n const rect: DOMRect = this.view.getBoundingClientRect();\n\n return (\n x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom\n );\n }\n\n protected resetConfig(): void {}\n\n //\n // Getters and setters\n //\n\n public getTag(): number {\n return this.handlerTag;\n }\n public setTag(tag: number): void {\n this.handlerTag = tag;\n }\n\n protected getConfig() {\n return this.config;\n }\n\n public getShouldEnableGestureOnSetup(): boolean {\n throw new Error('Must override GestureHandler.shouldEnableGestureOnSetup');\n }\n\n public getView(): HTMLElement {\n return this.view;\n }\n\n public getEventManagers(): EventManager[] {\n return this.eventManagers;\n }\n\n public getTracker(): PointerTracker {\n return this.tracker;\n }\n\n public getTrackedPointersID(): number[] {\n return this.tracker.getTrackedPointersID();\n }\n\n public getState(): State {\n return this.currentState;\n }\n\n public isEnabled(): boolean {\n return this.enabled;\n }\n\n protected setShouldCancelWhenOutside(shouldCancel: boolean) {\n this.shouldCancellWhenOutside = shouldCancel;\n }\n protected getShouldCancelWhenOutside(): boolean {\n return this.shouldCancellWhenOutside;\n }\n\n public getPointerType(): PointerType {\n return this.pointerType;\n }\n}\n\nfunction invokeNullableMethod(\n method:\n | ((event: ResultEvent | ResultTouchEvent) => void)\n | { __getHandler: () => (event: ResultEvent | ResultTouchEvent) => void }\n | { __nodeConfig: { argMapping: unknown[] } },\n event: ResultEvent | ResultTouchEvent\n): void {\n if (!method) {\n return;\n }\n\n if (typeof method === 'function') {\n method(event);\n return;\n }\n\n if ('__getHandler' in method && typeof method.__getHandler === 'function') {\n const handler = method.__getHandler();\n invokeNullableMethod(handler, event);\n return;\n }\n\n if (!('__nodeConfig' in method)) {\n return;\n }\n\n const { argMapping } = method.__nodeConfig;\n if (!Array.isArray(argMapping)) {\n return;\n }\n\n for (const [index, [key, value]] of argMapping.entries()) {\n if (!(key in event.nativeEvent)) {\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const nativeValue = event.nativeEvent[key];\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (value?.setValue) {\n //Reanimated API\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n value.setValue(nativeValue);\n } else {\n //RN Animated API\n method.__nodeConfig.argMapping[index] = [key, nativeValue];\n }\n }\n\n return;\n}\n"]}
|
@@ -126,7 +126,7 @@ class PointerTracker {
|
|
126
126
|
|
127
127
|
|
128
128
|
getLastX(pointerId) {
|
129
|
-
if (pointerId) {
|
129
|
+
if (pointerId !== undefined) {
|
130
130
|
var _this$trackedPointers3;
|
131
131
|
|
132
132
|
return (_this$trackedPointers3 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers3 === void 0 ? void 0 : _this$trackedPointers3.lastX;
|
@@ -142,7 +142,7 @@ class PointerTracker {
|
|
142
142
|
|
143
143
|
|
144
144
|
getLastY(pointerId) {
|
145
|
-
if (pointerId) {
|
145
|
+
if (pointerId !== undefined) {
|
146
146
|
var _this$trackedPointers5;
|
147
147
|
|
148
148
|
return (_this$trackedPointers5 = this.trackedPointers.get(pointerId)) === null || _this$trackedPointers5 === void 0 ? void 0 : _this$trackedPointers5.lastY;
|
@@ -1 +1 @@
|
|
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":";;;;;;;;;AAYA;AACA,MAAMA,eAAe,GAAG,GAAxB;AACA,MAAMC,YAAY,GAAG,EAArB;;AAEe,MAAMC,cAAN,CAAqB;AAY3BC,EAAAA,WAAW,GAAG;AAAA,6CAXkC,IAAIC,GAAJ,EAWlC;;AAAA,4CANyB,IAAIA,GAAJ,EAMzB;;AAAA;;AAAA,4CAF8B;AAAEC,MAAAA,CAAC,EAAE,CAAL;AAAQC,MAAAA,CAAC,EAAE;AAAX,KAE9B;;AACnB,SAAKC,kBAAL,GAA0BC,GAA1B;;AAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,YAApB,EAAkC,EAAEQ,CAApC,EAAuC;AACrC,WAAKC,cAAL,CAAoBC,GAApB,CAAwBF,CAAxB,EAA2BD,GAA3B;AACD;AACF;;AAEMI,EAAAA,YAAY,CAACC,KAAD,EAA4B;AAC7C,QAAI,KAAKC,eAAL,CAAqBC,GAArB,CAAyBF,KAAK,CAACG,SAA/B,CAAJ,EAA+C;AAC7C;AACD;;AAED,SAAKT,kBAAL,GAA0BM,KAAK,CAACG,SAAhC;AAEA,UAAMC,UAA0B,GAAG;AACjCC,MAAAA,KAAK,EAAEL,KAAK,CAACR,CADoB;AAEjCc,MAAAA,KAAK,EAAEN,KAAK,CAACP,CAFoB;AAGjCc,MAAAA,SAAS,EAAEP,KAAK,CAACQ,IAHgB;AAIjCC,MAAAA,SAAS,EAAE,CAJsB;AAKjCC,MAAAA,SAAS,EAAE;AALsB,KAAnC;AAQA,SAAKT,eAAL,CAAqBH,GAArB,CAAyBE,KAAK,CAACG,SAA/B,EAA0CC,UAA1C;AACA,SAAKO,eAAL,CAAqBX,KAAK,CAACG,SAA3B;AAEA,SAAKS,cAAL,GAAsB;AACpBpB,MAAAA,CAAC,EAAE,KAAKqB,WAAL,EADiB;AAEpBpB,MAAAA,CAAC,EAAE,KAAKqB,WAAL;AAFiB,KAAtB;AAID;;AAEMC,EAAAA,iBAAiB,CAACZ,SAAD,EAA0B;AAChD,SAAKF,eAAL,CAAqBe,MAArB,CAA4Bb,SAA5B;AACA,SAAKc,mBAAL,CAAyBd,SAAzB;AACD;;AAEMe,EAAAA,KAAK,CAAClB,KAAD,EAA4B;AACtC,UAAMmB,OAAuB,GAAG,KAAKlB,eAAL,CAAqBmB,GAArB,CAC9BpB,KAAK,CAACG,SADwB,CAAhC;;AAIA,QAAI,CAACgB,OAAL,EAAc;AACZ;AACD;;AAED,SAAKzB,kBAAL,GAA0BM,KAAK,CAACG,SAAhC;AAEA,UAAMkB,EAAE,GAAGrB,KAAK,CAACR,CAAN,GAAU2B,OAAO,CAACd,KAA7B;AACA,UAAMiB,EAAE,GAAGtB,KAAK,CAACP,CAAN,GAAU0B,OAAO,CAACb,KAA7B;AACA,UAAMiB,EAAE,GAAGvB,KAAK,CAACQ,IAAN,GAAaW,OAAO,CAACZ,SAAhC;AAEAY,IAAAA,OAAO,CAACV,SAAR,GAAqBY,EAAE,GAAGE,EAAN,GAAY,IAAZ,GAAmBpC,eAAvC;AACAgC,IAAAA,OAAO,CAACT,SAAR,GAAqBY,EAAE,GAAGC,EAAN,GAAY,IAAZ,GAAmBpC,eAAvC;AAEAgC,IAAAA,OAAO,CAACd,KAAR,GAAgBL,KAAK,CAACR,CAAtB;AACA2B,IAAAA,OAAO,CAACb,KAAR,GAAgBN,KAAK,CAACP,CAAtB;AAEA,SAAKQ,eAAL,CAAqBH,GAArB,CAAyBE,KAAK,CAACG,SAA/B,EAA0CgB,OAA1C;AAEA,UAAMK,IAAY,GAAG,KAAKX,WAAL,EAArB;AACA,UAAMY,IAAY,GAAG,KAAKX,WAAL,EAArB;AAEA,SAAKF,cAAL,GAAsB;AACpBpB,MAAAA,CAAC,EAAEgC,IADiB;AAEpB/B,MAAAA,CAAC,EAAEgC;AAFiB,KAAtB;AAID,GA/EiC,CAiFlC;;;AACQd,EAAAA,eAAe,CAACe,EAAD,EAAmB;AACxC,SAAK,MAAM,CAACC,QAAD,EAAWC,OAAX,CAAX,IAAkC,KAAK/B,cAAvC,EAAuD;AACrD,UAAIgC,KAAK,CAACD,OAAD,CAAT,EAAoB;AAClB,aAAK/B,cAAL,CAAoBC,GAApB,CAAwB6B,QAAxB,EAAkCD,EAAlC;AACA;AACD;AACF;AACF;;AAEOT,EAAAA,mBAAmB,CAACS,EAAD,EAAmB;AAC5C,UAAMC,QAAgB,GAAG,KAAKG,qBAAL,CAA2BJ,EAA3B,CAAzB;;AACA,QAAI,CAACG,KAAK,CAACF,QAAD,CAAV,EAAsB;AACpB,WAAK9B,cAAL,CAAoBC,GAApB,CAAwB6B,QAAxB,EAAkChC,GAAlC;AACD;AACF;;AAEMmC,EAAAA,qBAAqB,CAACC,YAAD,EAA+B;AACzD,SAAK,MAAM,CAACC,GAAD,EAAMC,KAAN,CAAX,IAA2B,KAAKpC,cAAL,CAAoBqC,OAApB,EAA3B,EAA0D;AACxD,UAAID,KAAK,KAAKF,YAAd,EAA4B;AAC1B,eAAOC,GAAP;AACD;AACF;;AAED,WAAOrC,GAAP;AACD;;AAEMwC,EAAAA,YAAY,CAAChC,SAAD,EAA4B;AAAA;;AAC7C,oCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,0DAAO,sBAAqCM,SAA5C;AACD;;AACM2B,EAAAA,YAAY,CAACjC,SAAD,EAA4B;AAAA;;AAC7C,qCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCO,SAA5C;AACD;AAED;AACF;AACA;;;AAWS2B,EAAAA,QAAQ,CAAClC,SAAD,EAA6B;AAC1C,QAAIA,SAAJ,EAAe;AAAA;;AACb,uCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCE,KAA5C;AACD,KAFD,MAEO;AAAA;;AACL,uCAAO,KAAKJ,eAAL,CAAqBmB,GAArB,CAAyB,KAAK1B,kBAA9B,CAAP,2DAAO,uBAAmDW,KAA1D;AACD;AACF;AAED;AACF;AACA;;;AAWSiC,EAAAA,QAAQ,CAACnC,SAAD,EAA6B;AAC1C,QAAIA,SAAJ,EAAe;AAAA;;AACb,uCAAO,KAAKF,eAAL,CAAqBmB,GAArB,CAAyBjB,SAAzB,CAAP,2DAAO,uBAAqCG,KAA5C;AACD,KAFD,MAEO;AAAA;;AACL,uCAAO,KAAKL,eAAL,CAAqBmB,GAArB,CAAyB,KAAK1B,kBAA9B,CAAP,2DAAO,uBAAmDY,KAA1D;AACD;AACF,GA3JiC,CA6JlC;AACA;AACA;AACA;;;AACOO,EAAAA,WAAW,GAAW;AAC3B,UAAMW,IAAY,GAAG,KAAKe,OAAL,KAAiB,KAAKtC,eAAL,CAAqBuC,IAA3D;AACA,WAAOX,KAAK,CAACL,IAAD,CAAL,GAAc,KAAKZ,cAAL,CAAoBpB,CAAlC,GAAsCgC,IAA7C;AACD;;AACMV,EAAAA,WAAW,GAAW;AAC3B,UAAMW,IAAY,GAAG,KAAKgB,OAAL,KAAiB,KAAKxC,eAAL,CAAqBuC,IAA3D;AACA,WAAOX,KAAK,CAACJ,IAAD,CAAL,GAAc,KAAKb,cAAL,CAAoBnB,CAAlC,GAAsCgC,IAA7C;AACD;;AACMc,EAAAA,OAAO,CAACG,cAAD,EAAkC;AAC9C,QAAIC,IAAI,GAAG,CAAX;AAEA,SAAK1C,eAAL,CAAqB2C,OAArB,CAA6B,CAACX,KAAD,EAAQD,GAAR,KAAgB;AAC3C,UAAIA,GAAG,KAAKU,cAAZ,EAA4B;AAC1BC,QAAAA,IAAI,IAAIV,KAAK,CAAC5B,KAAd;AACD;AACF,KAJD;AAMA,WAAOsC,IAAP;AACD;;AACMF,EAAAA,OAAO,CAACC,cAAD,EAAkC;AAC9C,QAAIG,IAAI,GAAG,CAAX;AAEA,SAAK5C,eAAL,CAAqB2C,OAArB,CAA6B,CAACX,KAAD,EAAQD,GAAR,KAAgB;AAC3C,UAAIA,GAAG,KAAKU,cAAZ,EAA4B;AAC1BG,QAAAA,IAAI,IAAIZ,KAAK,CAAC3B,KAAd;AACD;AACF,KAJD;AAMA,WAAOuC,IAAP;AACD;;AACMC,EAAAA,uBAAuB,GAAW;AACvC,WAAO,KAAK7C,eAAL,CAAqBuC,IAA5B;AACD;;AACMO,EAAAA,oBAAoB,GAAa;AACtC,UAAMC,IAAc,GAAG,EAAvB;AAEA,SAAK/C,eAAL,CAAqB2C,OAArB,CAA6B,CAACK,MAAD,EAASjB,GAAT,KAAiB;AAC5CgB,MAAAA,IAAI,CAACE,IAAL,CAAUlB,GAAV;AACD,KAFD;AAIA,WAAOgB,IAAP;AACD;;AAEMG,EAAAA,OAAO,GAAgC;AAC5C,WAAO,KAAKlD,eAAZ;AACD;;AAEMmD,EAAAA,YAAY,GAAS;AAC1B,SAAKnD,eAAL,CAAqBoD,KAArB;AACA,SAAK3D,kBAAL,GAA0BC,GAA1B;;AAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGR,YAApB,EAAkC,EAAEQ,CAApC,EAAuC;AACrC,WAAKC,cAAL,CAAoBC,GAApB,CAAwBF,CAAxB,EAA2BD,GAA3B;AACD;AACF;;AAEgC,SAAnB2D,mBAAmB,CAC/BC,UAD+B,EAE/BC,UAF+B,EAGtB;AACT,WAAOD,UAAU,CAACE,IAAX,CAAiBtD,SAAD,IAAeqD,UAAU,CAACE,QAAX,CAAoBvD,SAApB,CAA/B,CAAP;AACD;;AA9NiC","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"]}
|
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","undefined","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 !== undefined) {\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 !== undefined) {\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"]}
|
@@ -137,7 +137,7 @@ export default class GestureHandler {
|
|
137
137
|
return;
|
138
138
|
}
|
139
139
|
|
140
|
-
if (this.tracker.getTrackedPointersCount() > 0 && (newState === State.END || newState === State.CANCELLED || newState === State.FAILED)) {
|
140
|
+
if (this.tracker.getTrackedPointersCount() > 0 && this.config.needsPointerData && (newState === State.END || newState === State.CANCELLED || newState === State.FAILED)) {
|
141
141
|
this.cancelTouches();
|
142
142
|
}
|
143
143
|
|