react-native-gesture-handler 2.0.0 → 2.1.3

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.
Files changed (65) hide show
  1. package/android/build.gradle +26 -0
  2. package/android/{src → common/src}/main/java/com/swmansion/common/GestureHandlerStateManager.kt +0 -0
  3. package/android/lib/src/main/java/com/swmansion/gesturehandler/GestureHandler.kt +4 -1
  4. package/ios/Handlers/RNFlingHandler.m +1 -1
  5. package/ios/Handlers/RNLongPressHandler.m +2 -2
  6. package/ios/Handlers/RNPanHandler.m +1 -1
  7. package/ios/Handlers/RNTapHandler.m +2 -2
  8. package/lib/commonjs/handlers/gestures/GestureDetector.js +28 -3
  9. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  10. package/lib/commonjs/handlers/gestures/eventReceiver.js +34 -11
  11. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  12. package/lib/commonjs/handlers/gestures/forceTouchGesture.js +26 -0
  13. package/lib/commonjs/handlers/gestures/forceTouchGesture.js.map +1 -1
  14. package/lib/commonjs/handlers/gestures/gesture.js +22 -6
  15. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  16. package/lib/commonjs/handlers/gestures/manualGesture.js +12 -0
  17. package/lib/commonjs/handlers/gestures/manualGesture.js.map +1 -1
  18. package/lib/commonjs/handlers/gestures/panGesture.js +28 -0
  19. package/lib/commonjs/handlers/gestures/panGesture.js.map +1 -1
  20. package/lib/commonjs/handlers/gestures/pinchGesture.js +26 -0
  21. package/lib/commonjs/handlers/gestures/pinchGesture.js.map +1 -1
  22. package/lib/commonjs/handlers/gestures/rotationGesture.js +26 -0
  23. package/lib/commonjs/handlers/gestures/rotationGesture.js.map +1 -1
  24. package/lib/commonjs/index.js +0 -106
  25. package/lib/commonjs/index.js.map +1 -1
  26. package/lib/module/handlers/gestures/GestureDetector.js +27 -3
  27. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  28. package/lib/module/handlers/gestures/eventReceiver.js +34 -11
  29. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  30. package/lib/module/handlers/gestures/forceTouchGesture.js +27 -0
  31. package/lib/module/handlers/gestures/forceTouchGesture.js.map +1 -1
  32. package/lib/module/handlers/gestures/gesture.js +22 -6
  33. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  34. package/lib/module/handlers/gestures/manualGesture.js +13 -0
  35. package/lib/module/handlers/gestures/manualGesture.js.map +1 -1
  36. package/lib/module/handlers/gestures/panGesture.js +29 -0
  37. package/lib/module/handlers/gestures/panGesture.js.map +1 -1
  38. package/lib/module/handlers/gestures/pinchGesture.js +27 -0
  39. package/lib/module/handlers/gestures/pinchGesture.js.map +1 -1
  40. package/lib/module/handlers/gestures/rotationGesture.js +27 -0
  41. package/lib/module/handlers/gestures/rotationGesture.js.map +1 -1
  42. package/lib/module/index.js +0 -11
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/typescript/handlers/ForceTouchGestureHandler.d.ts +1 -1
  45. package/lib/typescript/handlers/gestures/forceTouchGesture.d.ts +7 -1
  46. package/lib/typescript/handlers/gestures/gesture.d.ts +14 -7
  47. package/lib/typescript/handlers/gestures/manualGesture.d.ts +3 -1
  48. package/lib/typescript/handlers/gestures/panGesture.d.ts +8 -1
  49. package/lib/typescript/handlers/gestures/pinchGesture.d.ts +7 -1
  50. package/lib/typescript/handlers/gestures/rotationGesture.d.ts +7 -1
  51. package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
  52. package/lib/typescript/index.d.ts +11 -11
  53. package/lib/typescript/web/constants.d.ts +0 -1
  54. package/package.json +2 -1
  55. package/src/handlers/gestures/GestureDetector.tsx +31 -2
  56. package/src/handlers/gestures/eventReceiver.ts +24 -2
  57. package/src/handlers/gestures/forceTouchGesture.ts +43 -1
  58. package/src/handlers/gestures/gesture.ts +42 -12
  59. package/src/handlers/gestures/manualGesture.ts +21 -1
  60. package/src/handlers/gestures/panGesture.ts +43 -1
  61. package/src/handlers/gestures/pinchGesture.ts +40 -1
  62. package/src/handlers/gestures/rotationGesture.ts +40 -1
  63. package/src/index.ts +11 -11
  64. package/ios/RNGestureHandler.xcodeproj/xcuserdata/mdk.xcuserdatad/xcschemes/RNGestureHandler.xcscheme +0 -80
  65. package/ios/RNGestureHandler.xcodeproj/xcuserdata/mdk.xcuserdatad/xcschemes/xcschememanagement.plist +0 -27
@@ -1,3 +1,5 @@
1
+ import groovy.json.JsonSlurper
2
+
1
3
  buildscript {
2
4
  def kotlin_version = rootProject.ext.has('kotlinVersion') ? rootProject.ext.get('kotlinVersion') : project.properties['RNGH_kotlinVersion']
3
5
 
@@ -17,6 +19,20 @@ def safeExtGet(prop, fallback) {
17
19
  rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
18
20
  }
19
21
 
22
+ // Check whether Reanimated 2.3 or higher is installed alongside Gesture Handler
23
+ def shouldUseCommonInterfaceFromReanimated() {
24
+ def reanimated = rootProject.subprojects.find { it.name == 'react-native-reanimated' };
25
+ if (reanimated != null) {
26
+ def inputFile = new File(reanimated.projectDir, '../package.json')
27
+ def json = new JsonSlurper().parseText(inputFile.text)
28
+ def reanimatedVersion = json.version as String
29
+ def (major, minor, patch) = reanimatedVersion.tokenize('.')
30
+ return Integer.parseInt(minor) >= 3
31
+ } else {
32
+ return false
33
+ }
34
+ }
35
+
20
36
  repositories {
21
37
  mavenCentral()
22
38
  }
@@ -36,6 +52,12 @@ android {
36
52
  // standalone gradle module just to be used in AndroidNativeExample
37
53
  sourceSets {
38
54
  main.java.srcDirs += 'lib/src/main/java'
55
+
56
+ // Include "common/" only when it's not provided by Reanimated to mitigate
57
+ // multiple definitions of the same class preventing build
58
+ if (!shouldUseCommonInterfaceFromReanimated()) {
59
+ main.java.srcDirs += 'common/src/main/java'
60
+ }
39
61
  }
40
62
  }
41
63
 
@@ -43,6 +65,10 @@ def kotlin_version = safeExtGet('kotlinVersion', project.properties['RNGH_kotlin
43
65
 
44
66
  dependencies {
45
67
  //noinspection GradleDynamicVersion
68
+ if (shouldUseCommonInterfaceFromReanimated()) {
69
+ // Include Reanimated as dependency to load the common interface
70
+ implementation project(':react-native-reanimated')
71
+ }
46
72
  implementation 'com.facebook.react:react-native:+'
47
73
  implementation 'androidx.appcompat:appcompat:1.2.0'
48
74
  implementation "androidx.core:core-ktx:1.6.0"
@@ -111,7 +111,10 @@ open class GestureHandler<ConcreteGestureHandlerT : GestureHandler<ConcreteGestu
111
111
  applySelf { this.shouldCancelWhenOutside = shouldCancelWhenOutside }
112
112
 
113
113
  fun setEnabled(enabled: Boolean): ConcreteGestureHandlerT = applySelf {
114
- if (view != null) {
114
+ // Don't cancel handler when not changing the value of the isEnabled, executing it always caused
115
+ // handlers to be cancelled on re-render because that's the moment when the config is updated.
116
+ // If the enabled prop "changed" from true to true the handler would get cancelled.
117
+ if (view != null && isEnabled != enabled) {
115
118
  // If view is set then handler is in "active" state. In that case we want to "cancel" handler
116
119
  // when it changes enabled state so that it gets cleared from the orchestrator
117
120
  UiThreadUtil.runOnUiThread { cancel() }
@@ -51,8 +51,8 @@
51
51
 
52
52
  - (void)reset
53
53
  {
54
- [_gestureHandler.pointerTracker reset];
55
54
  [self triggerAction];
55
+ [_gestureHandler.pointerTracker reset];
56
56
  [super reset];
57
57
  }
58
58
 
@@ -93,12 +93,12 @@
93
93
 
94
94
  - (void)reset
95
95
  {
96
- [_gestureHandler.pointerTracker reset];
97
-
98
96
  if (self.state == UIGestureRecognizerStateFailed) {
99
97
  [self triggerAction];
100
98
  }
101
99
 
100
+ [_gestureHandler.pointerTracker reset];
101
+
102
102
  [super reset];
103
103
  }
104
104
 
@@ -138,8 +138,8 @@
138
138
 
139
139
  - (void)reset
140
140
  {
141
- [_gestureHandler.pointerTracker reset];
142
141
  [self triggerAction];
142
+ [_gestureHandler.pointerTracker reset];
143
143
  self.enabled = YES;
144
144
  [super reset];
145
145
  }
@@ -171,11 +171,11 @@ static const NSTimeInterval defaultMaxDuration = 0.5;
171
171
 
172
172
  - (void)reset
173
173
  {
174
- [_gestureHandler.pointerTracker reset];
175
-
176
174
  if (self.state == UIGestureRecognizerStateFailed) {
177
175
  [self triggerAction];
178
176
  }
177
+ [_gestureHandler.pointerTracker reset];
178
+
179
179
  [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancel) object:nil];
180
180
  _tapsSoFar = 0;
181
181
  _maxNumberOfTouches = 0;
@@ -207,9 +207,15 @@ function useAnimatedGesture(preparedGesture) {
207
207
  case _gesture.CALLBACK_TYPE.UPDATE:
208
208
  return gesture.onUpdate;
209
209
 
210
+ case _gesture.CALLBACK_TYPE.CHANGE:
211
+ return gesture.onChange;
212
+
210
213
  case _gesture.CALLBACK_TYPE.END:
211
214
  return gesture.onEnd;
212
215
 
216
+ case _gesture.CALLBACK_TYPE.FINALIZE:
217
+ return gesture.onFinalize;
218
+
213
219
  case _gesture.CALLBACK_TYPE.TOUCHES_DOWN:
214
220
  return gesture.onTouchesDown;
215
221
 
@@ -261,7 +267,10 @@ function useAnimatedGesture(preparedGesture) {
261
267
  // eslint-disable-next-line react-hooks/rules-of-hooks
262
268
 
263
269
 
264
- const sharedHandlersCallbacks = _reanimatedWrapper.Reanimated.useSharedValue(null); // not every gesture needs a state controller, init them lazily
270
+ const sharedHandlersCallbacks = _reanimatedWrapper.Reanimated.useSharedValue(null); // eslint-disable-next-line react-hooks/rules-of-hooks
271
+
272
+
273
+ const lastUpdateEvent = _reanimatedWrapper.Reanimated.useSharedValue([]); // not every gesture needs a state controller, init them lazily
265
274
 
266
275
 
267
276
  const stateControllers = [];
@@ -284,10 +293,19 @@ function useAnimatedGesture(preparedGesture) {
284
293
  runWorklet(_gesture.CALLBACK_TYPE.BEGAN, gesture, event);
285
294
  } else if ((event.oldState === _State.State.BEGAN || event.oldState === _State.State.UNDETERMINED) && event.state === _State.State.ACTIVE) {
286
295
  runWorklet(_gesture.CALLBACK_TYPE.START, gesture, event);
296
+ lastUpdateEvent.value[gesture.handlerTag] = undefined;
287
297
  } else if (event.oldState !== event.state && event.state === _State.State.END) {
288
- runWorklet(_gesture.CALLBACK_TYPE.END, gesture, event, true);
298
+ if (event.oldState === _State.State.ACTIVE) {
299
+ runWorklet(_gesture.CALLBACK_TYPE.END, gesture, event, true);
300
+ }
301
+
302
+ runWorklet(_gesture.CALLBACK_TYPE.FINALIZE, gesture, event, true);
289
303
  } else if ((event.state === _State.State.FAILED || event.state === _State.State.CANCELLED) && event.state !== event.oldState) {
290
- runWorklet(_gesture.CALLBACK_TYPE.END, gesture, event, false);
304
+ if (event.oldState === _State.State.ACTIVE) {
305
+ runWorklet(_gesture.CALLBACK_TYPE.END, gesture, event, false);
306
+ }
307
+
308
+ runWorklet(_gesture.CALLBACK_TYPE.FINALIZE, gesture, event, false);
291
309
  }
292
310
  } else if (isTouchEvent(event)) {
293
311
  if (!stateControllers[i]) {
@@ -299,6 +317,13 @@ function useAnimatedGesture(preparedGesture) {
299
317
  }
300
318
  } else {
301
319
  runWorklet(_gesture.CALLBACK_TYPE.UPDATE, gesture, event);
320
+
321
+ if (gesture.onChange && gesture.changeEventCalculator) {
322
+ var _gesture$changeEventC;
323
+
324
+ runWorklet(_gesture.CALLBACK_TYPE.CHANGE, gesture, (_gesture$changeEventC = gesture.changeEventCalculator) === null || _gesture$changeEventC === void 0 ? void 0 : _gesture$changeEventC.call(gesture, event, lastUpdateEvent.value[gesture.handlerTag]));
325
+ lastUpdateEvent.value[gesture.handlerTag] = event;
326
+ }
302
327
  }
303
328
  }
304
329
  }
@@ -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","attachHandlers","gestureConfig","gesture","viewTag","useAnimated","firstExecution","initialize","setImmediate","prepare","createGestureHandler","handlerName","requireToFail","simultaneousWith","updateGestureHandler","simultaneousHandlers","waitFor","attachGestureHandler","animatedHandlers","value","g","handlers","updateHandlers","i","length","needsToReattach","useAnimatedGesture","Reanimated","isStateChangeEvent","event","oldState","isTouchEvent","eventType","getHandler","type","CALLBACK_TYPE","BEGAN","onBegin","START","onStart","UPDATE","onUpdate","END","onEnd","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","touchEventTypeToCallbackType","EventType","UNDEFINED","runWorklet","args","isWorklet","console","warn","sharedHandlersCallbacks","useSharedValue","stateControllers","callback","currentCallback","State","UNDETERMINED","state","ACTIVE","FAILED","CANCELLED","GestureStateManager","create","useEvent","animatedEventHandler","GestureDetector","props","toGestureArray","find","reduce","prev","viewRef","firstRenderRef","React","useRef","Error","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} 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 { EventType } from '../../EventType';\nimport { ComposedGesture } from './gestureComposition';\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 useAnimated: 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);\n }\n}\n\ninterface AttachHandlersConfig {\n preparedGesture: GestureConfigReference;\n gestureConfig: ComposedGesture | GestureType | undefined;\n gesture: GestureType[];\n viewTag: number;\n useAnimated: boolean;\n}\n\nfunction attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\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 RNGestureHandlerModule.createGestureHandler(\n handler.handlerName,\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS)\n );\n\n registerHandler(handler.handlerTag, handler);\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\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 preparedGesture.config = gesture;\n\n for (const gesture of preparedGesture.config) {\n RNGestureHandlerModule.attachGestureHandler(\n gesture.handlerTag,\n viewTag,\n !useAnimated // send direct events when using animatedGesture, device events otherwise\n );\n }\n\n if (preparedGesture.animatedHandlers) {\n preparedGesture.animatedHandlers.value = (gesture.map(\n (g) => g.handlers\n ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];\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\n gesture[i].handlerTag = handler.handlerTag;\n gesture[i].handlers.handlerTag = handler.handlerTag;\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 handler.handlers.handlerTag = handler.handlerTag;\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);\n }\n\n if (preparedGesture.animatedHandlers) {\n preparedGesture.animatedHandlers.value = (preparedGesture.config.map(\n (g) => g.handlers\n ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];\n }\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 (gesture[i].handlerName !== preparedGesture.config[i].handlerName) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction useAnimatedGesture(preparedGesture: GestureConfigReference) {\n if (!Reanimated) {\n return;\n }\n\n function 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\n function isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n ): event is GestureTouchEvent {\n 'worklet';\n return event.eventType != null;\n }\n\n function 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.END:\n return gesture.onEnd;\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\n function touchEventTypeToCallbackType(eventType: EventType): CALLBACK_TYPE {\n 'worklet';\n switch (eventType) {\n case EventType.TOUCHES_DOWN:\n return CALLBACK_TYPE.TOUCHES_DOWN;\n case EventType.TOUCHES_MOVE:\n return CALLBACK_TYPE.TOUCHES_MOVE;\n case EventType.TOUCHES_UP:\n return CALLBACK_TYPE.TOUCHES_UP;\n case EventType.TOUCHES_CANCELLED:\n return CALLBACK_TYPE.TOUCHES_CANCELLED;\n }\n return CALLBACK_TYPE.UNDEFINED;\n }\n\n function 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('Animated gesture callback must be a worklet');\n }\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 // 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 } else if (\n event.oldState !== event.state &&\n event.state === State.END\n ) {\n runWorklet(CALLBACK_TYPE.END, gesture, event, true);\n } else if (\n (event.state === State.FAILED || event.state === State.CANCELLED) &&\n event.state !== event.oldState\n ) {\n runWorklet(CALLBACK_TYPE.END, 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 !== EventType.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 }\n }\n };\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const event = Reanimated.useEvent(\n callback,\n ['onGestureHandlerStateChange', 'onGestureHandlerEvent'],\n true\n );\n\n preparedGesture.animatedEventHandler = event;\n preparedGesture.animatedHandlers = sharedHandlersCallbacks;\n}\n\ninterface GestureDetectorProps {\n gesture?: ComposedGesture | GestureType;\n}\nexport const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (\n props\n) => {\n const gestureConfig = props.gesture;\n const gesture = gestureConfig?.toGestureArray?.() ?? [];\n const useAnimated =\n gesture.find((gesture) =>\n gesture.handlers.isWorklet.reduce((prev, current) => prev || current)\n ) != null;\n const viewRef = useRef(null);\n const firstRenderRef = useRef(true);\n\n const preparedGesture = React.useRef<GestureConfigReference>({\n config: gesture,\n animatedEventHandler: null,\n animatedHandlers: null,\n firstExecution: true,\n useAnimated: useAnimated,\n }).current;\n\n if (useAnimated !== preparedGesture.useAnimated) {\n throw new Error(\n 'You cannot change whether you are using gesture or animatedGesture while the app is running'\n );\n }\n\n if (preparedGesture.firstExecution) {\n gestureConfig?.initialize?.();\n }\n\n if (useAnimated) {\n // Whether animatedGesture or gesture is used shouldn't change\n // during while an app is running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useAnimatedGesture(preparedGesture);\n }\n\n useEffect(() => {\n firstRenderRef.current = true;\n const viewTag = findNodeHandle(viewRef.current) as number;\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\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 dropHandlers(preparedGesture);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\n });\n } else {\n updateHandlers(preparedGesture, gestureConfig, gesture);\n }\n } else {\n firstRenderRef.current = false;\n }\n }, [props]);\n\n if (useAnimated) {\n return (\n <AnimatedWrap\n ref={viewRef}\n onGestureHandlerEvent={preparedGesture.animatedEventHandler}>\n {props.children}\n </AnimatedWrap>\n );\n } else {\n return <Wrap ref={viewRef}>{props.children}</Wrap>;\n }\n};\n\nclass Wrap extends React.Component<{ onGestureHandlerEvent?: unknown }> {\n render() {\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\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 }\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","attachHandlers","gestureConfig","gesture","viewTag","useAnimated","firstExecution","initialize","setImmediate","prepare","createGestureHandler","handlerName","requireToFail","simultaneousWith","updateGestureHandler","simultaneousHandlers","waitFor","attachGestureHandler","animatedHandlers","value","g","handlers","updateHandlers","i","length","needsToReattach","useAnimatedGesture","Reanimated","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","EventType","UNDEFINED","runWorklet","args","isWorklet","console","warn","sharedHandlersCallbacks","useSharedValue","lastUpdateEvent","stateControllers","callback","currentCallback","State","UNDETERMINED","state","ACTIVE","undefined","FAILED","CANCELLED","GestureStateManager","create","changeEventCalculator","useEvent","animatedEventHandler","GestureDetector","props","toGestureArray","find","reduce","prev","viewRef","firstRenderRef","React","useRef","Error","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} 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 { EventType } from '../../EventType';\nimport { ComposedGesture } from './gestureComposition';\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 useAnimated: 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);\n }\n}\n\ninterface AttachHandlersConfig {\n preparedGesture: GestureConfigReference;\n gestureConfig: ComposedGesture | GestureType | undefined;\n gesture: GestureType[];\n viewTag: number;\n useAnimated: boolean;\n}\n\nfunction attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\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 RNGestureHandlerModule.createGestureHandler(\n handler.handlerName,\n handler.handlerTag,\n filterConfig(handler.config, ALLOWED_PROPS)\n );\n\n registerHandler(handler.handlerTag, handler);\n\n // use setImmediate to extract handlerTags, because all refs should be initialized\n // when it's ran\n setImmediate(() => {\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 preparedGesture.config = gesture;\n\n for (const gesture of preparedGesture.config) {\n RNGestureHandlerModule.attachGestureHandler(\n gesture.handlerTag,\n viewTag,\n !useAnimated // send direct events when using animatedGesture, device events otherwise\n );\n }\n\n if (preparedGesture.animatedHandlers) {\n preparedGesture.animatedHandlers.value = (gesture.map(\n (g) => g.handlers\n ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];\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\n gesture[i].handlerTag = handler.handlerTag;\n gesture[i].handlers.handlerTag = handler.handlerTag;\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 handler.handlers.handlerTag = handler.handlerTag;\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);\n }\n\n if (preparedGesture.animatedHandlers) {\n preparedGesture.animatedHandlers.value = (preparedGesture.config.map(\n (g) => g.handlers\n ) as unknown) as HandlerCallbacks<Record<string, unknown>>[];\n }\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 (gesture[i].handlerName !== preparedGesture.config[i].handlerName) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction useAnimatedGesture(preparedGesture: GestureConfigReference) {\n if (!Reanimated) {\n return;\n }\n\n function 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\n function isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n ): event is GestureTouchEvent {\n 'worklet';\n return event.eventType != null;\n }\n\n function 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\n function touchEventTypeToCallbackType(eventType: EventType): CALLBACK_TYPE {\n 'worklet';\n switch (eventType) {\n case EventType.TOUCHES_DOWN:\n return CALLBACK_TYPE.TOUCHES_DOWN;\n case EventType.TOUCHES_MOVE:\n return CALLBACK_TYPE.TOUCHES_MOVE;\n case EventType.TOUCHES_UP:\n return CALLBACK_TYPE.TOUCHES_UP;\n case EventType.TOUCHES_CANCELLED:\n return CALLBACK_TYPE.TOUCHES_CANCELLED;\n }\n return CALLBACK_TYPE.UNDEFINED;\n }\n\n function 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('Animated gesture callback must be a worklet');\n }\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 !== EventType.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 true\n );\n\n preparedGesture.animatedEventHandler = event;\n preparedGesture.animatedHandlers = sharedHandlersCallbacks;\n}\n\ninterface GestureDetectorProps {\n gesture?: ComposedGesture | GestureType;\n}\nexport const GestureDetector: React.FunctionComponent<GestureDetectorProps> = (\n props\n) => {\n const gestureConfig = props.gesture;\n const gesture = gestureConfig?.toGestureArray?.() ?? [];\n const useAnimated =\n gesture.find((gesture) =>\n gesture.handlers.isWorklet.reduce((prev, current) => prev || current)\n ) != null;\n const viewRef = useRef(null);\n const firstRenderRef = useRef(true);\n\n const preparedGesture = React.useRef<GestureConfigReference>({\n config: gesture,\n animatedEventHandler: null,\n animatedHandlers: null,\n firstExecution: true,\n useAnimated: useAnimated,\n }).current;\n\n if (useAnimated !== preparedGesture.useAnimated) {\n throw new Error(\n 'You cannot change whether you are using gesture or animatedGesture while the app is running'\n );\n }\n\n if (preparedGesture.firstExecution) {\n gestureConfig?.initialize?.();\n }\n\n if (useAnimated) {\n // Whether animatedGesture or gesture is used shouldn't change\n // during while an app is running\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useAnimatedGesture(preparedGesture);\n }\n\n useEffect(() => {\n firstRenderRef.current = true;\n const viewTag = findNodeHandle(viewRef.current) as number;\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\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 dropHandlers(preparedGesture);\n attachHandlers({\n preparedGesture,\n gestureConfig,\n gesture,\n viewTag,\n useAnimated,\n });\n } else {\n updateHandlers(preparedGesture, gestureConfig, gesture);\n }\n } else {\n firstRenderRef.current = false;\n }\n }, [props]);\n\n if (useAnimated) {\n return (\n <AnimatedWrap\n ref={viewRef}\n onGestureHandlerEvent={preparedGesture.animatedEventHandler}>\n {props.children}\n </AnimatedWrap>\n );\n } else {\n return <Wrap ref={viewRef}>{props.children}</Wrap>;\n }\n};\n\nclass Wrap extends React.Component<{ onGestureHandlerEvent?: unknown }> {\n render() {\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\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 }\n}\n\nconst AnimatedWrap = Reanimated?.default?.createAnimatedComponent(Wrap) ?? Wrap;\n"]}
@@ -30,6 +30,7 @@ const dummyStateManager = {
30
30
  console.warn('You have to use react-native-reanimated in order to control the state of the gesture.');
31
31
  }
32
32
  };
33
+ const lastUpdateEvent = [];
33
34
 
34
35
  function isStateChangeEvent(event) {
35
36
  // @ts-ignore oldState doesn't exist on GestureTouchEvent and that's the point
@@ -41,7 +42,7 @@ function isTouchEvent(event) {
41
42
  }
42
43
 
43
44
  function onGestureHandlerEvent(event) {
44
- var _handler$handlers5, _handler$handlers5$on, _handler$handlers6, _handler$handlers6$on, _handler$handlers7, _handler$handlers7$on, _handler$handlers8, _handler$handlers8$on;
45
+ var _handler$handlers7, _handler$handlers7$on, _handler$handlers8, _handler$handlers8$on, _handler$handlers9, _handler$handlers9$on, _handler$handlers10, _handler$handlers10$o;
45
46
 
46
47
  const handler = (0, _handlersRegistry.findHandler)(event.handlerTag);
47
48
 
@@ -55,37 +56,59 @@ function onGestureHandlerEvent(event) {
55
56
  var _handler$handlers$onS, _handler$handlers2;
56
57
 
57
58
  (_handler$handlers$onS = (_handler$handlers2 = handler.handlers).onStart) === null || _handler$handlers$onS === void 0 ? void 0 : _handler$handlers$onS.call(_handler$handlers2, event);
59
+ lastUpdateEvent[handler.handlers.handlerTag] = event;
58
60
  } else if (event.oldState !== event.state && event.state === _State.State.END) {
59
- var _handler$handlers$onE, _handler$handlers3;
61
+ var _handler$handlers$onF, _handler$handlers4;
60
62
 
61
- (_handler$handlers$onE = (_handler$handlers3 = handler.handlers).onEnd) === null || _handler$handlers$onE === void 0 ? void 0 : _handler$handlers$onE.call(_handler$handlers3, event, true);
63
+ if (event.oldState === _State.State.ACTIVE) {
64
+ var _handler$handlers$onE, _handler$handlers3;
65
+
66
+ (_handler$handlers$onE = (_handler$handlers3 = handler.handlers).onEnd) === null || _handler$handlers$onE === void 0 ? void 0 : _handler$handlers$onE.call(_handler$handlers3, event, true);
67
+ }
68
+
69
+ (_handler$handlers$onF = (_handler$handlers4 = handler.handlers).onFinalize) === null || _handler$handlers$onF === void 0 ? void 0 : _handler$handlers$onF.call(_handler$handlers4, event, true);
70
+ lastUpdateEvent[handler.handlers.handlerTag] = undefined;
62
71
  } else if ((event.state === _State.State.FAILED || event.state === _State.State.CANCELLED) && event.oldState !== event.state) {
63
- var _handler$handlers$onE2, _handler$handlers4;
72
+ var _handler$handlers$onF2, _handler$handlers6;
73
+
74
+ if (event.oldState === _State.State.ACTIVE) {
75
+ var _handler$handlers$onE2, _handler$handlers5;
76
+
77
+ (_handler$handlers$onE2 = (_handler$handlers5 = handler.handlers).onEnd) === null || _handler$handlers$onE2 === void 0 ? void 0 : _handler$handlers$onE2.call(_handler$handlers5, event, false);
78
+ }
64
79
 
65
- (_handler$handlers$onE2 = (_handler$handlers4 = handler.handlers).onEnd) === null || _handler$handlers$onE2 === void 0 ? void 0 : _handler$handlers$onE2.call(_handler$handlers4, event, false);
80
+ (_handler$handlers$onF2 = (_handler$handlers6 = handler.handlers).onFinalize) === null || _handler$handlers$onF2 === void 0 ? void 0 : _handler$handlers$onF2.call(_handler$handlers6, event, false);
81
+ lastUpdateEvent[handler.handlers.handlerTag] = undefined;
66
82
  }
67
83
  } else if (isTouchEvent(event)) {
68
84
  switch (event.eventType) {
69
85
  case _EventType.EventType.TOUCHES_DOWN:
70
- (_handler$handlers5 = handler.handlers) === null || _handler$handlers5 === void 0 ? void 0 : (_handler$handlers5$on = _handler$handlers5.onTouchesDown) === null || _handler$handlers5$on === void 0 ? void 0 : _handler$handlers5$on.call(_handler$handlers5, event, dummyStateManager);
86
+ (_handler$handlers7 = handler.handlers) === null || _handler$handlers7 === void 0 ? void 0 : (_handler$handlers7$on = _handler$handlers7.onTouchesDown) === null || _handler$handlers7$on === void 0 ? void 0 : _handler$handlers7$on.call(_handler$handlers7, event, dummyStateManager);
71
87
  break;
72
88
 
73
89
  case _EventType.EventType.TOUCHES_MOVE:
74
- (_handler$handlers6 = handler.handlers) === null || _handler$handlers6 === void 0 ? void 0 : (_handler$handlers6$on = _handler$handlers6.onTouchesMove) === null || _handler$handlers6$on === void 0 ? void 0 : _handler$handlers6$on.call(_handler$handlers6, event, dummyStateManager);
90
+ (_handler$handlers8 = handler.handlers) === null || _handler$handlers8 === void 0 ? void 0 : (_handler$handlers8$on = _handler$handlers8.onTouchesMove) === null || _handler$handlers8$on === void 0 ? void 0 : _handler$handlers8$on.call(_handler$handlers8, event, dummyStateManager);
75
91
  break;
76
92
 
77
93
  case _EventType.EventType.TOUCHES_UP:
78
- (_handler$handlers7 = handler.handlers) === null || _handler$handlers7 === void 0 ? void 0 : (_handler$handlers7$on = _handler$handlers7.onTouchesUp) === null || _handler$handlers7$on === void 0 ? void 0 : _handler$handlers7$on.call(_handler$handlers7, event, dummyStateManager);
94
+ (_handler$handlers9 = handler.handlers) === null || _handler$handlers9 === void 0 ? void 0 : (_handler$handlers9$on = _handler$handlers9.onTouchesUp) === null || _handler$handlers9$on === void 0 ? void 0 : _handler$handlers9$on.call(_handler$handlers9, event, dummyStateManager);
79
95
  break;
80
96
 
81
97
  case _EventType.EventType.TOUCHES_CANCELLED:
82
- (_handler$handlers8 = handler.handlers) === null || _handler$handlers8 === void 0 ? void 0 : (_handler$handlers8$on = _handler$handlers8.onTouchesCancelled) === null || _handler$handlers8$on === void 0 ? void 0 : _handler$handlers8$on.call(_handler$handlers8, event, dummyStateManager);
98
+ (_handler$handlers10 = handler.handlers) === null || _handler$handlers10 === void 0 ? void 0 : (_handler$handlers10$o = _handler$handlers10.onTouchesCancelled) === null || _handler$handlers10$o === void 0 ? void 0 : _handler$handlers10$o.call(_handler$handlers10, event, dummyStateManager);
83
99
  break;
84
100
  }
85
101
  } else {
86
- var _handler$handlers$onU, _handler$handlers9;
102
+ var _handler$handlers$onU, _handler$handlers11;
87
103
 
88
- (_handler$handlers$onU = (_handler$handlers9 = handler.handlers).onUpdate) === null || _handler$handlers$onU === void 0 ? void 0 : _handler$handlers$onU.call(_handler$handlers9, event);
104
+ (_handler$handlers$onU = (_handler$handlers11 = handler.handlers).onUpdate) === null || _handler$handlers$onU === void 0 ? void 0 : _handler$handlers$onU.call(_handler$handlers11, event);
105
+
106
+ if (handler.handlers.onChange && handler.handlers.changeEventCalculator) {
107
+ var _handler$handlers$onC, _handler$handlers12, _handler$handlers$cha, _handler$handlers13;
108
+
109
+ (_handler$handlers$onC = (_handler$handlers12 = handler.handlers).onChange) === null || _handler$handlers$onC === void 0 ? void 0 : _handler$handlers$onC.call(_handler$handlers12, (_handler$handlers$cha = (_handler$handlers13 = handler.handlers).changeEventCalculator) === null || _handler$handlers$cha === void 0 ? void 0 : _handler$handlers$cha.call(_handler$handlers13, event, lastUpdateEvent[handler.handlers.handlerTag]));
110
+ lastUpdateEvent[handler.handlers.handlerTag] = event;
111
+ }
89
112
  }
90
113
  }
91
114
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["eventReceiver.ts"],"names":["gestureHandlerEventSubscription","gestureHandlerStateChangeEventSubscription","dummyStateManager","begin","console","warn","activate","end","fail","isStateChangeEvent","event","oldState","isTouchEvent","eventType","onGestureHandlerEvent","handler","handlerTag","State","UNDETERMINED","state","BEGAN","handlers","onBegin","ACTIVE","onStart","END","onEnd","FAILED","CANCELLED","EventType","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","onUpdate","startListening","stopListening","DeviceEventEmitter","addListener","removeSubscription"],"mappings":"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","sourcesContent":["import { DeviceEventEmitter, EmitterSubscription } from 'react-native';\nimport { State } from '../../State';\nimport { EventType } from '../../EventType';\nimport {\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n} from '../gestureHandlerCommon';\nimport { GestureStateManagerType } from './gestureStateManager';\nimport { findHandler } from '../handlersRegistry';\nimport { BaseGesture } from './gesture';\n\nlet gestureHandlerEventSubscription: EmitterSubscription | null = null;\nlet gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;\n\nconst dummyStateManager: GestureStateManagerType = {\n begin: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n activate: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n end: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n fail: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n};\n\nfunction isStateChangeEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureStateChangeEvent {\n // @ts-ignore oldState doesn't exist on GestureTouchEvent and that's the point\n return event.oldState != null;\n}\n\nfunction isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureTouchEvent {\n return event.eventType != null;\n}\n\nfunction onGestureHandlerEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n) {\n const handler = findHandler(event.handlerTag) as BaseGesture<\n Record<string, unknown>\n >;\n\n if (handler) {\n if (isStateChangeEvent(event)) {\n if (\n event.oldState === State.UNDETERMINED &&\n event.state === State.BEGAN\n ) {\n handler.handlers.onBegin?.(event);\n } else if (\n (event.oldState === State.BEGAN ||\n event.oldState === State.UNDETERMINED) &&\n event.state === State.ACTIVE\n ) {\n handler.handlers.onStart?.(event);\n } else if (event.oldState !== event.state && event.state === State.END) {\n handler.handlers.onEnd?.(event, true);\n } else if (\n (event.state === State.FAILED || event.state === State.CANCELLED) &&\n event.oldState !== event.state\n ) {\n handler.handlers.onEnd?.(event, false);\n }\n } else if (isTouchEvent(event)) {\n switch (event.eventType) {\n case EventType.TOUCHES_DOWN:\n handler.handlers?.onTouchesDown?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_MOVE:\n handler.handlers?.onTouchesMove?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_UP:\n handler.handlers?.onTouchesUp?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_CANCELLED:\n handler.handlers?.onTouchesCancelled?.(event, dummyStateManager);\n break;\n }\n } else {\n handler.handlers.onUpdate?.(event);\n }\n }\n}\n\nexport function startListening() {\n stopListening();\n\n gestureHandlerEventSubscription = DeviceEventEmitter.addListener(\n 'onGestureHandlerEvent',\n onGestureHandlerEvent\n );\n\n gestureHandlerStateChangeEventSubscription = DeviceEventEmitter.addListener(\n 'onGestureHandlerStateChange',\n onGestureHandlerEvent\n );\n}\n\nexport function stopListening() {\n if (gestureHandlerEventSubscription) {\n DeviceEventEmitter.removeSubscription(gestureHandlerEventSubscription);\n\n gestureHandlerEventSubscription = null;\n }\n\n if (gestureHandlerStateChangeEventSubscription) {\n DeviceEventEmitter.removeSubscription(\n gestureHandlerStateChangeEventSubscription\n );\n\n gestureHandlerStateChangeEventSubscription = null;\n }\n}\n"]}
1
+ {"version":3,"sources":["eventReceiver.ts"],"names":["gestureHandlerEventSubscription","gestureHandlerStateChangeEventSubscription","dummyStateManager","begin","console","warn","activate","end","fail","lastUpdateEvent","isStateChangeEvent","event","oldState","isTouchEvent","eventType","onGestureHandlerEvent","handler","handlerTag","State","UNDETERMINED","state","BEGAN","handlers","onBegin","ACTIVE","onStart","END","onEnd","onFinalize","undefined","FAILED","CANCELLED","EventType","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","onUpdate","onChange","changeEventCalculator","startListening","stopListening","DeviceEventEmitter","addListener","removeSubscription"],"mappings":"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","sourcesContent":["import { DeviceEventEmitter, EmitterSubscription } from 'react-native';\nimport { State } from '../../State';\nimport { EventType } from '../../EventType';\nimport {\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n} from '../gestureHandlerCommon';\nimport { GestureStateManagerType } from './gestureStateManager';\nimport { findHandler } from '../handlersRegistry';\nimport { BaseGesture } from './gesture';\n\nlet gestureHandlerEventSubscription: EmitterSubscription | null = null;\nlet gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;\n\nconst dummyStateManager: GestureStateManagerType = {\n begin: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n activate: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n end: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n fail: () => {\n console.warn(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n );\n },\n};\n\nconst lastUpdateEvent: (GestureUpdateEvent | undefined)[] = [];\n\nfunction isStateChangeEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureStateChangeEvent {\n // @ts-ignore oldState doesn't exist on GestureTouchEvent and that's the point\n return event.oldState != null;\n}\n\nfunction isTouchEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n): event is GestureTouchEvent {\n return event.eventType != null;\n}\n\nfunction onGestureHandlerEvent(\n event: GestureUpdateEvent | GestureStateChangeEvent | GestureTouchEvent\n) {\n const handler = findHandler(event.handlerTag) as BaseGesture<\n Record<string, unknown>\n >;\n\n if (handler) {\n if (isStateChangeEvent(event)) {\n if (\n event.oldState === State.UNDETERMINED &&\n event.state === State.BEGAN\n ) {\n handler.handlers.onBegin?.(event);\n } else if (\n (event.oldState === State.BEGAN ||\n event.oldState === State.UNDETERMINED) &&\n event.state === State.ACTIVE\n ) {\n handler.handlers.onStart?.(event);\n lastUpdateEvent[handler.handlers.handlerTag] = event;\n } else if (event.oldState !== event.state && event.state === State.END) {\n if (event.oldState === State.ACTIVE) {\n handler.handlers.onEnd?.(event, true);\n }\n handler.handlers.onFinalize?.(event, true);\n lastUpdateEvent[handler.handlers.handlerTag] = undefined;\n } else if (\n (event.state === State.FAILED || event.state === State.CANCELLED) &&\n event.oldState !== event.state\n ) {\n if (event.oldState === State.ACTIVE) {\n handler.handlers.onEnd?.(event, false);\n }\n handler.handlers.onFinalize?.(event, false);\n lastUpdateEvent[handler.handlers.handlerTag] = undefined;\n }\n } else if (isTouchEvent(event)) {\n switch (event.eventType) {\n case EventType.TOUCHES_DOWN:\n handler.handlers?.onTouchesDown?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_MOVE:\n handler.handlers?.onTouchesMove?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_UP:\n handler.handlers?.onTouchesUp?.(event, dummyStateManager);\n break;\n case EventType.TOUCHES_CANCELLED:\n handler.handlers?.onTouchesCancelled?.(event, dummyStateManager);\n break;\n }\n } else {\n handler.handlers.onUpdate?.(event);\n\n if (handler.handlers.onChange && handler.handlers.changeEventCalculator) {\n handler.handlers.onChange?.(\n handler.handlers.changeEventCalculator?.(\n event,\n lastUpdateEvent[handler.handlers.handlerTag]\n )\n );\n\n lastUpdateEvent[handler.handlers.handlerTag] = event;\n }\n }\n }\n}\n\nexport function startListening() {\n stopListening();\n\n gestureHandlerEventSubscription = DeviceEventEmitter.addListener(\n 'onGestureHandlerEvent',\n onGestureHandlerEvent\n );\n\n gestureHandlerStateChangeEventSubscription = DeviceEventEmitter.addListener(\n 'onGestureHandlerStateChange',\n onGestureHandlerEvent\n );\n}\n\nexport function stopListening() {\n if (gestureHandlerEventSubscription) {\n DeviceEventEmitter.removeSubscription(gestureHandlerEventSubscription);\n\n gestureHandlerEventSubscription = null;\n }\n\n if (gestureHandlerStateChangeEventSubscription) {\n DeviceEventEmitter.removeSubscription(\n gestureHandlerStateChangeEventSubscription\n );\n\n gestureHandlerStateChangeEventSubscription = null;\n }\n}\n"]}
@@ -9,6 +9,26 @@ var _gesture = require("./gesture");
9
9
 
10
10
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
11
 
12
+ function changeEventCalculator(current, previous) {
13
+ 'worklet';
14
+
15
+ let changePayload;
16
+
17
+ if (previous === undefined) {
18
+ changePayload = {
19
+ forceChange: current.force
20
+ };
21
+ } else {
22
+ changePayload = {
23
+ forceChange: current.force - previous.force
24
+ };
25
+ }
26
+
27
+ return { ...current,
28
+ ...changePayload
29
+ };
30
+ }
31
+
12
32
  class ForceTouchGesture extends _gesture.ContinousBaseGesture {
13
33
  constructor() {
14
34
  super();
@@ -33,6 +53,12 @@ class ForceTouchGesture extends _gesture.ContinousBaseGesture {
33
53
  return this;
34
54
  }
35
55
 
56
+ onChange(callback) {
57
+ // @ts-ignore TS being overprotective, ForceTouchGestureHandlerEventPayload is Record
58
+ this.handlers.changeEventCalculator = changeEventCalculator;
59
+ return super.onChange(callback);
60
+ }
61
+
36
62
  }
37
63
 
38
64
  exports.ForceTouchGesture = ForceTouchGesture;
@@ -1 +1 @@
1
- {"version":3,"sources":["forceTouchGesture.ts"],"names":["ForceTouchGesture","ContinousBaseGesture","constructor","handlerName","minForce","force","config","maxForce","feedbackOnActivation","value"],"mappings":";;;;;;;AAAA;;;;AAMO,MAAMA,iBAAN,SAAgCC,6BAAhC,CAA2F;AAGhGC,EAAAA,WAAW,GAAG;AACZ;;AADY,oCAF+C,EAE/C;;AAGZ,SAAKC,WAAL,GAAmB,0BAAnB;AACD;;AAEDC,EAAAA,QAAQ,CAACC,KAAD,EAAgB;AACtB,SAAKC,MAAL,CAAYF,QAAZ,GAAuBC,KAAvB;AACA,WAAO,IAAP;AACD;;AAEDE,EAAAA,QAAQ,CAACF,KAAD,EAAgB;AACtB,SAAKC,MAAL,CAAYC,QAAZ,GAAuBF,KAAvB;AACA,WAAO,IAAP;AACD;;AAEDG,EAAAA,oBAAoB,CAACC,KAAD,EAAiB;AACnC,SAAKH,MAAL,CAAYE,oBAAZ,GAAmCC,KAAnC;AACA,WAAO,IAAP;AACD;;AAtB+F","sourcesContent":["import { BaseGestureConfig, ContinousBaseGesture } from './gesture';\nimport {\n ForceTouchGestureConfig,\n ForceTouchGestureHandlerEventPayload,\n} from '../ForceTouchGestureHandler';\n\nexport class ForceTouchGesture extends ContinousBaseGesture<ForceTouchGestureHandlerEventPayload> {\n public config: BaseGestureConfig & ForceTouchGestureConfig = {};\n\n constructor() {\n super();\n\n this.handlerName = 'ForceTouchGestureHandler';\n }\n\n minForce(force: number) {\n this.config.minForce = force;\n return this;\n }\n\n maxForce(force: number) {\n this.config.maxForce = force;\n return this;\n }\n\n feedbackOnActivation(value: boolean) {\n this.config.feedbackOnActivation = value;\n return this;\n }\n}\n\nexport type ForceTouchGestureType = InstanceType<typeof ForceTouchGesture>;\n"]}
1
+ {"version":3,"sources":["forceTouchGesture.ts"],"names":["changeEventCalculator","current","previous","changePayload","undefined","forceChange","force","ForceTouchGesture","ContinousBaseGesture","constructor","handlerName","minForce","config","maxForce","feedbackOnActivation","value","onChange","callback","handlers"],"mappings":";;;;;;;AAAA;;;;AAWA,SAASA,qBAAT,CACEC,OADF,EAEEC,QAFF,EAGE;AACA;;AACA,MAAIC,aAAJ;;AACA,MAAID,QAAQ,KAAKE,SAAjB,EAA4B;AAC1BD,IAAAA,aAAa,GAAG;AACdE,MAAAA,WAAW,EAAEJ,OAAO,CAACK;AADP,KAAhB;AAGD,GAJD,MAIO;AACLH,IAAAA,aAAa,GAAG;AACdE,MAAAA,WAAW,EAAEJ,OAAO,CAACK,KAAR,GAAgBJ,QAAQ,CAACI;AADxB,KAAhB;AAGD;;AAED,SAAO,EAAE,GAAGL,OAAL;AAAc,OAAGE;AAAjB,GAAP;AACD;;AAEM,MAAMI,iBAAN,SAAgCC,6BAAhC,CAGL;AAGAC,EAAAA,WAAW,GAAG;AACZ;;AADY,oCAF+C,EAE/C;;AAGZ,SAAKC,WAAL,GAAmB,0BAAnB;AACD;;AAEDC,EAAAA,QAAQ,CAACL,KAAD,EAAgB;AACtB,SAAKM,MAAL,CAAYD,QAAZ,GAAuBL,KAAvB;AACA,WAAO,IAAP;AACD;;AAEDO,EAAAA,QAAQ,CAACP,KAAD,EAAgB;AACtB,SAAKM,MAAL,CAAYC,QAAZ,GAAuBP,KAAvB;AACA,WAAO,IAAP;AACD;;AAEDQ,EAAAA,oBAAoB,CAACC,KAAD,EAAiB;AACnC,SAAKH,MAAL,CAAYE,oBAAZ,GAAmCC,KAAnC;AACA,WAAO,IAAP;AACD;;AAEDC,EAAAA,QAAQ,CACNC,QADM,EASN;AACA;AACA,SAAKC,QAAL,CAAclB,qBAAd,GAAsCA,qBAAtC;AACA,WAAO,MAAMgB,QAAN,CAAeC,QAAf,CAAP;AACD;;AArCD","sourcesContent":["import { BaseGestureConfig, ContinousBaseGesture } from './gesture';\nimport {\n ForceTouchGestureConfig,\n ForceTouchGestureHandlerEventPayload,\n} from '../ForceTouchGestureHandler';\nimport { GestureUpdateEvent } from '../gestureHandlerCommon';\n\ntype ForceTouchGestureChangeEventPayload = {\n forceChange: number;\n};\n\nfunction changeEventCalculator(\n current: GestureUpdateEvent<ForceTouchGestureHandlerEventPayload>,\n previous?: GestureUpdateEvent<ForceTouchGestureHandlerEventPayload>\n) {\n 'worklet';\n let changePayload: ForceTouchGestureChangeEventPayload;\n if (previous === undefined) {\n changePayload = {\n forceChange: current.force,\n };\n } else {\n changePayload = {\n forceChange: current.force - previous.force,\n };\n }\n\n return { ...current, ...changePayload };\n}\n\nexport class ForceTouchGesture extends ContinousBaseGesture<\n ForceTouchGestureHandlerEventPayload,\n ForceTouchGestureChangeEventPayload\n> {\n public config: BaseGestureConfig & ForceTouchGestureConfig = {};\n\n constructor() {\n super();\n\n this.handlerName = 'ForceTouchGestureHandler';\n }\n\n minForce(force: number) {\n this.config.minForce = force;\n return this;\n }\n\n maxForce(force: number) {\n this.config.maxForce = force;\n return this;\n }\n\n feedbackOnActivation(value: boolean) {\n this.config.feedbackOnActivation = value;\n return this;\n }\n\n onChange(\n callback: (\n event: GestureUpdateEvent<\n GestureUpdateEvent<\n ForceTouchGestureHandlerEventPayload &\n ForceTouchGestureChangeEventPayload\n >\n >\n ) => void\n ) {\n // @ts-ignore TS being overprotective, ForceTouchGestureHandlerEventPayload is Record\n this.handlers.changeEventCalculator = changeEventCalculator;\n return super.onChange(callback);\n }\n}\n\nexport type ForceTouchGestureType = InstanceType<typeof ForceTouchGesture>;\n"]}
@@ -14,11 +14,13 @@ const CALLBACK_TYPE = {
14
14
  BEGAN: 1,
15
15
  START: 2,
16
16
  UPDATE: 3,
17
- END: 4,
18
- TOUCHES_DOWN: 5,
19
- TOUCHES_MOVE: 6,
20
- TOUCHES_UP: 7,
21
- TOUCHES_CANCELLED: 8
17
+ CHANGE: 4,
18
+ END: 5,
19
+ FINALIZE: 6,
20
+ TOUCHES_DOWN: 7,
21
+ TOUCHES_MOVE: 8,
22
+ TOUCHES_UP: 9,
23
+ TOUCHES_CANCELLED: 10
22
24
  }; // Allow using CALLBACK_TYPE as object and type
23
25
  // eslint-disable-next-line @typescript-eslint/no-redeclare
24
26
 
@@ -52,7 +54,8 @@ class BaseGesture extends Gesture {
52
54
  withRef(ref) {
53
55
  this.config.ref = ref;
54
56
  return this;
55
- }
57
+ } // eslint-disable-next-line @typescript-eslint/ban-types
58
+
56
59
 
57
60
  isWorklet(callback) {
58
61
  //@ts-ignore if callback is a worklet, the property will be available, if not then the check will return false
@@ -78,6 +81,13 @@ class BaseGesture extends Gesture {
78
81
  return this;
79
82
  }
80
83
 
84
+ onFinalize(callback) {
85
+ this.handlers.onFinalize = callback; //@ts-ignore if callback is a worklet, the property will be available, if not then the check will return false
86
+
87
+ this.handlers.isWorklet[CALLBACK_TYPE.FINALIZE] = this.isWorklet(callback);
88
+ return this;
89
+ }
90
+
81
91
  onTouchesDown(callback) {
82
92
  this.config.needsPointerData = true;
83
93
  this.handlers.onTouchesDown = callback;
@@ -166,6 +176,12 @@ class ContinousBaseGesture extends BaseGesture {
166
176
  return this;
167
177
  }
168
178
 
179
+ onChange(callback) {
180
+ this.handlers.onChange = callback;
181
+ this.handlers.isWorklet[CALLBACK_TYPE.CHANGE] = this.isWorklet(callback);
182
+ return this;
183
+ }
184
+
169
185
  manualActivation(manualActivation) {
170
186
  this.config.manualActivation = manualActivation;
171
187
  return this;