react-native-gesture-handler 2.6.2 → 2.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. package/android/build.gradle +0 -8
  2. package/android/gradle.properties +1 -1
  3. package/android/lib/src/main/java/com/swmansion/gesturehandler/FlingGestureHandler.kt +7 -7
  4. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +46 -26
  5. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandlerOrchestrator.kt +76 -29
  6. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureUtils.kt +4 -6
  7. package/android/lib/src/main/java/com/swmansion/gesturehandler/LongPressGestureHandler.kt +6 -6
  8. package/android/lib/src/main/java/com/swmansion/gesturehandler/ManualGestureHandler.kt +1 -1
  9. package/android/lib/src/main/java/com/swmansion/gesturehandler/NativeViewGestureHandler.kt +1 -1
  10. package/android/lib/src/main/java/com/swmansion/gesturehandler/PanGestureHandler.kt +11 -11
  11. package/android/lib/src/main/java/com/swmansion/gesturehandler/PinchGestureHandler.kt +17 -9
  12. package/android/lib/src/main/java/com/swmansion/gesturehandler/RotationGestureHandler.kt +15 -8
  13. package/android/lib/src/main/java/com/swmansion/gesturehandler/TapGestureHandler.kt +10 -10
  14. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
  15. package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +1 -1
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +31 -12
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +2 -2
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +1 -1
  19. package/ios/RNGestureHandlerButtonComponentView.mm +4 -4
  20. package/lib/commonjs/handlers/gestures/GestureDetector.js +9 -2
  21. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  22. package/lib/commonjs/handlers/gestures/gestureComposition.js +15 -4
  23. package/lib/commonjs/handlers/gestures/gestureComposition.js.map +1 -1
  24. package/lib/commonjs/web/handlers/FlingGestureHandler.js +18 -14
  25. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  26. package/lib/commonjs/web/handlers/GestureHandler.js +8 -4
  27. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  28. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +2 -0
  29. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  30. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +1 -4
  31. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -2
  33. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  34. package/lib/commonjs/web/tools/PointerTracker.js +2 -2
  35. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  36. package/lib/module/handlers/gestures/GestureDetector.js +9 -2
  37. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  38. package/lib/module/handlers/gestures/gestureComposition.js +15 -4
  39. package/lib/module/handlers/gestures/gestureComposition.js.map +1 -1
  40. package/lib/module/web/handlers/FlingGestureHandler.js +18 -14
  41. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  42. package/lib/module/web/handlers/GestureHandler.js +8 -3
  43. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  44. package/lib/module/web/handlers/LongPressGestureHandler.js +2 -0
  45. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  46. package/lib/module/web/handlers/NativeViewGestureHandler.js +1 -4
  47. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  48. package/lib/module/web/handlers/PanGestureHandler.js +2 -2
  49. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  50. package/lib/module/web/tools/PointerTracker.js +2 -2
  51. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  52. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +1 -0
  53. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -0
  54. package/package.json +4 -8
  55. package/src/handlers/gestures/GestureDetector.tsx +10 -3
  56. package/src/handlers/gestures/gestureComposition.ts +19 -6
  57. package/src/web/handlers/FlingGestureHandler.ts +26 -17
  58. package/src/web/handlers/GestureHandler.ts +13 -6
  59. package/src/web/handlers/LongPressGestureHandler.ts +2 -0
  60. package/src/web/handlers/NativeViewGestureHandler.ts +1 -4
  61. package/src/web/handlers/PanGestureHandler.ts +2 -2
  62. package/src/web/tools/PointerTracker.ts +2 -2
  63. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  64. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +0 -19
@@ -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 = event.actionMasked
109
+ val action = sourceEvent.actionMasked
110
110
  if (state == STATE_UNDETERMINED) {
111
111
  offsetX = 0f
112
112
  offsetY = 0f
113
- startX = event.rawX
114
- startY = event.rawY
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(event, true)
120
- lastY = getLastPointerY(event, true)
119
+ lastX = getLastPointerX(sourceEvent, true)
120
+ lastY = getLastPointerY(sourceEvent, true)
121
121
  startX = lastX
122
122
  startY = lastY
123
123
  } else {
124
- lastX = getLastPointerX(event, true)
125
- lastY = getLastPointerY(event, true)
124
+ lastX = getLastPointerX(sourceEvent, true)
125
+ lastY = getLastPointerY(sourceEvent, true)
126
126
  }
127
- if (currentMaxNumberOfPointers < event.pointerCount) {
128
- currentMaxNumberOfPointers = event.pointerCount
127
+ if (currentMaxNumberOfPointers < sourceEvent.pointerCount) {
128
+ currentMaxNumberOfPointers = sourceEvent.pointerCount
129
129
  }
130
130
  if (shouldFail()) {
131
131
  fail()
@@ -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
- object ReanimatedEventDispatcher {
6
+ class ReanimatedEventDispatcher {
7
7
  fun <T : Event<T>>sendEvent(event: T, reactApplicationContext: ReactContext) {
8
8
  // no-op
9
9
  }
@@ -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
- object ReanimatedEventDispatcher {
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 (responder == null || responder === this) {
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 (responder == null) {
289
- responder = this
304
+ if (touchResponder == null) {
305
+ touchResponder = this
290
306
  return true
291
307
  }
292
308
  return if (exclusive) {
293
- responder === this
309
+ touchResponder === this
294
310
  } else {
295
- !(responder?.exclusive ?: false)
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 && responder?.exclusive != true && !isChildTouched()
354
+ val canBePressedAlongsideOther = !exclusive && touchResponder?.exclusive != true && !isChildTouched()
336
355
 
337
- if (!pressed || responder === this || canBePressedAlongsideOther) {
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 && responder === this) {
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 responder: ButtonViewGroup? = null
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 enqueuedRootViewInit: MutableList<Int> = ArrayList()
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
- ReanimatedEventDispatcher.sendEvent(event, reactApplicationContext)
596
+ reanimatedEventDispatcher.sendEvent(event, reactApplicationContext)
597
597
  } else {
598
598
  // In the old architecture, Reanimated subscribes for specific direct events.
599
599
  sendEventForDirectEvent(event)
@@ -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/rngesturehandler/ComponentDescriptors.h>
9
- #import <react/renderer/components/rngesturehandler/EventEmitters.h>
10
- #import <react/renderer/components/rngesturehandler/Props.h>
11
- #import <react/renderer/components/rngesturehandler/RCTComponentViewHelpers.h>
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
 
@@ -174,7 +174,7 @@ function attachHandlers({
174
174
  }
175
175
  }
176
176
 
177
- function updateHandlers(preparedGesture, gestureConfig, gesture) {
177
+ function updateHandlers(preparedGesture, gestureConfig, gesture, mountedRef) {
178
178
  gestureConfig === null || gestureConfig === void 0 ? void 0 : gestureConfig.prepare();
179
179
 
180
180
  for (let i = 0; i < gesture.length; i++) {
@@ -192,6 +192,10 @@ function updateHandlers(preparedGesture, gestureConfig, gesture) {
192
192
 
193
193
 
194
194
  setImmediate(() => {
195
+ if (!mountedRef.current) {
196
+ return;
197
+ }
198
+
195
199
  for (let i = 0; i < gesture.length; i++) {
196
200
  const handler = preparedGesture.config[i];
197
201
  handler.config = gesture[i].config;
@@ -461,6 +465,7 @@ const GestureDetector = props => {
461
465
  const useReanimatedHook = gesture.some(g => g.shouldUseReanimated);
462
466
  const viewRef = (0, _react.useRef)(null);
463
467
  const firstRenderRef = (0, _react.useRef)(true);
468
+ const mountedRef = (0, _react.useRef)(false);
464
469
  const webEventHandlersRef = (0, _react.useRef)({
465
470
  onGestureHandlerEvent: e => {
466
471
  (0, _eventReceiver.onGestureHandlerEvent)(e.nativeEvent);
@@ -500,6 +505,7 @@ const GestureDetector = props => {
500
505
 
501
506
  (0, _react.useEffect)(() => {
502
507
  firstRenderRef.current = true;
508
+ mountedRef.current = true;
503
509
  const viewTag = (0, _gestureHandlerCommon.findNodeHandle)(viewRef.current);
504
510
  validateDetectorChildren(viewRef.current);
505
511
  attachHandlers({
@@ -510,6 +516,7 @@ const GestureDetector = props => {
510
516
  webEventHandlersRef
511
517
  });
512
518
  return () => {
519
+ mountedRef.current = false;
513
520
  dropHandlers(preparedGesture);
514
521
  };
515
522
  }, []);
@@ -528,7 +535,7 @@ const GestureDetector = props => {
528
535
  webEventHandlersRef
529
536
  });
530
537
  } else {
531
- updateHandlers(preparedGesture, gestureConfig, gesture);
538
+ updateHandlers(preparedGesture, gestureConfig, gesture, mountedRef);
532
539
  }
533
540
  } else {
534
541
  firstRenderRef.current = false;
@@ -1 +1 @@
1
- {"version":3,"sources":["GestureDetector.tsx"],"names":["ALLOWED_PROPS","baseGestureHandlerWithMonitorProps","tapGestureHandlerProps","panGestureHandlerProps","panGestureHandlerCustomNativeProps","longPressGestureHandlerProps","forceTouchGestureHandlerProps","flingGestureHandlerProps","convertToHandlerTag","ref","BaseGesture","handlerTag","current","extractValidHandlerTags","interactionGroup","map","filter","tag","dropHandlers","preparedGesture","handler","config","RNGestureHandlerModule","dropGestureHandler","testId","checkGestureCallbacksForWorklets","gesture","runOnJS","areSomeNotWorklets","handlers","isWorklet","includes","areSomeWorklets","console","error","attachHandlers","gestureConfig","viewTag","webEventHandlersRef","firstExecution","initialize","setImmediate","prepare","createGestureHandler","handlerName","requireToFail","simultaneousWith","updateGestureHandler","simultaneousHandlers","waitFor","actionType","shouldUseReanimated","ActionType","REANIMATED_WORKLET","JS_FUNCTION_NEW_API","Platform","OS","attachGestureHandler","JS_FUNCTION_OLD_API","animatedHandlers","isAnimatedGesture","g","value","updateHandlers","i","length","previousHandlersValue","newHandlersValue","shouldUpdateSharedValue","gestureId","needsToReattach","isStateChangeEvent","event","oldState","isTouchEvent","eventType","getHandler","type","CALLBACK_TYPE","BEGAN","onBegin","START","onStart","UPDATE","onUpdate","CHANGE","onChange","END","onEnd","FINALIZE","onFinalize","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","touchEventTypeToCallbackType","TouchEventType","UNDEFINED","runWorklet","args","warn","useAnimatedGesture","needsRebuild","Reanimated","sharedHandlersCallbacks","useSharedValue","lastUpdateEvent","stateControllers","callback","currentCallback","State","UNDETERMINED","state","ACTIVE","undefined","FAILED","CANCELLED","GestureStateManager","create","changeEventCalculator","useEvent","animatedEventHandler","validateDetectorChildren","__DEV__","wrapType","REACT_NATIVE_VERSION","minor","major","_reactInternals","elementType","_reactInternalFiber","instance","RNRenderer","findHostInstance_DEPRECATED","_internalFiberInstanceHandleDEV","sibling","Error","return","GestureDetector","props","toGestureArray","useReanimatedHook","some","viewRef","firstRenderRef","onGestureHandlerEvent","e","nativeEvent","onGestureHandlerStateChange","React","useRef","needsToRebuildReanimatedEvent","refFunction","node","global","isFormsStackingContext","children","Wrap","Component","render","child","Children","only","cloneElement","collapsable","AnimatedWrap","default","createAnimatedComponent"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport {\n GestureType,\n HandlerCallbacks,\n BaseGesture,\n GestureRef,\n CALLBACK_TYPE,\n} from './gesture';\nimport { Reanimated, SharedValue } from './reanimatedWrapper';\nimport { registerHandler, unregisterHandler } from '../handlersRegistry';\nimport RNGestureHandlerModule from '../../RNGestureHandlerModule';\nimport {\n baseGestureHandlerWithMonitorProps,\n filterConfig,\n findNodeHandle,\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n HandlerStateChangeEvent,\n scheduleFlushOperations,\n} from '../gestureHandlerCommon';\nimport {\n GestureStateManager,\n GestureStateManagerType,\n} from './gestureStateManager';\nimport { flingGestureHandlerProps } from '../FlingGestureHandler';\nimport { forceTouchGestureHandlerProps } from '../ForceTouchGestureHandler';\nimport { longPressGestureHandlerProps } from '../LongPressGestureHandler';\nimport {\n panGestureHandlerProps,\n panGestureHandlerCustomNativeProps,\n} from '../PanGestureHandler';\nimport { tapGestureHandlerProps } from '../TapGestureHandler';\nimport { State } from '../../State';\nimport { TouchEventType } from '../../TouchEventType';\nimport { ComposedGesture } from './gestureComposition';\nimport { ActionType } from '../../ActionType';\nimport { isFabric, REACT_NATIVE_VERSION, tagMessage } from '../../utils';\nimport { getShadowNodeFromRef } from '../../getShadowNodeFromRef';\nimport { Platform } from 'react-native';\nimport type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';\nimport { onGestureHandlerEvent } from './eventReceiver';\nimport { RNRenderer } from '../../RNRenderer';\nimport { isExperimentalWebImplementationEnabled } from '../../EnableExperimentalWebImplementation';\n\ndeclare const global: {\n isFormsStackingContext: (node: unknown) => boolean | null; // JSI function\n};\n\nconst ALLOWED_PROPS = [\n ...baseGestureHandlerWithMonitorProps,\n ...tapGestureHandlerProps,\n ...panGestureHandlerProps,\n ...panGestureHandlerCustomNativeProps,\n ...longPressGestureHandlerProps,\n ...forceTouchGestureHandlerProps,\n ...flingGestureHandlerProps,\n];\n\nexport type GestureConfigReference = {\n config: GestureType[];\n animatedEventHandler: unknown;\n animatedHandlers: SharedValue<\n HandlerCallbacks<Record<string, unknown>>[] | null\n > | null;\n firstExecution: boolean;\n useReanimatedHook: boolean;\n};\n\nfunction convertToHandlerTag(ref: GestureRef): number {\n if (typeof ref === 'number') {\n return ref;\n } else if (ref instanceof BaseGesture) {\n return ref.handlerTag;\n } else {\n // @ts-ignore in this case it should be a ref either to gesture object or\n // a gesture handler component, in both cases handlerTag property exists\n return ref.current?.handlerTag ?? -1;\n }\n}\n\nfunction extractValidHandlerTags(interactionGroup: GestureRef[] | undefined) {\n return (\n interactionGroup?.map(convertToHandlerTag)?.filter((tag) => tag > 0) ?? []\n );\n}\n\nfunction dropHandlers(preparedGesture: GestureConfigReference) {\n for (const handler of preparedGesture.config) {\n RNGestureHandlerModule.dropGestureHandler(handler.handlerTag);\n\n unregisterHandler(handler.handlerTag, handler.config.testId);\n }\n\n scheduleFlushOperations();\n}\n\nfunction checkGestureCallbacksForWorklets(gesture: GestureType) {\n // if a gesture is explicitly marked to run on the JS thread there is no need to check\n // if callbacks are worklets as the user is aware they will be ran on the JS thread\n if (gesture.config.runOnJS) {\n return;\n }\n\n const areSomeNotWorklets = gesture.handlers.isWorklet.includes(false);\n const areSomeWorklets = gesture.handlers.isWorklet.includes(true);\n\n // if some of the callbacks are worklets and some are not, and the gesture is not\n // explicitly marked with `.runOnJS(true)` show an error\n if (areSomeNotWorklets && areSomeWorklets) {\n console.error(\n tagMessage(\n `Some of the callbacks in the gesture are worklets and some are not. Either make sure that all calbacks are marked as 'worklet' if you wish to run them on the UI thread or use '.runOnJS(true)' modifier on the gesture explicitly to run all callbacks on the JS thread.`\n )\n );\n }\n}\n\ninterface WebEventHandler {\n onGestureHandlerEvent: (event: HandlerStateChangeEvent<unknown>) => void;\n onGestureHandlerStateChange?: (\n event: HandlerStateChangeEvent<unknown>\n ) => void;\n}\n\ninterface AttachHandlersConfig {\n preparedGesture: GestureConfigReference;\n gestureConfig: ComposedGesture | GestureType | undefined;\n gesture: GestureType[];\n viewTag: number;\n webEventHandlersRef: React.RefObject<WebEventHandler>;\n}\n\nfunction attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n}: AttachHandlersConfig) {\n if (!preparedGesture.firstExecution) {\n gestureConfig?.initialize();\n } else {\n preparedGesture.firstExecution = false;\n }\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\n gestureConfig?.prepare();\n });\n\n for (const handler of gesture) {\n checkGestureCallbacksForWorklets(handler);\n RNGestureHandlerModule.createGestureHandler(\n handler.handlerName,\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS)\n );\n\n registerHandler(handler.handlerTag, handler, handler.config.testId);\n }\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\n for (const handler of gesture) {\n let requireToFail: number[] = [];\n if (handler.config.requireToFail) {\n requireToFail = extractValidHandlerTags(handler.config.requireToFail);\n }\n\n let simultaneousWith: number[] = [];\n if (handler.config.simultaneousWith) {\n simultaneousWith = extractValidHandlerTags(\n handler.config.simultaneousWith\n );\n }\n\n RNGestureHandlerModule.updateGestureHandler(\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS, {\n simultaneousHandlers: simultaneousWith,\n waitFor: requireToFail,\n })\n );\n }\n\n scheduleFlushOperations();\n });\n\n preparedGesture.config = gesture;\n\n for (const gesture of preparedGesture.config) {\n const actionType = gesture.shouldUseReanimated\n ? ActionType.REANIMATED_WORKLET\n : ActionType.JS_FUNCTION_NEW_API;\n\n if (Platform.OS === 'web') {\n (RNGestureHandlerModule.attachGestureHandler as typeof RNGestureHandlerModuleWeb.attachGestureHandler)(\n gesture.handlerTag,\n viewTag,\n ActionType.JS_FUNCTION_OLD_API, // ignored on web\n webEventHandlersRef\n );\n } else {\n RNGestureHandlerModule.attachGestureHandler(\n gesture.handlerTag,\n viewTag,\n actionType\n );\n }\n }\n\n if (preparedGesture.animatedHandlers) {\n const isAnimatedGesture = (g: GestureType) => g.shouldUseReanimated;\n\n preparedGesture.animatedHandlers.value = (gesture\n .filter(isAnimatedGesture)\n .map((g) => g.handlers) as unknown) as HandlerCallbacks<\n Record<string, unknown>\n >[];\n }\n}\n\nfunction updateHandlers(\n preparedGesture: GestureConfigReference,\n gestureConfig: ComposedGesture | GestureType | undefined,\n gesture: GestureType[]\n) {\n gestureConfig?.prepare();\n\n for (let i = 0; i < gesture.length; i++) {\n const handler = preparedGesture.config[i];\n checkGestureCallbacksForWorklets(handler);\n\n // only update handlerTag when it's actually different, it may be the same\n // if gesture config object is wrapped with useMemo\n if (gesture[i].handlerTag !== handler.handlerTag) {\n gesture[i].handlerTag = handler.handlerTag;\n gesture[i].handlers.handlerTag = handler.handlerTag;\n }\n }\n\n // use setImmediate to extract handlerTags, because when it's ran, all refs should be updated\n // and handlerTags in BaseGesture references should be updated in the loop above (we need to wait\n // in case of external relations)\n setImmediate(() => {\n for (let i = 0; i < gesture.length; i++) {\n const handler = preparedGesture.config[i];\n\n handler.config = gesture[i].config;\n handler.handlers = gesture[i].handlers;\n\n const requireToFail = extractValidHandlerTags(\n handler.config.requireToFail\n );\n\n const simultaneousWith = extractValidHandlerTags(\n handler.config.simultaneousWith\n );\n\n RNGestureHandlerModule.updateGestureHandler(\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS, {\n simultaneousHandlers: simultaneousWith,\n waitFor: requireToFail,\n })\n );\n\n registerHandler(handler.handlerTag, handler, handler.config.testId);\n }\n\n if (preparedGesture.animatedHandlers) {\n const previousHandlersValue =\n preparedGesture.animatedHandlers.value ?? [];\n const newHandlersValue = (preparedGesture.config\n .filter((g) => g.shouldUseReanimated) // ignore gestures that shouldn't run on UI\n .map((g) => g.handlers) as unknown) as HandlerCallbacks<\n Record<string, unknown>\n >[];\n\n // if amount of gesture configs changes, we need to update the callbacks in shared value\n let shouldUpdateSharedValue =\n previousHandlersValue.length !== newHandlersValue.length;\n\n if (!shouldUpdateSharedValue) {\n // if the amount is the same, we need to check if any of the configs inside has changed\n for (let i = 0; i < newHandlersValue.length; i++) {\n if (\n // we can use the `gestureId` prop as it's unique for every config instance\n newHandlersValue[i].gestureId !== previousHandlersValue[i].gestureId\n ) {\n shouldUpdateSharedValue = true;\n break;\n }\n }\n }\n\n if (shouldUpdateSharedValue) {\n preparedGesture.animatedHandlers.value = newHandlersValue;\n }\n }\n\n scheduleFlushOperations();\n });\n}\n\nfunction needsToReattach(\n preparedGesture: GestureConfigReference,\n gesture: GestureType[]\n) {\n if (gesture.length !== preparedGesture.config.length) {\n return true;\n }\n for (let i = 0; i < gesture.length; i++) {\n if (\n gesture[i].handlerName !== preparedGesture.config[i].handlerName ||\n gesture[i].shouldUseReanimated !==\n preparedGesture.config[i].shouldUseReanimated\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isStateChangeEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureStateChangeEvent {\n 'worklet';\n // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point\n return event.oldState != null;\n}\n\nfunction isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureTouchEvent {\n 'worklet';\n return event.eventType != null;\n}\n\nfunction getHandler(\n type: CALLBACK_TYPE,\n gesture: HandlerCallbacks<Record<string, unknown>>\n) {\n 'worklet';\n switch (type) {\n case CALLBACK_TYPE.BEGAN:\n return gesture.onBegin;\n case CALLBACK_TYPE.START:\n return gesture.onStart;\n case CALLBACK_TYPE.UPDATE:\n return gesture.onUpdate;\n case CALLBACK_TYPE.CHANGE:\n return gesture.onChange;\n case CALLBACK_TYPE.END:\n return gesture.onEnd;\n case CALLBACK_TYPE.FINALIZE:\n return gesture.onFinalize;\n case CALLBACK_TYPE.TOUCHES_DOWN:\n return gesture.onTouchesDown;\n case CALLBACK_TYPE.TOUCHES_MOVE:\n return gesture.onTouchesMove;\n case CALLBACK_TYPE.TOUCHES_UP:\n return gesture.onTouchesUp;\n case CALLBACK_TYPE.TOUCHES_CANCELLED:\n return gesture.onTouchesCancelled;\n }\n}\n\nfunction touchEventTypeToCallbackType(\n eventType: TouchEventType\n): CALLBACK_TYPE {\n 'worklet';\n switch (eventType) {\n case TouchEventType.TOUCHES_DOWN:\n return CALLBACK_TYPE.TOUCHES_DOWN;\n case TouchEventType.TOUCHES_MOVE:\n return CALLBACK_TYPE.TOUCHES_MOVE;\n case TouchEventType.TOUCHES_UP:\n return CALLBACK_TYPE.TOUCHES_UP;\n case TouchEventType.TOUCHES_CANCELLED:\n return CALLBACK_TYPE.TOUCHES_CANCELLED;\n }\n return CALLBACK_TYPE.UNDEFINED;\n}\n\nfunction runWorklet(\n type: CALLBACK_TYPE,\n gesture: HandlerCallbacks<Record<string, unknown>>,\n event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,\n ...args: any[]\n) {\n 'worklet';\n const handler = getHandler(type, gesture);\n if (gesture.isWorklet[type]) {\n // @ts-ignore Logic below makes sure the correct event is send to the\n // correct handler.\n handler?.(event, ...args);\n } else if (handler) {\n console.warn(tagMessage('Animated gesture callback must be a worklet'));\n }\n}\n\nfunction useAnimatedGesture(\n preparedGesture: GestureConfigReference,\n needsRebuild: boolean\n) {\n if (!Reanimated) {\n return;\n }\n\n // Hooks are called conditionally, but the condition is whether the\n // react-native-reanimated is installed, which shouldn't change while running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const sharedHandlersCallbacks = Reanimated.useSharedValue<\n HandlerCallbacks<Record<string, unknown>>[] | null\n >(null);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const lastUpdateEvent = Reanimated.useSharedValue<\n (GestureUpdateEvent | undefined)[]\n >([]);\n\n // not every gesture needs a state controller, init them lazily\n const stateControllers: GestureStateManagerType[] = [];\n\n const callback = (\n event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent\n ) => {\n 'worklet';\n\n const currentCallback = sharedHandlersCallbacks.value;\n if (!currentCallback) {\n return;\n }\n\n for (let i = 0; i < currentCallback.length; i++) {\n const gesture = currentCallback[i];\n\n if (event.handlerTag === gesture.handlerTag) {\n if (isStateChangeEvent(event)) {\n if (\n event.oldState === State.UNDETERMINED &&\n event.state === State.BEGAN\n ) {\n runWorklet(CALLBACK_TYPE.BEGAN, gesture, event);\n } else if (\n (event.oldState === State.BEGAN ||\n event.oldState === State.UNDETERMINED) &&\n event.state === State.ACTIVE\n ) {\n runWorklet(CALLBACK_TYPE.START, gesture, event);\n lastUpdateEvent.value[gesture.handlerTag] = undefined;\n } else if (\n event.oldState !== event.state &&\n event.state === State.END\n ) {\n if (event.oldState === State.ACTIVE) {\n runWorklet(CALLBACK_TYPE.END, gesture, event, true);\n }\n runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, true);\n } else if (\n (event.state === State.FAILED || event.state === State.CANCELLED) &&\n event.state !== event.oldState\n ) {\n if (event.oldState === State.ACTIVE) {\n runWorklet(CALLBACK_TYPE.END, gesture, event, false);\n }\n runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, false);\n }\n } else if (isTouchEvent(event)) {\n if (!stateControllers[i]) {\n stateControllers[i] = GestureStateManager.create(event.handlerTag);\n }\n\n if (event.eventType !== TouchEventType.UNDETERMINED) {\n runWorklet(\n touchEventTypeToCallbackType(event.eventType),\n gesture,\n event,\n stateControllers[i]\n );\n }\n } else {\n runWorklet(CALLBACK_TYPE.UPDATE, gesture, event);\n\n if (gesture.onChange && gesture.changeEventCalculator) {\n runWorklet(\n CALLBACK_TYPE.CHANGE,\n gesture,\n gesture.changeEventCalculator?.(\n event,\n lastUpdateEvent.value[gesture.handlerTag]\n )\n );\n\n lastUpdateEvent.value[gesture.handlerTag] = event;\n }\n }\n }\n }\n };\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const event = Reanimated.useEvent(\n callback,\n ['onGestureHandlerStateChange', 'onGestureHandlerEvent'],\n needsRebuild\n );\n\n preparedGesture.animatedEventHandler = event;\n preparedGesture.animatedHandlers = sharedHandlersCallbacks;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction validateDetectorChildren(ref: any) {\n // finds the first native view under the Wrap component and traverses the fiber tree upwards\n // to check whether there is more than one native view as a pseudo-direct child of GestureDetector\n // i.e. this is not ok:\n // Wrap\n // |\n // / \\\n // / \\\n // / \\\n // / \\\n // NativeView NativeView\n //\n // but this is fine:\n // Wrap\n // |\n // NativeView\n // |\n // / \\\n // / \\\n // / \\\n // / \\\n // NativeView NativeView\n if (__DEV__ && Platform.OS !== 'web') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const wrapType =\n REACT_NATIVE_VERSION.minor > 63 || REACT_NATIVE_VERSION.major > 0\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ref._reactInternals.elementType\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ref._reactInternalFiber.elementType;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n let instance = RNRenderer.findHostInstance_DEPRECATED(ref)\n ._internalFiberInstanceHandleDEV;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n while (instance && instance.elementType !== wrapType) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (instance.sibling) {\n throw new Error(\n 'GestureDetector has more than one native view as its children. This can happen if you are using a custom component that renders multiple views, like React.Fragment. You should wrap content of GestureDetector with a <View> or <Animated.View>.'\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n instance = instance.return;\n }\n }\n}\n\ninterface GestureDetectorProps {\n gesture?: ComposedGesture | GestureType;\n children?: React.ReactNode;\n}\nexport const GestureDetector = (props: GestureDetectorProps) => {\n const gestureConfig = props.gesture;\n const gesture = gestureConfig?.toGestureArray?.() ?? [];\n const useReanimatedHook = gesture.some((g) => g.shouldUseReanimated);\n const viewRef = useRef(null);\n const firstRenderRef = useRef(true);\n const webEventHandlersRef = useRef<WebEventHandler>({\n onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {\n onGestureHandlerEvent(e.nativeEvent);\n },\n onGestureHandlerStateChange: isExperimentalWebImplementationEnabled()\n ? (e: HandlerStateChangeEvent<unknown>) => {\n onGestureHandlerEvent(e.nativeEvent);\n }\n : undefined,\n });\n\n const preparedGesture = React.useRef<GestureConfigReference>({\n config: gesture,\n animatedEventHandler: null,\n animatedHandlers: null,\n firstExecution: true,\n useReanimatedHook: useReanimatedHook,\n }).current;\n\n if (useReanimatedHook !== preparedGesture.useReanimatedHook) {\n throw new Error(\n tagMessage(\n 'You cannot change the thread the callbacks are ran on while the app is running'\n )\n );\n }\n\n // Reanimated event should be rebuilt only when gestures are reattached, otherwise\n // config update will be enough as all necessary items are stored in shared values anyway\n const needsToRebuildReanimatedEvent =\n preparedGesture.firstExecution || needsToReattach(preparedGesture, gesture);\n\n if (preparedGesture.firstExecution) {\n gestureConfig?.initialize?.();\n }\n\n if (useReanimatedHook) {\n // Whether animatedGesture or gesture is used shouldn't change while the app is running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useAnimatedGesture(preparedGesture, needsToRebuildReanimatedEvent);\n }\n\n useEffect(() => {\n firstRenderRef.current = true;\n const viewTag = findNodeHandle(viewRef.current) as number;\n\n validateDetectorChildren(viewRef.current);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n });\n\n return () => {\n dropHandlers(preparedGesture);\n };\n }, []);\n\n useEffect(() => {\n if (!firstRenderRef.current) {\n const viewTag = findNodeHandle(viewRef.current) as number;\n\n if (needsToReattach(preparedGesture, gesture)) {\n validateDetectorChildren(viewRef.current);\n dropHandlers(preparedGesture);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n });\n } else {\n updateHandlers(preparedGesture, gestureConfig, gesture);\n }\n } else {\n firstRenderRef.current = false;\n }\n }, [props]);\n\n const refFunction = (ref: unknown) => {\n if (ref !== null) {\n //@ts-ignore Just setting the ref\n viewRef.current = ref;\n\n if (isFabric()) {\n const node = getShadowNodeFromRef(ref);\n if (global.isFormsStackingContext(node) === false) {\n console.error(\n tagMessage(\n 'GestureDetector has received a child that may get view-flattened. ' +\n '\\nTo prevent it from misbehaving you need to wrap the child with a `<View collapsable={false}>`.'\n )\n );\n }\n }\n }\n };\n\n if (useReanimatedHook) {\n return (\n <AnimatedWrap\n ref={refFunction}\n onGestureHandlerEvent={preparedGesture.animatedEventHandler}>\n {props.children}\n </AnimatedWrap>\n );\n } else {\n return <Wrap ref={refFunction}>{props.children}</Wrap>;\n }\n};\n\nclass Wrap extends React.Component<{\n onGestureHandlerEvent?: unknown;\n // implicit `children` prop has been removed in @types/react^18.0.0\n children?: React.ReactNode;\n}> {\n render() {\n try {\n // I don't think that fighting with types over such a simple function is worth it\n // The only thing it does is add 'collapsable: false' to the child component\n // to make sure it is in the native view hierarchy so the detector can find\n // correct viewTag to attach to.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const child: any = React.Children.only(this.props.children);\n return React.cloneElement(\n child,\n { collapsable: false },\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n child.props.children\n );\n } catch (e) {\n throw new Error(\n tagMessage(\n `GestureDetector got more than one view as a child. If you want the gesture to work on multiple views, wrap them with a common parent and attach the gesture to that view.`\n )\n );\n }\n }\n}\n\nconst AnimatedWrap = Reanimated?.default?.createAnimatedComponent(Wrap) ?? Wrap;\n"]}
1
+ {"version":3,"sources":["GestureDetector.tsx"],"names":["ALLOWED_PROPS","baseGestureHandlerWithMonitorProps","tapGestureHandlerProps","panGestureHandlerProps","panGestureHandlerCustomNativeProps","longPressGestureHandlerProps","forceTouchGestureHandlerProps","flingGestureHandlerProps","convertToHandlerTag","ref","BaseGesture","handlerTag","current","extractValidHandlerTags","interactionGroup","map","filter","tag","dropHandlers","preparedGesture","handler","config","RNGestureHandlerModule","dropGestureHandler","testId","checkGestureCallbacksForWorklets","gesture","runOnJS","areSomeNotWorklets","handlers","isWorklet","includes","areSomeWorklets","console","error","attachHandlers","gestureConfig","viewTag","webEventHandlersRef","firstExecution","initialize","setImmediate","prepare","createGestureHandler","handlerName","requireToFail","simultaneousWith","updateGestureHandler","simultaneousHandlers","waitFor","actionType","shouldUseReanimated","ActionType","REANIMATED_WORKLET","JS_FUNCTION_NEW_API","Platform","OS","attachGestureHandler","JS_FUNCTION_OLD_API","animatedHandlers","isAnimatedGesture","g","value","updateHandlers","mountedRef","i","length","previousHandlersValue","newHandlersValue","shouldUpdateSharedValue","gestureId","needsToReattach","isStateChangeEvent","event","oldState","isTouchEvent","eventType","getHandler","type","CALLBACK_TYPE","BEGAN","onBegin","START","onStart","UPDATE","onUpdate","CHANGE","onChange","END","onEnd","FINALIZE","onFinalize","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","touchEventTypeToCallbackType","TouchEventType","UNDEFINED","runWorklet","args","warn","useAnimatedGesture","needsRebuild","Reanimated","sharedHandlersCallbacks","useSharedValue","lastUpdateEvent","stateControllers","callback","currentCallback","State","UNDETERMINED","state","ACTIVE","undefined","FAILED","CANCELLED","GestureStateManager","create","changeEventCalculator","useEvent","animatedEventHandler","validateDetectorChildren","__DEV__","wrapType","REACT_NATIVE_VERSION","minor","major","_reactInternals","elementType","_reactInternalFiber","instance","RNRenderer","findHostInstance_DEPRECATED","_internalFiberInstanceHandleDEV","sibling","Error","return","GestureDetector","props","toGestureArray","useReanimatedHook","some","viewRef","firstRenderRef","onGestureHandlerEvent","e","nativeEvent","onGestureHandlerStateChange","React","useRef","needsToRebuildReanimatedEvent","refFunction","node","global","isFormsStackingContext","children","Wrap","Component","render","child","Children","only","cloneElement","collapsable","AnimatedWrap","default","createAnimatedComponent"],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, RefObject } from 'react';\nimport {\n GestureType,\n HandlerCallbacks,\n BaseGesture,\n GestureRef,\n CALLBACK_TYPE,\n} from './gesture';\nimport { Reanimated, SharedValue } from './reanimatedWrapper';\nimport { registerHandler, unregisterHandler } from '../handlersRegistry';\nimport RNGestureHandlerModule from '../../RNGestureHandlerModule';\nimport {\n baseGestureHandlerWithMonitorProps,\n filterConfig,\n findNodeHandle,\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n HandlerStateChangeEvent,\n scheduleFlushOperations,\n} from '../gestureHandlerCommon';\nimport {\n GestureStateManager,\n GestureStateManagerType,\n} from './gestureStateManager';\nimport { flingGestureHandlerProps } from '../FlingGestureHandler';\nimport { forceTouchGestureHandlerProps } from '../ForceTouchGestureHandler';\nimport { longPressGestureHandlerProps } from '../LongPressGestureHandler';\nimport {\n panGestureHandlerProps,\n panGestureHandlerCustomNativeProps,\n} from '../PanGestureHandler';\nimport { tapGestureHandlerProps } from '../TapGestureHandler';\nimport { State } from '../../State';\nimport { TouchEventType } from '../../TouchEventType';\nimport { ComposedGesture } from './gestureComposition';\nimport { ActionType } from '../../ActionType';\nimport { isFabric, REACT_NATIVE_VERSION, tagMessage } from '../../utils';\nimport { getShadowNodeFromRef } from '../../getShadowNodeFromRef';\nimport { Platform } from 'react-native';\nimport type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';\nimport { onGestureHandlerEvent } from './eventReceiver';\nimport { RNRenderer } from '../../RNRenderer';\nimport { isExperimentalWebImplementationEnabled } from '../../EnableExperimentalWebImplementation';\n\ndeclare const global: {\n isFormsStackingContext: (node: unknown) => boolean | null; // JSI function\n};\n\nconst ALLOWED_PROPS = [\n ...baseGestureHandlerWithMonitorProps,\n ...tapGestureHandlerProps,\n ...panGestureHandlerProps,\n ...panGestureHandlerCustomNativeProps,\n ...longPressGestureHandlerProps,\n ...forceTouchGestureHandlerProps,\n ...flingGestureHandlerProps,\n];\n\nexport type GestureConfigReference = {\n config: GestureType[];\n animatedEventHandler: unknown;\n animatedHandlers: SharedValue<\n HandlerCallbacks<Record<string, unknown>>[] | null\n > | null;\n firstExecution: boolean;\n useReanimatedHook: boolean;\n};\n\nfunction convertToHandlerTag(ref: GestureRef): number {\n if (typeof ref === 'number') {\n return ref;\n } else if (ref instanceof BaseGesture) {\n return ref.handlerTag;\n } else {\n // @ts-ignore in this case it should be a ref either to gesture object or\n // a gesture handler component, in both cases handlerTag property exists\n return ref.current?.handlerTag ?? -1;\n }\n}\n\nfunction extractValidHandlerTags(interactionGroup: GestureRef[] | undefined) {\n return (\n interactionGroup?.map(convertToHandlerTag)?.filter((tag) => tag > 0) ?? []\n );\n}\n\nfunction dropHandlers(preparedGesture: GestureConfigReference) {\n for (const handler of preparedGesture.config) {\n RNGestureHandlerModule.dropGestureHandler(handler.handlerTag);\n\n unregisterHandler(handler.handlerTag, handler.config.testId);\n }\n\n scheduleFlushOperations();\n}\n\nfunction checkGestureCallbacksForWorklets(gesture: GestureType) {\n // if a gesture is explicitly marked to run on the JS thread there is no need to check\n // if callbacks are worklets as the user is aware they will be ran on the JS thread\n if (gesture.config.runOnJS) {\n return;\n }\n\n const areSomeNotWorklets = gesture.handlers.isWorklet.includes(false);\n const areSomeWorklets = gesture.handlers.isWorklet.includes(true);\n\n // if some of the callbacks are worklets and some are not, and the gesture is not\n // explicitly marked with `.runOnJS(true)` show an error\n if (areSomeNotWorklets && areSomeWorklets) {\n console.error(\n tagMessage(\n `Some of the callbacks in the gesture are worklets and some are not. Either make sure that all calbacks are marked as 'worklet' if you wish to run them on the UI thread or use '.runOnJS(true)' modifier on the gesture explicitly to run all callbacks on the JS thread.`\n )\n );\n }\n}\n\ninterface WebEventHandler {\n onGestureHandlerEvent: (event: HandlerStateChangeEvent<unknown>) => void;\n onGestureHandlerStateChange?: (\n event: HandlerStateChangeEvent<unknown>\n ) => void;\n}\n\ninterface AttachHandlersConfig {\n preparedGesture: GestureConfigReference;\n gestureConfig: ComposedGesture | GestureType | undefined;\n gesture: GestureType[];\n viewTag: number;\n webEventHandlersRef: React.RefObject<WebEventHandler>;\n}\n\nfunction attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n}: AttachHandlersConfig) {\n if (!preparedGesture.firstExecution) {\n gestureConfig?.initialize();\n } else {\n preparedGesture.firstExecution = false;\n }\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\n gestureConfig?.prepare();\n });\n\n for (const handler of gesture) {\n checkGestureCallbacksForWorklets(handler);\n RNGestureHandlerModule.createGestureHandler(\n handler.handlerName,\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS)\n );\n\n registerHandler(handler.handlerTag, handler, handler.config.testId);\n }\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\n for (const handler of gesture) {\n let requireToFail: number[] = [];\n if (handler.config.requireToFail) {\n requireToFail = extractValidHandlerTags(handler.config.requireToFail);\n }\n\n let simultaneousWith: number[] = [];\n if (handler.config.simultaneousWith) {\n simultaneousWith = extractValidHandlerTags(\n handler.config.simultaneousWith\n );\n }\n\n RNGestureHandlerModule.updateGestureHandler(\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS, {\n simultaneousHandlers: simultaneousWith,\n waitFor: requireToFail,\n })\n );\n }\n\n scheduleFlushOperations();\n });\n\n preparedGesture.config = gesture;\n\n for (const gesture of preparedGesture.config) {\n const actionType = gesture.shouldUseReanimated\n ? ActionType.REANIMATED_WORKLET\n : ActionType.JS_FUNCTION_NEW_API;\n\n if (Platform.OS === 'web') {\n (RNGestureHandlerModule.attachGestureHandler as typeof RNGestureHandlerModuleWeb.attachGestureHandler)(\n gesture.handlerTag,\n viewTag,\n ActionType.JS_FUNCTION_OLD_API, // ignored on web\n webEventHandlersRef\n );\n } else {\n RNGestureHandlerModule.attachGestureHandler(\n gesture.handlerTag,\n viewTag,\n actionType\n );\n }\n }\n\n if (preparedGesture.animatedHandlers) {\n const isAnimatedGesture = (g: GestureType) => g.shouldUseReanimated;\n\n preparedGesture.animatedHandlers.value = (gesture\n .filter(isAnimatedGesture)\n .map((g) => g.handlers) as unknown) as HandlerCallbacks<\n Record<string, unknown>\n >[];\n }\n}\n\nfunction updateHandlers(\n preparedGesture: GestureConfigReference,\n gestureConfig: ComposedGesture | GestureType | undefined,\n gesture: GestureType[],\n mountedRef: RefObject<boolean>\n) {\n gestureConfig?.prepare();\n\n for (let i = 0; i < gesture.length; i++) {\n const handler = preparedGesture.config[i];\n checkGestureCallbacksForWorklets(handler);\n\n // only update handlerTag when it's actually different, it may be the same\n // if gesture config object is wrapped with useMemo\n if (gesture[i].handlerTag !== handler.handlerTag) {\n gesture[i].handlerTag = handler.handlerTag;\n gesture[i].handlers.handlerTag = handler.handlerTag;\n }\n }\n\n // use setImmediate to extract handlerTags, because when it's ran, all refs should be updated\n // and handlerTags in BaseGesture references should be updated in the loop above (we need to wait\n // in case of external relations)\n setImmediate(() => {\n if (!mountedRef.current) {\n return;\n }\n for (let i = 0; i < gesture.length; i++) {\n const handler = preparedGesture.config[i];\n\n handler.config = gesture[i].config;\n handler.handlers = gesture[i].handlers;\n\n const requireToFail = extractValidHandlerTags(\n handler.config.requireToFail\n );\n\n const simultaneousWith = extractValidHandlerTags(\n handler.config.simultaneousWith\n );\n\n RNGestureHandlerModule.updateGestureHandler(\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS, {\n simultaneousHandlers: simultaneousWith,\n waitFor: requireToFail,\n })\n );\n\n registerHandler(handler.handlerTag, handler, handler.config.testId);\n }\n\n if (preparedGesture.animatedHandlers) {\n const previousHandlersValue =\n preparedGesture.animatedHandlers.value ?? [];\n const newHandlersValue = (preparedGesture.config\n .filter((g) => g.shouldUseReanimated) // ignore gestures that shouldn't run on UI\n .map((g) => g.handlers) as unknown) as HandlerCallbacks<\n Record<string, unknown>\n >[];\n\n // if amount of gesture configs changes, we need to update the callbacks in shared value\n let shouldUpdateSharedValue =\n previousHandlersValue.length !== newHandlersValue.length;\n\n if (!shouldUpdateSharedValue) {\n // if the amount is the same, we need to check if any of the configs inside has changed\n for (let i = 0; i < newHandlersValue.length; i++) {\n if (\n // we can use the `gestureId` prop as it's unique for every config instance\n newHandlersValue[i].gestureId !== previousHandlersValue[i].gestureId\n ) {\n shouldUpdateSharedValue = true;\n break;\n }\n }\n }\n\n if (shouldUpdateSharedValue) {\n preparedGesture.animatedHandlers.value = newHandlersValue;\n }\n }\n\n scheduleFlushOperations();\n });\n}\n\nfunction needsToReattach(\n preparedGesture: GestureConfigReference,\n gesture: GestureType[]\n) {\n if (gesture.length !== preparedGesture.config.length) {\n return true;\n }\n for (let i = 0; i < gesture.length; i++) {\n if (\n gesture[i].handlerName !== preparedGesture.config[i].handlerName ||\n gesture[i].shouldUseReanimated !==\n preparedGesture.config[i].shouldUseReanimated\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isStateChangeEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureStateChangeEvent {\n 'worklet';\n // @ts-ignore Yes, the oldState prop is missing on GestureTouchEvent, that's the point\n return event.oldState != null;\n}\n\nfunction isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureTouchEvent {\n 'worklet';\n return event.eventType != null;\n}\n\nfunction getHandler(\n type: CALLBACK_TYPE,\n gesture: HandlerCallbacks<Record<string, unknown>>\n) {\n 'worklet';\n switch (type) {\n case CALLBACK_TYPE.BEGAN:\n return gesture.onBegin;\n case CALLBACK_TYPE.START:\n return gesture.onStart;\n case CALLBACK_TYPE.UPDATE:\n return gesture.onUpdate;\n case CALLBACK_TYPE.CHANGE:\n return gesture.onChange;\n case CALLBACK_TYPE.END:\n return gesture.onEnd;\n case CALLBACK_TYPE.FINALIZE:\n return gesture.onFinalize;\n case CALLBACK_TYPE.TOUCHES_DOWN:\n return gesture.onTouchesDown;\n case CALLBACK_TYPE.TOUCHES_MOVE:\n return gesture.onTouchesMove;\n case CALLBACK_TYPE.TOUCHES_UP:\n return gesture.onTouchesUp;\n case CALLBACK_TYPE.TOUCHES_CANCELLED:\n return gesture.onTouchesCancelled;\n }\n}\n\nfunction touchEventTypeToCallbackType(\n eventType: TouchEventType\n): CALLBACK_TYPE {\n 'worklet';\n switch (eventType) {\n case TouchEventType.TOUCHES_DOWN:\n return CALLBACK_TYPE.TOUCHES_DOWN;\n case TouchEventType.TOUCHES_MOVE:\n return CALLBACK_TYPE.TOUCHES_MOVE;\n case TouchEventType.TOUCHES_UP:\n return CALLBACK_TYPE.TOUCHES_UP;\n case TouchEventType.TOUCHES_CANCELLED:\n return CALLBACK_TYPE.TOUCHES_CANCELLED;\n }\n return CALLBACK_TYPE.UNDEFINED;\n}\n\nfunction runWorklet(\n type: CALLBACK_TYPE,\n gesture: HandlerCallbacks<Record<string, unknown>>,\n event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent,\n ...args: any[]\n) {\n 'worklet';\n const handler = getHandler(type, gesture);\n if (gesture.isWorklet[type]) {\n // @ts-ignore Logic below makes sure the correct event is send to the\n // correct handler.\n handler?.(event, ...args);\n } else if (handler) {\n console.warn(tagMessage('Animated gesture callback must be a worklet'));\n }\n}\n\nfunction useAnimatedGesture(\n preparedGesture: GestureConfigReference,\n needsRebuild: boolean\n) {\n if (!Reanimated) {\n return;\n }\n\n // Hooks are called conditionally, but the condition is whether the\n // react-native-reanimated is installed, which shouldn't change while running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const sharedHandlersCallbacks = Reanimated.useSharedValue<\n HandlerCallbacks<Record<string, unknown>>[] | null\n >(null);\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const lastUpdateEvent = Reanimated.useSharedValue<\n (GestureUpdateEvent | undefined)[]\n >([]);\n\n // not every gesture needs a state controller, init them lazily\n const stateControllers: GestureStateManagerType[] = [];\n\n const callback = (\n event: GestureStateChangeEvent | GestureUpdateEvent | GestureTouchEvent\n ) => {\n 'worklet';\n\n const currentCallback = sharedHandlersCallbacks.value;\n if (!currentCallback) {\n return;\n }\n\n for (let i = 0; i < currentCallback.length; i++) {\n const gesture = currentCallback[i];\n\n if (event.handlerTag === gesture.handlerTag) {\n if (isStateChangeEvent(event)) {\n if (\n event.oldState === State.UNDETERMINED &&\n event.state === State.BEGAN\n ) {\n runWorklet(CALLBACK_TYPE.BEGAN, gesture, event);\n } else if (\n (event.oldState === State.BEGAN ||\n event.oldState === State.UNDETERMINED) &&\n event.state === State.ACTIVE\n ) {\n runWorklet(CALLBACK_TYPE.START, gesture, event);\n lastUpdateEvent.value[gesture.handlerTag] = undefined;\n } else if (\n event.oldState !== event.state &&\n event.state === State.END\n ) {\n if (event.oldState === State.ACTIVE) {\n runWorklet(CALLBACK_TYPE.END, gesture, event, true);\n }\n runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, true);\n } else if (\n (event.state === State.FAILED || event.state === State.CANCELLED) &&\n event.state !== event.oldState\n ) {\n if (event.oldState === State.ACTIVE) {\n runWorklet(CALLBACK_TYPE.END, gesture, event, false);\n }\n runWorklet(CALLBACK_TYPE.FINALIZE, gesture, event, false);\n }\n } else if (isTouchEvent(event)) {\n if (!stateControllers[i]) {\n stateControllers[i] = GestureStateManager.create(event.handlerTag);\n }\n\n if (event.eventType !== TouchEventType.UNDETERMINED) {\n runWorklet(\n touchEventTypeToCallbackType(event.eventType),\n gesture,\n event,\n stateControllers[i]\n );\n }\n } else {\n runWorklet(CALLBACK_TYPE.UPDATE, gesture, event);\n\n if (gesture.onChange && gesture.changeEventCalculator) {\n runWorklet(\n CALLBACK_TYPE.CHANGE,\n gesture,\n gesture.changeEventCalculator?.(\n event,\n lastUpdateEvent.value[gesture.handlerTag]\n )\n );\n\n lastUpdateEvent.value[gesture.handlerTag] = event;\n }\n }\n }\n }\n };\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const event = Reanimated.useEvent(\n callback,\n ['onGestureHandlerStateChange', 'onGestureHandlerEvent'],\n needsRebuild\n );\n\n preparedGesture.animatedEventHandler = event;\n preparedGesture.animatedHandlers = sharedHandlersCallbacks;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction validateDetectorChildren(ref: any) {\n // finds the first native view under the Wrap component and traverses the fiber tree upwards\n // to check whether there is more than one native view as a pseudo-direct child of GestureDetector\n // i.e. this is not ok:\n // Wrap\n // |\n // / \\\n // / \\\n // / \\\n // / \\\n // NativeView NativeView\n //\n // but this is fine:\n // Wrap\n // |\n // NativeView\n // |\n // / \\\n // / \\\n // / \\\n // / \\\n // NativeView NativeView\n if (__DEV__ && Platform.OS !== 'web') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const wrapType =\n REACT_NATIVE_VERSION.minor > 63 || REACT_NATIVE_VERSION.major > 0\n ? // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ref._reactInternals.elementType\n : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n ref._reactInternalFiber.elementType;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n let instance = RNRenderer.findHostInstance_DEPRECATED(ref)\n ._internalFiberInstanceHandleDEV;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n while (instance && instance.elementType !== wrapType) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (instance.sibling) {\n throw new Error(\n 'GestureDetector has more than one native view as its children. This can happen if you are using a custom component that renders multiple views, like React.Fragment. You should wrap content of GestureDetector with a <View> or <Animated.View>.'\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n instance = instance.return;\n }\n }\n}\n\ninterface GestureDetectorProps {\n gesture?: ComposedGesture | GestureType;\n children?: React.ReactNode;\n}\nexport const GestureDetector = (props: GestureDetectorProps) => {\n const gestureConfig = props.gesture;\n const gesture = gestureConfig?.toGestureArray?.() ?? [];\n const useReanimatedHook = gesture.some((g) => g.shouldUseReanimated);\n const viewRef = useRef(null);\n const firstRenderRef = useRef(true);\n const mountedRef = useRef(false);\n const webEventHandlersRef = useRef<WebEventHandler>({\n onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {\n onGestureHandlerEvent(e.nativeEvent);\n },\n onGestureHandlerStateChange: isExperimentalWebImplementationEnabled()\n ? (e: HandlerStateChangeEvent<unknown>) => {\n onGestureHandlerEvent(e.nativeEvent);\n }\n : undefined,\n });\n\n const preparedGesture = React.useRef<GestureConfigReference>({\n config: gesture,\n animatedEventHandler: null,\n animatedHandlers: null,\n firstExecution: true,\n useReanimatedHook: useReanimatedHook,\n }).current;\n\n if (useReanimatedHook !== preparedGesture.useReanimatedHook) {\n throw new Error(\n tagMessage(\n 'You cannot change the thread the callbacks are ran on while the app is running'\n )\n );\n }\n\n // Reanimated event should be rebuilt only when gestures are reattached, otherwise\n // config update will be enough as all necessary items are stored in shared values anyway\n const needsToRebuildReanimatedEvent =\n preparedGesture.firstExecution || needsToReattach(preparedGesture, gesture);\n\n if (preparedGesture.firstExecution) {\n gestureConfig?.initialize?.();\n }\n\n if (useReanimatedHook) {\n // Whether animatedGesture or gesture is used shouldn't change while the app is running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useAnimatedGesture(preparedGesture, needsToRebuildReanimatedEvent);\n }\n\n useEffect(() => {\n firstRenderRef.current = true;\n mountedRef.current = true;\n const viewTag = findNodeHandle(viewRef.current) as number;\n\n validateDetectorChildren(viewRef.current);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n });\n\n return () => {\n mountedRef.current = false;\n dropHandlers(preparedGesture);\n };\n }, []);\n\n useEffect(() => {\n if (!firstRenderRef.current) {\n const viewTag = findNodeHandle(viewRef.current) as number;\n\n if (needsToReattach(preparedGesture, gesture)) {\n validateDetectorChildren(viewRef.current);\n dropHandlers(preparedGesture);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n webEventHandlersRef,\n });\n } else {\n updateHandlers(preparedGesture, gestureConfig, gesture, mountedRef);\n }\n } else {\n firstRenderRef.current = false;\n }\n }, [props]);\n\n const refFunction = (ref: unknown) => {\n if (ref !== null) {\n //@ts-ignore Just setting the ref\n viewRef.current = ref;\n\n if (isFabric()) {\n const node = getShadowNodeFromRef(ref);\n if (global.isFormsStackingContext(node) === false) {\n console.error(\n tagMessage(\n 'GestureDetector has received a child that may get view-flattened. ' +\n '\\nTo prevent it from misbehaving you need to wrap the child with a `<View collapsable={false}>`.'\n )\n );\n }\n }\n }\n };\n\n if (useReanimatedHook) {\n return (\n <AnimatedWrap\n ref={refFunction}\n onGestureHandlerEvent={preparedGesture.animatedEventHandler}>\n {props.children}\n </AnimatedWrap>\n );\n } else {\n return <Wrap ref={refFunction}>{props.children}</Wrap>;\n }\n};\n\nclass Wrap extends React.Component<{\n onGestureHandlerEvent?: unknown;\n // implicit `children` prop has been removed in @types/react^18.0.0\n children?: React.ReactNode;\n}> {\n render() {\n try {\n // I don't think that fighting with types over such a simple function is worth it\n // The only thing it does is add 'collapsable: false' to the child component\n // to make sure it is in the native view hierarchy so the detector can find\n // correct viewTag to attach to.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const child: any = React.Children.only(this.props.children);\n return React.cloneElement(\n child,\n { collapsable: false },\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n child.props.children\n );\n } catch (e) {\n throw new Error(\n tagMessage(\n `GestureDetector got more than one view as a child. If you want the gesture to work on multiple views, wrap them with a common parent and attach the gesture to that view.`\n )\n );\n }\n }\n}\n\nconst AnimatedWrap = Reanimated?.default?.createAnimatedComponent(Wrap) ?? Wrap;\n"]}
@@ -66,10 +66,18 @@ exports.ComposedGesture = ComposedGesture;
66
66
 
67
67
  class SimultaneousGesture extends ComposedGesture {
68
68
  prepare() {
69
- const simultaneousArray = this.gestures.flatMap(gesture => gesture.toGestureArray()).concat(this.simultaneousGestures);
69
+ // this piece of magic works something like this:
70
+ // for every gesture in the array
71
+ const simultaneousArrays = this.gestures.map(gesture => // we take the array it's in
72
+ this.gestures // and make a copy without it
73
+ .filter(x => x !== gesture) // then we flatmap the result to get list of raw (not composed) gestures
74
+ // this way we don't make the gestures simultaneous with themselves, which is
75
+ // important when the gesture is `ExclusiveGesture` - we don't want to make
76
+ // exclusive gestures simultaneous
77
+ .flatMap(x => x.toGestureArray()));
70
78
 
71
- for (const gesture of this.gestures) {
72
- this.prepareSingleGesture(gesture, simultaneousArray, this.requireGesturesToFail);
79
+ for (let i = 0; i < this.gestures.length; i++) {
80
+ this.prepareSingleGesture(this.gestures[i], simultaneousArrays[i], this.requireGesturesToFail);
73
81
  }
74
82
  }
75
83
 
@@ -79,11 +87,14 @@ exports.SimultaneousGesture = SimultaneousGesture;
79
87
 
80
88
  class ExclusiveGesture extends ComposedGesture {
81
89
  prepare() {
90
+ // transforms the array of gestures into array of grouped raw (not composed) gestures
91
+ // i.e. [gesture1, gesture2, ComposedGesture(gesture3, gesture4)] -> [[gesture1], [gesture2], [gesture3, gesture4]]
82
92
  const gestureArrays = this.gestures.map(gesture => gesture.toGestureArray());
83
93
  let requireToFail = [];
84
94
 
85
95
  for (let i = 0; i < this.gestures.length; i++) {
86
- this.prepareSingleGesture(this.gestures[i], this.simultaneousGestures, this.requireGesturesToFail.concat(requireToFail));
96
+ this.prepareSingleGesture(this.gestures[i], this.simultaneousGestures, this.requireGesturesToFail.concat(requireToFail)); // every group gets to wait for all groups before it
97
+
87
98
  requireToFail = requireToFail.concat(gestureArrays[i]);
88
99
  }
89
100
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["gestureComposition.ts"],"names":["extendRelation","currentRelation","extendWith","undefined","ComposedGesture","Gesture","constructor","gestures","prepareSingleGesture","gesture","simultaneousGestures","requireGesturesToFail","BaseGesture","newConfig","config","simultaneousWith","requireToFail","prepare","initialize","toGestureArray","flatMap","SimultaneousGesture","simultaneousArray","concat","ExclusiveGesture","gestureArrays","map","i","length"],"mappings":"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","sourcesContent":["import { BaseGesture, Gesture, GestureRef, GestureType } from './gesture';\n\nfunction extendRelation(\n currentRelation: GestureRef[] | undefined,\n extendWith: GestureType[]\n) {\n if (currentRelation === undefined) {\n return [...extendWith];\n } else {\n return [...currentRelation, ...extendWith];\n }\n}\n\nexport class ComposedGesture extends Gesture {\n protected gestures: Gesture[] = [];\n protected simultaneousGestures: GestureType[] = [];\n protected requireGesturesToFail: GestureType[] = [];\n\n constructor(...gestures: Gesture[]) {\n super();\n this.gestures = gestures;\n }\n\n protected prepareSingleGesture(\n gesture: Gesture,\n simultaneousGestures: GestureType[],\n requireGesturesToFail: GestureType[]\n ) {\n if (gesture instanceof BaseGesture) {\n const newConfig = { ...gesture.config };\n\n newConfig.simultaneousWith = extendRelation(\n newConfig.simultaneousWith,\n simultaneousGestures\n );\n newConfig.requireToFail = extendRelation(\n newConfig.requireToFail,\n requireGesturesToFail\n );\n\n gesture.config = newConfig;\n } else if (gesture instanceof ComposedGesture) {\n gesture.simultaneousGestures = simultaneousGestures;\n gesture.requireGesturesToFail = requireGesturesToFail;\n gesture.prepare();\n }\n }\n\n prepare() {\n for (const gesture of this.gestures) {\n this.prepareSingleGesture(\n gesture,\n this.simultaneousGestures,\n this.requireGesturesToFail\n );\n }\n }\n\n initialize() {\n for (const gesture of this.gestures) {\n gesture.initialize();\n }\n }\n\n toGestureArray(): GestureType[] {\n return this.gestures.flatMap((gesture) => gesture.toGestureArray());\n }\n}\n\nexport class SimultaneousGesture extends ComposedGesture {\n prepare() {\n const simultaneousArray = this.gestures\n .flatMap((gesture) => gesture.toGestureArray())\n .concat(this.simultaneousGestures);\n\n for (const gesture of this.gestures) {\n this.prepareSingleGesture(\n gesture,\n simultaneousArray,\n this.requireGesturesToFail\n );\n }\n }\n}\n\nexport class ExclusiveGesture extends ComposedGesture {\n prepare() {\n const gestureArrays = this.gestures.map((gesture) =>\n gesture.toGestureArray()\n );\n\n let requireToFail: GestureType[] = [];\n\n for (let i = 0; i < this.gestures.length; i++) {\n this.prepareSingleGesture(\n this.gestures[i],\n this.simultaneousGestures,\n this.requireGesturesToFail.concat(requireToFail)\n );\n\n requireToFail = requireToFail.concat(gestureArrays[i]);\n }\n }\n}\n\nexport type ComposedGestureType = InstanceType<typeof ComposedGesture>;\nexport type RaceGestureType = ComposedGestureType;\nexport type SimultaneousGestureType = InstanceType<typeof SimultaneousGesture>;\nexport type ExclusiveGestureType = InstanceType<typeof ExclusiveGesture>;\n"]}
1
+ {"version":3,"sources":["gestureComposition.ts"],"names":["extendRelation","currentRelation","extendWith","undefined","ComposedGesture","Gesture","constructor","gestures","prepareSingleGesture","gesture","simultaneousGestures","requireGesturesToFail","BaseGesture","newConfig","config","simultaneousWith","requireToFail","prepare","initialize","toGestureArray","flatMap","SimultaneousGesture","simultaneousArrays","map","filter","x","i","length","ExclusiveGesture","gestureArrays","concat"],"mappings":"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","sourcesContent":["import { BaseGesture, Gesture, GestureRef, GestureType } from './gesture';\n\nfunction extendRelation(\n currentRelation: GestureRef[] | undefined,\n extendWith: GestureType[]\n) {\n if (currentRelation === undefined) {\n return [...extendWith];\n } else {\n return [...currentRelation, ...extendWith];\n }\n}\n\nexport class ComposedGesture extends Gesture {\n protected gestures: Gesture[] = [];\n protected simultaneousGestures: GestureType[] = [];\n protected requireGesturesToFail: GestureType[] = [];\n\n constructor(...gestures: Gesture[]) {\n super();\n this.gestures = gestures;\n }\n\n protected prepareSingleGesture(\n gesture: Gesture,\n simultaneousGestures: GestureType[],\n requireGesturesToFail: GestureType[]\n ) {\n if (gesture instanceof BaseGesture) {\n const newConfig = { ...gesture.config };\n\n newConfig.simultaneousWith = extendRelation(\n newConfig.simultaneousWith,\n simultaneousGestures\n );\n newConfig.requireToFail = extendRelation(\n newConfig.requireToFail,\n requireGesturesToFail\n );\n\n gesture.config = newConfig;\n } else if (gesture instanceof ComposedGesture) {\n gesture.simultaneousGestures = simultaneousGestures;\n gesture.requireGesturesToFail = requireGesturesToFail;\n gesture.prepare();\n }\n }\n\n prepare() {\n for (const gesture of this.gestures) {\n this.prepareSingleGesture(\n gesture,\n this.simultaneousGestures,\n this.requireGesturesToFail\n );\n }\n }\n\n initialize() {\n for (const gesture of this.gestures) {\n gesture.initialize();\n }\n }\n\n toGestureArray(): GestureType[] {\n return this.gestures.flatMap((gesture) => gesture.toGestureArray());\n }\n}\n\nexport class SimultaneousGesture extends ComposedGesture {\n prepare() {\n // this piece of magic works something like this:\n // for every gesture in the array\n const simultaneousArrays = this.gestures.map((gesture) =>\n // we take the array it's in\n this.gestures\n // and make a copy without it\n .filter((x) => x !== gesture)\n // then we flatmap the result to get list of raw (not composed) gestures\n // this way we don't make the gestures simultaneous with themselves, which is\n // important when the gesture is `ExclusiveGesture` - we don't want to make\n // exclusive gestures simultaneous\n .flatMap((x) => x.toGestureArray())\n );\n\n for (let i = 0; i < this.gestures.length; i++) {\n this.prepareSingleGesture(\n this.gestures[i],\n simultaneousArrays[i],\n this.requireGesturesToFail\n );\n }\n }\n}\n\nexport class ExclusiveGesture extends ComposedGesture {\n prepare() {\n // transforms the array of gestures into array of grouped raw (not composed) gestures\n // i.e. [gesture1, gesture2, ComposedGesture(gesture3, gesture4)] -> [[gesture1], [gesture2], [gesture3, gesture4]]\n const gestureArrays = this.gestures.map((gesture) =>\n gesture.toGestureArray()\n );\n\n let requireToFail: GestureType[] = [];\n\n for (let i = 0; i < this.gestures.length; i++) {\n this.prepareSingleGesture(\n this.gestures[i],\n this.simultaneousGestures,\n this.requireGesturesToFail.concat(requireToFail)\n );\n\n // every group gets to wait for all groups before it\n requireToFail = requireToFail.concat(gestureArrays[i]);\n }\n }\n}\n\nexport type ComposedGestureType = InstanceType<typeof ComposedGesture>;\nexport type RaceGestureType = ComposedGestureType;\nexport type SimultaneousGestureType = InstanceType<typeof SimultaneousGesture>;\nexport type ExclusiveGestureType = InstanceType<typeof ExclusiveGesture>;\n"]}