react-native-gesture-handler 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. package/android/build.gradle +2 -2
  2. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  3. package/ios/RNGestureHandler.xcodeproj/project.xcworkspace/xcuserdata/jakubpiasecki.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  4. package/ios/RNGestureHandler.xcodeproj/xcuserdata/jakubpiasecki.xcuserdatad/xcschemes/xcschememanagement.plist +19 -0
  5. package/lib/commonjs/EnableExperimentalWebImplementation.js +7 -0
  6. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +1 -1
  7. package/lib/commonjs/RNGestureHandlerModule.js +1 -1
  8. package/lib/commonjs/RNGestureHandlerModule.js.map +1 -1
  9. package/lib/commonjs/RNGestureHandlerModule.macos.js +20 -9
  10. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  11. package/lib/commonjs/RNGestureHandlerModule.web.js +23 -10
  12. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  13. package/lib/commonjs/components/GestureComponents.web.js +1 -1
  14. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  15. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  16. package/lib/commonjs/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  17. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -5
  18. package/lib/commonjs/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  19. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  20. package/lib/commonjs/handlers/gestures/eventReceiver.js +14 -20
  21. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  22. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js +32 -0
  23. package/lib/commonjs/handlers/gestures/gestureStateManager.web.js.map +1 -0
  24. package/lib/commonjs/web/detectors/RotationGestureDetector.js +13 -17
  25. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  26. package/lib/commonjs/web/detectors/ScaleGestureDetector.js +3 -14
  27. package/lib/commonjs/web/detectors/ScaleGestureDetector.js.map +1 -1
  28. package/lib/commonjs/web/handlers/FlingGestureHandler.js +37 -12
  29. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  30. package/lib/commonjs/web/handlers/GestureHandler.js +282 -79
  31. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  32. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +23 -18
  33. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  34. package/lib/commonjs/web/handlers/ManualGestureHandler.js +51 -0
  35. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -0
  36. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +81 -22
  37. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  38. package/lib/commonjs/web/handlers/PanGestureHandler.js +57 -40
  39. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  40. package/lib/commonjs/web/handlers/PinchGestureHandler.js +43 -34
  41. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  42. package/lib/commonjs/web/handlers/RotationGestureHandler.js +45 -39
  43. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  44. package/lib/commonjs/web/handlers/TapGestureHandler.js +52 -50
  45. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  46. package/lib/commonjs/web/interfaces.js +22 -1
  47. package/lib/commonjs/web/interfaces.js.map +1 -1
  48. package/lib/commonjs/web/tools/EventManager.js +40 -96
  49. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  50. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js +109 -30
  51. package/lib/commonjs/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  52. package/lib/commonjs/web/tools/InteractionManager.js +24 -10
  53. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  54. package/lib/commonjs/web/tools/NodeManager.js.map +1 -1
  55. package/lib/commonjs/web/tools/PointerEventManager.js +130 -0
  56. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -0
  57. package/lib/commonjs/web/tools/PointerTracker.js +97 -7
  58. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  59. package/lib/commonjs/web/tools/TouchEventManager.js +138 -0
  60. package/lib/commonjs/web/tools/TouchEventManager.js.map +1 -0
  61. package/lib/commonjs/web/utils.js +15 -0
  62. package/lib/commonjs/web/utils.js.map +1 -0
  63. package/lib/module/EnableExperimentalWebImplementation.js +5 -0
  64. package/lib/module/EnableExperimentalWebImplementation.js.map +1 -1
  65. package/lib/module/RNGestureHandlerModule.js +1 -1
  66. package/lib/module/RNGestureHandlerModule.js.map +1 -1
  67. package/lib/module/RNGestureHandlerModule.macos.js +19 -10
  68. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  69. package/lib/module/RNGestureHandlerModule.web.js +22 -11
  70. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  71. package/lib/module/components/GestureComponents.web.js +1 -1
  72. package/lib/module/components/GestureComponents.web.js.map +1 -1
  73. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js +1 -5
  74. package/lib/module/fabric/RNGestureHandlerButtonNativeComponent.js.map +1 -1
  75. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js +1 -4
  76. package/lib/module/fabric/RNGestureHandlerRootViewNativeComponent.js.map +1 -1
  77. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  78. package/lib/module/handlers/gestures/eventReceiver.js +14 -20
  79. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  80. package/lib/module/handlers/gestures/gestureStateManager.web.js +21 -0
  81. package/lib/module/handlers/gestures/gestureStateManager.web.js.map +1 -0
  82. package/lib/module/web/detectors/RotationGestureDetector.js +13 -17
  83. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  84. package/lib/module/web/detectors/ScaleGestureDetector.js +3 -14
  85. package/lib/module/web/detectors/ScaleGestureDetector.js.map +1 -1
  86. package/lib/module/web/handlers/FlingGestureHandler.js +37 -12
  87. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  88. package/lib/module/web/handlers/GestureHandler.js +276 -79
  89. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  90. package/lib/module/web/handlers/LongPressGestureHandler.js +23 -18
  91. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  92. package/lib/module/web/handlers/ManualGestureHandler.js +39 -0
  93. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -0
  94. package/lib/module/web/handlers/NativeViewGestureHandler.js +80 -22
  95. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  96. package/lib/module/web/handlers/PanGestureHandler.js +57 -41
  97. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  98. package/lib/module/web/handlers/PinchGestureHandler.js +43 -33
  99. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  100. package/lib/module/web/handlers/RotationGestureHandler.js +45 -38
  101. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  102. package/lib/module/web/handlers/TapGestureHandler.js +52 -50
  103. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  104. package/lib/module/web/interfaces.js +19 -0
  105. package/lib/module/web/interfaces.js.map +1 -1
  106. package/lib/module/web/tools/EventManager.js +39 -95
  107. package/lib/module/web/tools/EventManager.js.map +1 -1
  108. package/lib/module/web/tools/GestureHandlerOrchestrator.js +107 -30
  109. package/lib/module/web/tools/GestureHandlerOrchestrator.js.map +1 -1
  110. package/lib/module/web/tools/InteractionManager.js +24 -10
  111. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  112. package/lib/module/web/tools/NodeManager.js.map +1 -1
  113. package/lib/module/web/tools/PointerEventManager.js +116 -0
  114. package/lib/module/web/tools/PointerEventManager.js.map +1 -0
  115. package/lib/module/web/tools/PointerTracker.js +97 -7
  116. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  117. package/lib/module/web/tools/TouchEventManager.js +124 -0
  118. package/lib/module/web/tools/TouchEventManager.js.map +1 -0
  119. package/lib/module/web/utils.js +8 -0
  120. package/lib/module/web/utils.js.map +1 -0
  121. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +5 -2
  122. package/lib/typescript/RNGestureHandlerModule.web.d.ts +5 -2
  123. package/lib/typescript/components/touchables/TouchableNativeFeedback.android.d.ts +1 -1
  124. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +3 -3
  125. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +3 -2
  126. package/lib/typescript/handlers/gestures/gestureStateManager.web.d.ts +4 -0
  127. package/lib/typescript/web/detectors/RotationGestureDetector.d.ts +7 -7
  128. package/lib/typescript/web/detectors/ScaleGestureDetector.d.ts +6 -7
  129. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +12 -10
  130. package/lib/typescript/web/handlers/GestureHandler.d.ts +41 -32
  131. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +6 -9
  132. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +11 -0
  133. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +15 -6
  134. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +15 -23
  135. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +11 -12
  136. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +12 -12
  137. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +11 -14
  138. package/lib/typescript/web/interfaces.d.ts +50 -10
  139. package/lib/typescript/web/tools/EventManager.d.ts +28 -26
  140. package/lib/typescript/web/tools/GestureHandlerOrchestrator.d.ts +4 -2
  141. package/lib/typescript/web/tools/InteractionManager.d.ts +3 -0
  142. package/lib/typescript/web/tools/NodeManager.d.ts +3 -3
  143. package/lib/typescript/web/tools/PointerEventManager.d.ts +6 -0
  144. package/lib/typescript/web/tools/PointerTracker.d.ts +29 -5
  145. package/lib/typescript/web/tools/TouchEventManager.d.ts +6 -0
  146. package/lib/typescript/web/utils.d.ts +4 -0
  147. package/package.json +2 -2
  148. package/src/EnableExperimentalWebImplementation.ts +9 -0
  149. package/src/RNGestureHandlerModule.macos.ts +25 -10
  150. package/src/RNGestureHandlerModule.ts +4 -1
  151. package/src/RNGestureHandlerModule.web.ts +20 -7
  152. package/src/components/GestureComponents.web.tsx +1 -1
  153. package/src/fabric/RNGestureHandlerButtonNativeComponent.ts +2 -12
  154. package/src/fabric/RNGestureHandlerRootViewNativeComponent.ts +2 -8
  155. package/src/handlers/gestures/GestureDetector.tsx +0 -1
  156. package/src/handlers/gestures/eventReceiver.ts +23 -24
  157. package/src/handlers/gestures/gestureStateManager.web.ts +24 -0
  158. package/src/web/detectors/RotationGestureDetector.ts +20 -52
  159. package/src/web/detectors/ScaleGestureDetector.ts +9 -45
  160. package/src/web/handlers/FlingGestureHandler.ts +45 -22
  161. package/src/web/handlers/GestureHandler.ts +306 -97
  162. package/src/web/handlers/LongPressGestureHandler.ts +30 -24
  163. package/src/web/handlers/ManualGestureHandler.ts +39 -0
  164. package/src/web/handlers/NativeViewGestureHandler.ts +81 -24
  165. package/src/web/handlers/PanGestureHandler.ts +68 -53
  166. package/src/web/handlers/PinchGestureHandler.ts +47 -44
  167. package/src/web/handlers/RotationGestureHandler.ts +52 -51
  168. package/src/web/handlers/TapGestureHandler.ts +74 -56
  169. package/src/web/interfaces.ts +57 -10
  170. package/src/web/tools/EventManager.ts +58 -148
  171. package/src/web/tools/GestureHandlerOrchestrator.ts +115 -47
  172. package/src/web/tools/InteractionManager.ts +25 -9
  173. package/src/web/tools/NodeManager.ts +6 -6
  174. package/src/web/tools/PointerEventManager.ts +134 -0
  175. package/src/web/tools/PointerTracker.ts +120 -10
  176. package/src/web/tools/TouchEventManager.ts +167 -0
  177. package/src/web/utils.ts +8 -0
@@ -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","_reactInternals","elementType","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, 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\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, @typescript-eslint/no-unsafe-member-access\n const wrapType = ref._reactInternals.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","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","_reactInternals","elementType","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, 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, @typescript-eslint/no-unsafe-member-access\n const wrapType = ref._reactInternals.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"]}
@@ -15,25 +15,11 @@ var _TouchEventType = require("../../TouchEventType");
15
15
 
16
16
  var _handlersRegistry = require("../handlersRegistry");
17
17
 
18
- var _utils = require("../../utils");
18
+ var _gestureStateManager = require("./gestureStateManager");
19
19
 
20
20
  let gestureHandlerEventSubscription = null;
21
21
  let gestureHandlerStateChangeEventSubscription = null;
22
- const warningMessage = (0, _utils.tagMessage)('You have to use react-native-reanimated in order to control the state of the gesture.');
23
- const dummyStateManager = {
24
- begin: () => {
25
- console.warn(warningMessage);
26
- },
27
- activate: () => {
28
- console.warn(warningMessage);
29
- },
30
- end: () => {
31
- console.warn(warningMessage);
32
- },
33
- fail: () => {
34
- console.warn(warningMessage);
35
- }
36
- };
22
+ const gestureStateManagers = new Map();
37
23
  const lastUpdateEvent = [];
38
24
 
39
25
  function isStateChangeEvent(event) {
@@ -82,24 +68,32 @@ function onGestureHandlerEvent(event) {
82
68
  }
83
69
 
84
70
  (_handler$handlers$onF2 = (_handler$handlers6 = handler.handlers).onFinalize) === null || _handler$handlers$onF2 === void 0 ? void 0 : _handler$handlers$onF2.call(_handler$handlers6, event, false);
71
+ gestureStateManagers.delete(event.handlerTag);
85
72
  lastUpdateEvent[handler.handlers.handlerTag] = undefined;
86
73
  }
87
74
  } else if (isTouchEvent(event)) {
75
+ if (!gestureStateManagers.has(event.handlerTag)) {
76
+ gestureStateManagers.set(event.handlerTag, _gestureStateManager.GestureStateManager.create(event.handlerTag));
77
+ } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
78
+
79
+
80
+ const manager = gestureStateManagers.get(event.handlerTag);
81
+
88
82
  switch (event.eventType) {
89
83
  case _TouchEventType.TouchEventType.TOUCHES_DOWN:
90
- (_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);
84
+ (_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, manager);
91
85
  break;
92
86
 
93
87
  case _TouchEventType.TouchEventType.TOUCHES_MOVE:
94
- (_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);
88
+ (_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, manager);
95
89
  break;
96
90
 
97
91
  case _TouchEventType.TouchEventType.TOUCHES_UP:
98
- (_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);
92
+ (_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, manager);
99
93
  break;
100
94
 
101
95
  case _TouchEventType.TouchEventType.TOUCHES_CANCELLED:
102
- (_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);
96
+ (_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, manager);
103
97
  break;
104
98
  }
105
99
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["eventReceiver.ts"],"names":["gestureHandlerEventSubscription","gestureHandlerStateChangeEventSubscription","warningMessage","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","TouchEventType","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","onUpdate","onChange","changeEventCalculator","oldHandler","nativeEvent","onGestureStateChange","onGestureEvent","startListening","stopListening","DeviceEventEmitter","addListener","remove"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AAOA;;AAEA;;AAEA,IAAIA,+BAA2D,GAAG,IAAlE;AACA,IAAIC,0CAAsE,GAAG,IAA7E;AAEA,MAAMC,cAAc,GAAG,uBACrB,uFADqB,CAAvB;AAIA,MAAMC,iBAA0C,GAAG;AACjDC,EAAAA,KAAK,EAAE,MAAM;AACXC,IAAAA,OAAO,CAACC,IAAR,CAAaJ,cAAb;AACD,GAHgD;AAIjDK,EAAAA,QAAQ,EAAE,MAAM;AACdF,IAAAA,OAAO,CAACC,IAAR,CAAaJ,cAAb;AACD,GANgD;AAOjDM,EAAAA,GAAG,EAAE,MAAM;AACTH,IAAAA,OAAO,CAACC,IAAR,CAAaJ,cAAb;AACD,GATgD;AAUjDO,EAAAA,IAAI,EAAE,MAAM;AACVJ,IAAAA,OAAO,CAACC,IAAR,CAAaJ,cAAb;AACD;AAZgD,CAAnD;AAeA,MAAMQ,eAAmD,GAAG,EAA5D;;AAEA,SAASC,kBAAT,CACEC,KADF,EAEoC;AAClC;AACA,SAAOA,KAAK,CAACC,QAAN,IAAkB,IAAzB;AACD;;AAED,SAASC,YAAT,CACEF,KADF,EAE8B;AAC5B,SAAOA,KAAK,CAACG,SAAN,IAAmB,IAA1B;AACD;;AAEM,SAASC,qBAAT,CACLJ,KADK,EAEL;AAAA;;AACA,QAAMK,OAAO,GAAG,mCAAYL,KAAK,CAACM,UAAlB,CAAhB;;AAIA,MAAID,OAAJ,EAAa;AACX,QAAIN,kBAAkB,CAACC,KAAD,CAAtB,EAA+B;AAC7B,UACEA,KAAK,CAACC,QAAN,KAAmBM,aAAMC,YAAzB,IACAR,KAAK,CAACS,KAAN,KAAgBF,aAAMG,KAFxB,EAGE;AAAA;;AACA,sDAAAL,OAAO,CAACM,QAAR,EAAiBC,OAAjB,wGAA2BZ,KAA3B;AACD,OALD,MAKO,IACL,CAACA,KAAK,CAACC,QAAN,KAAmBM,aAAMG,KAAzB,IACCV,KAAK,CAACC,QAAN,KAAmBM,aAAMC,YAD3B,KAEAR,KAAK,CAACS,KAAN,KAAgBF,aAAMM,MAHjB,EAIL;AAAA;;AACA,uDAAAR,OAAO,CAACM,QAAR,EAAiBG,OAAjB,yGAA2Bd,KAA3B;AACAF,QAAAA,eAAe,CAACO,OAAO,CAACM,QAAR,CAAiBL,UAAlB,CAAf,GAA+CN,KAA/C;AACD,OAPM,MAOA,IAAIA,KAAK,CAACC,QAAN,KAAmBD,KAAK,CAACS,KAAzB,IAAkCT,KAAK,CAACS,KAAN,KAAgBF,aAAMQ,GAA5D,EAAiE;AAAA;;AACtE,YAAIf,KAAK,CAACC,QAAN,KAAmBM,aAAMM,MAA7B,EAAqC;AAAA;;AACnC,yDAAAR,OAAO,CAACM,QAAR,EAAiBK,KAAjB,yGAAyBhB,KAAzB,EAAgC,IAAhC;AACD;;AACD,uDAAAK,OAAO,CAACM,QAAR,EAAiBM,UAAjB,yGAA8BjB,KAA9B,EAAqC,IAArC;AACAF,QAAAA,eAAe,CAACO,OAAO,CAACM,QAAR,CAAiBL,UAAlB,CAAf,GAA+CY,SAA/C;AACD,OANM,MAMA,IACL,CAAClB,KAAK,CAACS,KAAN,KAAgBF,aAAMY,MAAtB,IAAgCnB,KAAK,CAACS,KAAN,KAAgBF,aAAMa,SAAvD,KACApB,KAAK,CAACC,QAAN,KAAmBD,KAAK,CAACS,KAFpB,EAGL;AAAA;;AACA,YAAIT,KAAK,CAACC,QAAN,KAAmBM,aAAMM,MAA7B,EAAqC;AAAA;;AACnC,0DAAAR,OAAO,CAACM,QAAR,EAAiBK,KAAjB,2GAAyBhB,KAAzB,EAAgC,KAAhC;AACD;;AACD,wDAAAK,OAAO,CAACM,QAAR,EAAiBM,UAAjB,2GAA8BjB,KAA9B,EAAqC,KAArC;AACAF,QAAAA,eAAe,CAACO,OAAO,CAACM,QAAR,CAAiBL,UAAlB,CAAf,GAA+CY,SAA/C;AACD;AACF,KA7BD,MA6BO,IAAIhB,YAAY,CAACF,KAAD,CAAhB,EAAyB;AAC9B,cAAQA,KAAK,CAACG,SAAd;AACE,aAAKkB,+BAAeC,YAApB;AACE,gCAAAjB,OAAO,CAACM,QAAR,mGAAkBY,aAAlB,yGAAkCvB,KAAlC,EAAyCT,iBAAzC;AACA;;AACF,aAAK8B,+BAAeG,YAApB;AACE,gCAAAnB,OAAO,CAACM,QAAR,mGAAkBc,aAAlB,yGAAkCzB,KAAlC,EAAyCT,iBAAzC;AACA;;AACF,aAAK8B,+BAAeK,UAApB;AACE,gCAAArB,OAAO,CAACM,QAAR,mGAAkBgB,WAAlB,yGAAgC3B,KAAhC,EAAuCT,iBAAvC;AACA;;AACF,aAAK8B,+BAAeO,iBAApB;AACE,iCAAAvB,OAAO,CAACM,QAAR,qGAAkBkB,kBAAlB,0GAAuC7B,KAAvC,EAA8CT,iBAA9C;AACA;AAZJ;AAcD,KAfM,MAeA;AAAA;;AACL,sDAAAc,OAAO,CAACM,QAAR,EAAiBmB,QAAjB,0GAA4B9B,KAA5B;;AAEA,UAAIK,OAAO,CAACM,QAAR,CAAiBoB,QAAjB,IAA6B1B,OAAO,CAACM,QAAR,CAAiBqB,qBAAlD,EAAyE;AAAA;;AACvE,wDAAA3B,OAAO,CAACM,QAAR,EAAiBoB,QAAjB,mIACE,uBAAA1B,OAAO,CAACM,QAAR,EAAiBqB,qBADnB,0DACE,gDACEhC,KADF,EAEEF,eAAe,CAACO,OAAO,CAACM,QAAR,CAAiBL,UAAlB,CAFjB,CADF;AAOAR,QAAAA,eAAe,CAACO,OAAO,CAACM,QAAR,CAAiBL,UAAlB,CAAf,GAA+CN,KAA/C;AACD;AACF;AACF,GA3DD,MA2DO;AACL,UAAMiC,UAAU,GAAG,6CAAsBjC,KAAK,CAACM,UAA5B,CAAnB;;AACA,QAAI2B,UAAJ,EAAgB;AACd,YAAMC,WAAW,GAAG;AAAEA,QAAAA,WAAW,EAAElC;AAAf,OAApB;;AACA,UAAID,kBAAkB,CAACC,KAAD,CAAtB,EAA+B;AAC7BiC,QAAAA,UAAU,CAACE,oBAAX,CAAgCD,WAAhC;AACD,OAFD,MAEO;AACLD,QAAAA,UAAU,CAACG,cAAX,CAA0BF,WAA1B;AACD;;AACD;AACD;AACF;AACF;;AAEM,SAASG,cAAT,GAA0B;AAC/BC,EAAAA,aAAa;AAEblD,EAAAA,+BAA+B,GAAGmD,gCAAmBC,WAAnB,CAChC,uBADgC,EAEhCpC,qBAFgC,CAAlC;AAKAf,EAAAA,0CAA0C,GAAGkD,gCAAmBC,WAAnB,CAC3C,6BAD2C,EAE3CpC,qBAF2C,CAA7C;AAID;;AAEM,SAASkC,aAAT,GAAyB;AAC9B,MAAIlD,+BAAJ,EAAqC;AACnCA,IAAAA,+BAA+B,CAACqD,MAAhC;AACArD,IAAAA,+BAA+B,GAAG,IAAlC;AACD;;AAED,MAAIC,0CAAJ,EAAgD;AAC9CA,IAAAA,0CAA0C,CAACoD,MAA3C;AACApD,IAAAA,0CAA0C,GAAG,IAA7C;AACD;AACF","sourcesContent":["import { DeviceEventEmitter, EmitterSubscription } from 'react-native';\nimport { State } from '../../State';\nimport { TouchEventType } from '../../TouchEventType';\nimport {\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n} from '../gestureHandlerCommon';\nimport { GestureStateManagerType } from './gestureStateManager';\nimport { findHandler, findOldGestureHandler } from '../handlersRegistry';\nimport { BaseGesture } from './gesture';\nimport { tagMessage } from '../../utils';\n\nlet gestureHandlerEventSubscription: EmitterSubscription | null = null;\nlet gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;\n\nconst warningMessage = tagMessage(\n 'You have to use react-native-reanimated in order to control the state of the gesture.'\n);\n\nconst dummyStateManager: GestureStateManagerType = {\n begin: () => {\n console.warn(warningMessage);\n },\n activate: () => {\n console.warn(warningMessage);\n },\n end: () => {\n console.warn(warningMessage);\n },\n fail: () => {\n console.warn(warningMessage);\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\nexport function 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 TouchEventType.TOUCHES_DOWN:\n handler.handlers?.onTouchesDown?.(event, dummyStateManager);\n break;\n case TouchEventType.TOUCHES_MOVE:\n handler.handlers?.onTouchesMove?.(event, dummyStateManager);\n break;\n case TouchEventType.TOUCHES_UP:\n handler.handlers?.onTouchesUp?.(event, dummyStateManager);\n break;\n case TouchEventType.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 } else {\n const oldHandler = findOldGestureHandler(event.handlerTag);\n if (oldHandler) {\n const nativeEvent = { nativeEvent: event };\n if (isStateChangeEvent(event)) {\n oldHandler.onGestureStateChange(nativeEvent);\n } else {\n oldHandler.onGestureEvent(nativeEvent);\n }\n return;\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 gestureHandlerEventSubscription.remove();\n gestureHandlerEventSubscription = null;\n }\n\n if (gestureHandlerStateChangeEventSubscription) {\n gestureHandlerStateChangeEventSubscription.remove();\n gestureHandlerStateChangeEventSubscription = null;\n }\n}\n"]}
1
+ {"version":3,"sources":["eventReceiver.ts"],"names":["gestureHandlerEventSubscription","gestureHandlerStateChangeEventSubscription","gestureStateManagers","Map","lastUpdateEvent","isStateChangeEvent","event","oldState","isTouchEvent","eventType","onGestureHandlerEvent","handler","handlerTag","State","UNDETERMINED","state","BEGAN","handlers","onBegin","ACTIVE","onStart","END","onEnd","onFinalize","undefined","FAILED","CANCELLED","delete","has","set","GestureStateManager","create","manager","get","TouchEventType","TOUCHES_DOWN","onTouchesDown","TOUCHES_MOVE","onTouchesMove","TOUCHES_UP","onTouchesUp","TOUCHES_CANCELLED","onTouchesCancelled","onUpdate","onChange","changeEventCalculator","oldHandler","nativeEvent","onGestureStateChange","onGestureEvent","startListening","stopListening","DeviceEventEmitter","addListener","remove"],"mappings":"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","sourcesContent":["import { DeviceEventEmitter, EmitterSubscription } from 'react-native';\nimport { State } from '../../State';\nimport { TouchEventType } from '../../TouchEventType';\nimport {\n GestureTouchEvent,\n GestureUpdateEvent,\n GestureStateChangeEvent,\n} from '../gestureHandlerCommon';\nimport { findHandler, findOldGestureHandler } from '../handlersRegistry';\nimport { BaseGesture } from './gesture';\nimport {\n GestureStateManager,\n GestureStateManagerType,\n} from './gestureStateManager';\n\nlet gestureHandlerEventSubscription: EmitterSubscription | null = null;\nlet gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;\n\nconst gestureStateManagers: Map<number, GestureStateManagerType> = new Map<\n number,\n GestureStateManagerType\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\nexport function 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 gestureStateManagers.delete(event.handlerTag);\n lastUpdateEvent[handler.handlers.handlerTag] = undefined;\n }\n } else if (isTouchEvent(event)) {\n if (!gestureStateManagers.has(event.handlerTag)) {\n gestureStateManagers.set(\n event.handlerTag,\n GestureStateManager.create(event.handlerTag)\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const manager = gestureStateManagers.get(event.handlerTag)!;\n\n switch (event.eventType) {\n case TouchEventType.TOUCHES_DOWN:\n handler.handlers?.onTouchesDown?.(event, manager);\n break;\n case TouchEventType.TOUCHES_MOVE:\n handler.handlers?.onTouchesMove?.(event, manager);\n break;\n case TouchEventType.TOUCHES_UP:\n handler.handlers?.onTouchesUp?.(event, manager);\n break;\n case TouchEventType.TOUCHES_CANCELLED:\n handler.handlers?.onTouchesCancelled?.(event, manager);\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 } else {\n const oldHandler = findOldGestureHandler(event.handlerTag);\n if (oldHandler) {\n const nativeEvent = { nativeEvent: event };\n if (isStateChangeEvent(event)) {\n oldHandler.onGestureStateChange(nativeEvent);\n } else {\n oldHandler.onGestureEvent(nativeEvent);\n }\n return;\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 gestureHandlerEventSubscription.remove();\n gestureHandlerEventSubscription = null;\n }\n\n if (gestureHandlerStateChangeEventSubscription) {\n gestureHandlerStateChangeEventSubscription.remove();\n gestureHandlerStateChangeEventSubscription = null;\n }\n}\n"]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GestureStateManager = void 0;
7
+
8
+ var _NodeManager = _interopRequireDefault(require("../../web/tools/NodeManager"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ const GestureStateManager = {
13
+ create(handlerTag) {
14
+ return {
15
+ begin: () => {
16
+ _NodeManager.default.getHandler(handlerTag).begin();
17
+ },
18
+ activate: () => {
19
+ _NodeManager.default.getHandler(handlerTag).activate();
20
+ },
21
+ fail: () => {
22
+ _NodeManager.default.getHandler(handlerTag).fail();
23
+ },
24
+ end: () => {
25
+ _NodeManager.default.getHandler(handlerTag).end();
26
+ }
27
+ };
28
+ }
29
+
30
+ };
31
+ exports.GestureStateManager = GestureStateManager;
32
+ //# sourceMappingURL=gestureStateManager.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["gestureStateManager.web.ts"],"names":["GestureStateManager","create","handlerTag","begin","NodeManager","getHandler","activate","fail","end"],"mappings":";;;;;;;AAAA;;;;AAGO,MAAMA,mBAAmB,GAAG;AACjCC,EAAAA,MAAM,CAACC,UAAD,EAA8C;AAClD,WAAO;AACLC,MAAAA,KAAK,EAAE,MAAM;AACXC,6BAAYC,UAAZ,CAAuBH,UAAvB,EAAmCC,KAAnC;AACD,OAHI;AAKLG,MAAAA,QAAQ,EAAE,MAAM;AACdF,6BAAYC,UAAZ,CAAuBH,UAAvB,EAAmCI,QAAnC;AACD,OAPI;AASLC,MAAAA,IAAI,EAAE,MAAM;AACVH,6BAAYC,UAAZ,CAAuBH,UAAvB,EAAmCK,IAAnC;AACD,OAXI;AAaLC,MAAAA,GAAG,EAAE,MAAM;AACTJ,6BAAYC,UAAZ,CAAuBH,UAAvB,EAAmCM,GAAnC;AACD;AAfI,KAAP;AAiBD;;AAnBgC,CAA5B","sourcesContent":["import NodeManager from '../../web/tools/NodeManager';\nimport { GestureStateManagerType } from './gestureStateManager';\n\nexport const GestureStateManager = {\n create(handlerTag: number): GestureStateManagerType {\n return {\n begin: () => {\n NodeManager.getHandler(handlerTag).begin();\n },\n\n activate: () => {\n NodeManager.getHandler(handlerTag).activate();\n },\n\n fail: () => {\n NodeManager.getHandler(handlerTag).fail();\n },\n\n end: () => {\n NodeManager.getHandler(handlerTag).end();\n },\n };\n },\n};\n"]}
@@ -68,14 +68,14 @@ class RotationGestureDetector {
68
68
  }
69
69
  }
70
70
 
71
- finish(event) {
71
+ finish() {
72
72
  if (!this.isInProgress) {
73
73
  return;
74
74
  }
75
75
 
76
76
  this.isInProgress = false;
77
77
  this.keyPointers = [NaN, NaN];
78
- this.onRotationEnd(this, event);
78
+ this.onRotationEnd(this);
79
79
  }
80
80
 
81
81
  setKeyPointers(tracker) {
@@ -89,8 +89,6 @@ class RotationGestureDetector {
89
89
  }
90
90
 
91
91
  onTouchEvent(event, tracker) {
92
- this.adaptEvent(event, tracker);
93
-
94
92
  switch (event.eventType) {
95
93
  case _interfaces.EventTypes.DOWN:
96
94
  this.isInProgress = false;
@@ -115,7 +113,7 @@ class RotationGestureDetector {
115
113
  }
116
114
 
117
115
  this.updateCurrent(event, tracker);
118
- this.onRotation(this, event);
116
+ this.onRotation(this);
119
117
  break;
120
118
 
121
119
  case _interfaces.EventTypes.ADDITIONAL_POINTER_UP:
@@ -124,29 +122,22 @@ class RotationGestureDetector {
124
122
  }
125
123
 
126
124
  if (this.keyPointers.indexOf(event.pointerId) >= 0) {
127
- this.finish(event);
125
+ this.finish();
128
126
  }
129
127
 
130
128
  break;
131
129
 
132
130
  case _interfaces.EventTypes.UP:
133
- this.finish(event);
131
+ if (this.isInProgress) {
132
+ this.finish();
133
+ }
134
+
134
135
  break;
135
136
  }
136
137
 
137
138
  return true;
138
139
  }
139
140
 
140
- adaptEvent(event, tracker) {
141
- if (tracker.getTrackedPointersCount() && event.eventType === _interfaces.EventTypes.DOWN) {
142
- event.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_DOWN;
143
- }
144
-
145
- if (tracker.getTrackedPointersCount() > 1 && event.eventType === _interfaces.EventTypes.UP) {
146
- event.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_UP;
147
- }
148
- }
149
-
150
141
  getTimeDelta() {
151
142
  return this.currentTime + this.previousTime;
152
143
  }
@@ -163,6 +154,11 @@ class RotationGestureDetector {
163
154
  return this.rotation;
164
155
  }
165
156
 
157
+ reset() {
158
+ this.keyPointers = [NaN, NaN];
159
+ this.isInProgress = false;
160
+ }
161
+
166
162
  }
167
163
 
168
164
  exports.default = RotationGestureDetector;
@@ -1 +1 @@
1
- {"version":3,"sources":["RotationGestureDetector.ts"],"names":["RotationGestureDetector","constructor","callbacks","NaN","onRotationBegin","onRotation","onRotationEnd","updateCurrent","event","tracker","previousTime","currentTime","time","firstPointerID","secondPointerID","keyPointers","firstPointerX","getLastX","firstPointerY","getLastY","secondPointerX","secondPointerY","vectorX","vectorY","anchorX","anchorY","angle","Math","atan2","rotation","Number","isNaN","previousAngle","PI","finish","isInProgress","setKeyPointers","pointerIDs","getData","keys","next","value","onTouchEvent","adaptEvent","eventType","EventTypes","DOWN","ADDITIONAL_POINTER_DOWN","MOVE","ADDITIONAL_POINTER_UP","indexOf","pointerId","UP","getTrackedPointersCount","getTimeDelta","getAnchorX","getAnchorY","getRotation"],"mappings":"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","sourcesContent":["import { AdaptedPointerEvent, EventTypes } from '../interfaces';\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface RotationGestureListener {\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (\n detector: RotationGestureDetector,\n event: AdaptedPointerEvent\n ) => boolean;\n onRotationEnd: (\n detector: RotationGestureDetector,\n event: AdaptedPointerEvent\n ) => void;\n}\n\nexport default class RotationGestureDetector\n implements RotationGestureListener {\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (\n detector: RotationGestureDetector,\n event: AdaptedPointerEvent\n ) => boolean;\n onRotationEnd: (\n detector: RotationGestureDetector,\n event: AdaptedPointerEvent\n ) => void;\n\n private currentTime = 0;\n private previousTime = 0;\n\n private previousAngle = 0;\n private rotation = 0;\n\n private anchorX = 0;\n private anchorY = 0;\n\n private isInProgress = false;\n\n private keyPointers: number[] = [NaN, NaN];\n\n constructor(callbacks: RotationGestureListener) {\n this.onRotationBegin = callbacks.onRotationBegin;\n this.onRotation = callbacks.onRotation;\n this.onRotationEnd = callbacks.onRotationEnd;\n }\n\n private updateCurrent(\n event: AdaptedPointerEvent,\n tracker: PointerTracker\n ): void {\n this.previousTime = this.currentTime;\n this.currentTime = event.time;\n\n const [firstPointerID, secondPointerID] = this.keyPointers;\n\n const firstPointerX: number = tracker.getLastX(firstPointerID);\n const firstPointerY: number = tracker.getLastY(firstPointerID);\n const secondPointerX: number = tracker.getLastX(secondPointerID);\n const secondPointerY: number = tracker.getLastY(secondPointerID);\n\n const vectorX: number = secondPointerX - firstPointerX;\n const vectorY: number = secondPointerY - firstPointerY;\n\n this.anchorX = (firstPointerX + secondPointerX) / 2;\n this.anchorY = (firstPointerY + secondPointerY) / 2;\n\n //Angle diff should be positive when rotating in clockwise direction\n const angle: number = -Math.atan2(vectorY, vectorX);\n this.rotation = Number.isNaN(this.previousAngle)\n ? 0\n : this.previousAngle - angle;\n\n this.previousAngle = angle;\n\n if (this.rotation > Math.PI) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI) {\n this.rotation += Math.PI;\n }\n\n if (this.rotation > Math.PI / 2) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI / 2) {\n this.rotation += Math.PI;\n }\n }\n\n private finish(event: AdaptedPointerEvent): void {\n if (!this.isInProgress) {\n return;\n }\n\n this.isInProgress = false;\n this.keyPointers = [NaN, NaN];\n this.onRotationEnd(this, event);\n }\n\n private setKeyPointers(tracker: PointerTracker): void {\n if (this.keyPointers[0] && this.keyPointers[1]) {\n return;\n }\n\n const pointerIDs: IterableIterator<number> = tracker.getData().keys();\n\n this.keyPointers[0] = pointerIDs.next().value as number;\n this.keyPointers[1] = pointerIDs.next().value as number;\n }\n\n public onTouchEvent(\n event: AdaptedPointerEvent,\n tracker: PointerTracker\n ): boolean {\n this.adaptEvent(event, tracker);\n\n switch (event.eventType) {\n case EventTypes.DOWN:\n this.isInProgress = false;\n break;\n\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n if (this.isInProgress) {\n break;\n }\n\n this.isInProgress = true;\n\n this.previousTime = event.time;\n this.previousAngle = NaN;\n\n this.setKeyPointers(tracker);\n\n this.updateCurrent(event, tracker);\n this.onRotationBegin(this);\n break;\n\n case EventTypes.MOVE:\n if (!this.isInProgress) {\n break;\n }\n\n this.updateCurrent(event, tracker);\n this.onRotation(this, event);\n\n break;\n\n case EventTypes.ADDITIONAL_POINTER_UP:\n if (!this.isInProgress) {\n break;\n }\n\n if (this.keyPointers.indexOf(event.pointerId) >= 0) {\n this.finish(event);\n }\n\n break;\n\n case EventTypes.UP:\n this.finish(event);\n break;\n }\n\n return true;\n }\n\n private adaptEvent(\n event: AdaptedPointerEvent,\n tracker: PointerTracker\n ): void {\n if (\n tracker.getTrackedPointersCount() &&\n event.eventType === EventTypes.DOWN\n ) {\n event.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;\n }\n\n if (\n tracker.getTrackedPointersCount() > 1 &&\n event.eventType === EventTypes.UP\n ) {\n event.eventType = EventTypes.ADDITIONAL_POINTER_UP;\n }\n }\n\n public getTimeDelta(): number {\n return this.currentTime + this.previousTime;\n }\n\n public getAnchorX(): number {\n return this.anchorX;\n }\n\n public getAnchorY(): number {\n return this.anchorY;\n }\n\n public getRotation(): number {\n return this.rotation;\n }\n}\n"]}
1
+ {"version":3,"sources":["RotationGestureDetector.ts"],"names":["RotationGestureDetector","constructor","callbacks","NaN","onRotationBegin","onRotation","onRotationEnd","updateCurrent","event","tracker","previousTime","currentTime","time","firstPointerID","secondPointerID","keyPointers","firstPointerX","getLastX","firstPointerY","getLastY","secondPointerX","secondPointerY","vectorX","vectorY","anchorX","anchorY","angle","Math","atan2","rotation","Number","isNaN","previousAngle","PI","finish","isInProgress","setKeyPointers","pointerIDs","getData","keys","next","value","onTouchEvent","eventType","EventTypes","DOWN","ADDITIONAL_POINTER_DOWN","MOVE","ADDITIONAL_POINTER_UP","indexOf","pointerId","UP","getTimeDelta","getAnchorX","getAnchorY","getRotation","reset"],"mappings":";;;;;;;AAAA;;;;AASe,MAAMA,uBAAN,CACsB;AAkBnCC,EAAAA,WAAW,CAACC,SAAD,EAAqC;AAAA;;AAAA;;AAAA;;AAAA,yCAb1B,CAa0B;;AAAA,0CAZzB,CAYyB;;AAAA,2CAVxB,CAUwB;;AAAA,sCAT7B,CAS6B;;AAAA,qCAP9B,CAO8B;;AAAA,qCAN9B,CAM8B;;AAAA,0CAJzB,KAIyB;;AAAA,yCAFhB,CAACC,GAAD,EAAMA,GAAN,CAEgB;;AAC9C,SAAKC,eAAL,GAAuBF,SAAS,CAACE,eAAjC;AACA,SAAKC,UAAL,GAAkBH,SAAS,CAACG,UAA5B;AACA,SAAKC,aAAL,GAAqBJ,SAAS,CAACI,aAA/B;AACD;;AAEOC,EAAAA,aAAa,CAACC,KAAD,EAAsBC,OAAtB,EAAqD;AACxE,SAAKC,YAAL,GAAoB,KAAKC,WAAzB;AACA,SAAKA,WAAL,GAAmBH,KAAK,CAACI,IAAzB;AAEA,UAAM,CAACC,cAAD,EAAiBC,eAAjB,IAAoC,KAAKC,WAA/C;AAEA,UAAMC,aAAqB,GAAGP,OAAO,CAACQ,QAAR,CAAiBJ,cAAjB,CAA9B;AACA,UAAMK,aAAqB,GAAGT,OAAO,CAACU,QAAR,CAAiBN,cAAjB,CAA9B;AACA,UAAMO,cAAsB,GAAGX,OAAO,CAACQ,QAAR,CAAiBH,eAAjB,CAA/B;AACA,UAAMO,cAAsB,GAAGZ,OAAO,CAACU,QAAR,CAAiBL,eAAjB,CAA/B;AAEA,UAAMQ,OAAe,GAAGF,cAAc,GAAGJ,aAAzC;AACA,UAAMO,OAAe,GAAGF,cAAc,GAAGH,aAAzC;AAEA,SAAKM,OAAL,GAAe,CAACR,aAAa,GAAGI,cAAjB,IAAmC,CAAlD;AACA,SAAKK,OAAL,GAAe,CAACP,aAAa,GAAGG,cAAjB,IAAmC,CAAlD,CAfwE,CAiBxE;;AACA,UAAMK,KAAa,GAAG,CAACC,IAAI,CAACC,KAAL,CAAWL,OAAX,EAAoBD,OAApB,CAAvB;AAEA,SAAKO,QAAL,GAAgBC,MAAM,CAACC,KAAP,CAAa,KAAKC,aAAlB,IACZ,CADY,GAEZ,KAAKA,aAAL,GAAqBN,KAFzB;AAIA,SAAKM,aAAL,GAAqBN,KAArB;;AAEA,QAAI,KAAKG,QAAL,GAAgBF,IAAI,CAACM,EAAzB,EAA6B;AAC3B,WAAKJ,QAAL,IAAiBF,IAAI,CAACM,EAAtB;AACD,KAFD,MAEO,IAAI,KAAKJ,QAAL,GAAgB,CAACF,IAAI,CAACM,EAA1B,EAA8B;AACnC,WAAKJ,QAAL,IAAiBF,IAAI,CAACM,EAAtB;AACD;;AAED,QAAI,KAAKJ,QAAL,GAAgBF,IAAI,CAACM,EAAL,GAAU,CAA9B,EAAiC;AAC/B,WAAKJ,QAAL,IAAiBF,IAAI,CAACM,EAAtB;AACD,KAFD,MAEO,IAAI,KAAKJ,QAAL,GAAgB,CAACF,IAAI,CAACM,EAAN,GAAW,CAA/B,EAAkC;AACvC,WAAKJ,QAAL,IAAiBF,IAAI,CAACM,EAAtB;AACD;AACF;;AAEOC,EAAAA,MAAM,GAAS;AACrB,QAAI,CAAC,KAAKC,YAAV,EAAwB;AACtB;AACD;;AAED,SAAKA,YAAL,GAAoB,KAApB;AACA,SAAKpB,WAAL,GAAmB,CAACZ,GAAD,EAAMA,GAAN,CAAnB;AACA,SAAKG,aAAL,CAAmB,IAAnB;AACD;;AAEO8B,EAAAA,cAAc,CAAC3B,OAAD,EAAgC;AACpD,QAAI,KAAKM,WAAL,CAAiB,CAAjB,KAAuB,KAAKA,WAAL,CAAiB,CAAjB,CAA3B,EAAgD;AAC9C;AACD;;AAED,UAAMsB,UAAoC,GAAG5B,OAAO,CAAC6B,OAAR,GAAkBC,IAAlB,EAA7C;AAEA,SAAKxB,WAAL,CAAiB,CAAjB,IAAsBsB,UAAU,CAACG,IAAX,GAAkBC,KAAxC;AACA,SAAK1B,WAAL,CAAiB,CAAjB,IAAsBsB,UAAU,CAACG,IAAX,GAAkBC,KAAxC;AACD;;AAEMC,EAAAA,YAAY,CAAClC,KAAD,EAAsBC,OAAtB,EAAwD;AACzE,YAAQD,KAAK,CAACmC,SAAd;AACE,WAAKC,uBAAWC,IAAhB;AACE,aAAKV,YAAL,GAAoB,KAApB;AACA;;AAEF,WAAKS,uBAAWE,uBAAhB;AACE,YAAI,KAAKX,YAAT,EAAuB;AACrB;AACD;;AACD,aAAKA,YAAL,GAAoB,IAApB;AAEA,aAAKzB,YAAL,GAAoBF,KAAK,CAACI,IAA1B;AACA,aAAKoB,aAAL,GAAqB7B,GAArB;AAEA,aAAKiC,cAAL,CAAoB3B,OAApB;AAEA,aAAKF,aAAL,CAAmBC,KAAnB,EAA0BC,OAA1B;AACA,aAAKL,eAAL,CAAqB,IAArB;AACA;;AAEF,WAAKwC,uBAAWG,IAAhB;AACE,YAAI,CAAC,KAAKZ,YAAV,EAAwB;AACtB;AACD;;AAED,aAAK5B,aAAL,CAAmBC,KAAnB,EAA0BC,OAA1B;AACA,aAAKJ,UAAL,CAAgB,IAAhB;AAEA;;AAEF,WAAKuC,uBAAWI,qBAAhB;AACE,YAAI,CAAC,KAAKb,YAAV,EAAwB;AACtB;AACD;;AAED,YAAI,KAAKpB,WAAL,CAAiBkC,OAAjB,CAAyBzC,KAAK,CAAC0C,SAA/B,KAA6C,CAAjD,EAAoD;AAClD,eAAKhB,MAAL;AACD;;AAED;;AAEF,WAAKU,uBAAWO,EAAhB;AACE,YAAI,KAAKhB,YAAT,EAAuB;AACrB,eAAKD,MAAL;AACD;;AACD;AA7CJ;;AAgDA,WAAO,IAAP;AACD;;AAEMkB,EAAAA,YAAY,GAAW;AAC5B,WAAO,KAAKzC,WAAL,GAAmB,KAAKD,YAA/B;AACD;;AAEM2C,EAAAA,UAAU,GAAW;AAC1B,WAAO,KAAK7B,OAAZ;AACD;;AAEM8B,EAAAA,UAAU,GAAW;AAC1B,WAAO,KAAK7B,OAAZ;AACD;;AAEM8B,EAAAA,WAAW,GAAW;AAC3B,WAAO,KAAK1B,QAAZ;AACD;;AAEM2B,EAAAA,KAAK,GAAS;AACnB,SAAKzC,WAAL,GAAmB,CAACZ,GAAD,EAAMA,GAAN,CAAnB;AACA,SAAKgC,YAAL,GAAoB,KAApB;AACD;;AA3JkC","sourcesContent":["import { AdaptedEvent, EventTypes } from '../interfaces';\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface RotationGestureListener {\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (detector: RotationGestureDetector) => boolean;\n onRotationEnd: (detector: RotationGestureDetector) => void;\n}\n\nexport default class RotationGestureDetector\n implements RotationGestureListener {\n onRotationBegin: (detector: RotationGestureDetector) => boolean;\n onRotation: (detector: RotationGestureDetector) => boolean;\n onRotationEnd: (detector: RotationGestureDetector) => void;\n\n private currentTime = 0;\n private previousTime = 0;\n\n private previousAngle = 0;\n private rotation = 0;\n\n private anchorX = 0;\n private anchorY = 0;\n\n private isInProgress = false;\n\n private keyPointers: number[] = [NaN, NaN];\n\n constructor(callbacks: RotationGestureListener) {\n this.onRotationBegin = callbacks.onRotationBegin;\n this.onRotation = callbacks.onRotation;\n this.onRotationEnd = callbacks.onRotationEnd;\n }\n\n private updateCurrent(event: AdaptedEvent, tracker: PointerTracker): void {\n this.previousTime = this.currentTime;\n this.currentTime = event.time;\n\n const [firstPointerID, secondPointerID] = this.keyPointers;\n\n const firstPointerX: number = tracker.getLastX(firstPointerID);\n const firstPointerY: number = tracker.getLastY(firstPointerID);\n const secondPointerX: number = tracker.getLastX(secondPointerID);\n const secondPointerY: number = tracker.getLastY(secondPointerID);\n\n const vectorX: number = secondPointerX - firstPointerX;\n const vectorY: number = secondPointerY - firstPointerY;\n\n this.anchorX = (firstPointerX + secondPointerX) / 2;\n this.anchorY = (firstPointerY + secondPointerY) / 2;\n\n //Angle diff should be positive when rotating in clockwise direction\n const angle: number = -Math.atan2(vectorY, vectorX);\n\n this.rotation = Number.isNaN(this.previousAngle)\n ? 0\n : this.previousAngle - angle;\n\n this.previousAngle = angle;\n\n if (this.rotation > Math.PI) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI) {\n this.rotation += Math.PI;\n }\n\n if (this.rotation > Math.PI / 2) {\n this.rotation -= Math.PI;\n } else if (this.rotation < -Math.PI / 2) {\n this.rotation += Math.PI;\n }\n }\n\n private finish(): void {\n if (!this.isInProgress) {\n return;\n }\n\n this.isInProgress = false;\n this.keyPointers = [NaN, NaN];\n this.onRotationEnd(this);\n }\n\n private setKeyPointers(tracker: PointerTracker): void {\n if (this.keyPointers[0] && this.keyPointers[1]) {\n return;\n }\n\n const pointerIDs: IterableIterator<number> = tracker.getData().keys();\n\n this.keyPointers[0] = pointerIDs.next().value as number;\n this.keyPointers[1] = pointerIDs.next().value as number;\n }\n\n public onTouchEvent(event: AdaptedEvent, tracker: PointerTracker): boolean {\n switch (event.eventType) {\n case EventTypes.DOWN:\n this.isInProgress = false;\n break;\n\n case EventTypes.ADDITIONAL_POINTER_DOWN:\n if (this.isInProgress) {\n break;\n }\n this.isInProgress = true;\n\n this.previousTime = event.time;\n this.previousAngle = NaN;\n\n this.setKeyPointers(tracker);\n\n this.updateCurrent(event, tracker);\n this.onRotationBegin(this);\n break;\n\n case EventTypes.MOVE:\n if (!this.isInProgress) {\n break;\n }\n\n this.updateCurrent(event, tracker);\n this.onRotation(this);\n\n break;\n\n case EventTypes.ADDITIONAL_POINTER_UP:\n if (!this.isInProgress) {\n break;\n }\n\n if (this.keyPointers.indexOf(event.pointerId) >= 0) {\n this.finish();\n }\n\n break;\n\n case EventTypes.UP:\n if (this.isInProgress) {\n this.finish();\n }\n break;\n }\n\n return true;\n }\n\n public getTimeDelta(): number {\n return this.currentTime + this.previousTime;\n }\n\n public getAnchorX(): number {\n return this.anchorX;\n }\n\n public getAnchorY(): number {\n return this.anchorY;\n }\n\n public getRotation(): number {\n return this.rotation;\n }\n\n public reset(): void {\n this.keyPointers = [NaN, NaN];\n this.isInProgress = false;\n }\n}\n"]}
@@ -47,7 +47,6 @@ class ScaleGestureDetector {
47
47
  }
48
48
 
49
49
  onTouchEvent(event, tracker) {
50
- this.adaptEvent(event, tracker);
51
50
  this.currentTime = event.time;
52
51
  const action = event.eventType;
53
52
  const numOfPointers = tracker.getTrackedPointersCount();
@@ -55,7 +54,7 @@ class ScaleGestureDetector {
55
54
 
56
55
  if (action === _interfaces.EventTypes.DOWN || streamComplete) {
57
56
  if (this.inProgress) {
58
- this.onScaleEnd(this, event);
57
+ this.onScaleEnd(this);
59
58
  this.inProgress = false;
60
59
  this.initialSpan = 0;
61
60
  }
@@ -96,7 +95,7 @@ class ScaleGestureDetector {
96
95
  this.focusY = focusY;
97
96
 
98
97
  if (this.inProgress && (span < this.minSpan || configChanged)) {
99
- this.onScaleEnd(this, event);
98
+ this.onScaleEnd(this);
100
99
  this.inProgress = false;
101
100
  this.initialSpan = span;
102
101
  }
@@ -118,7 +117,7 @@ class ScaleGestureDetector {
118
117
 
119
118
  this.currentSpan = span;
120
119
 
121
- if (this.inProgress && !this.onScale(this, event)) {
120
+ if (this.inProgress && !this.onScale(this)) {
122
121
  return true;
123
122
  }
124
123
 
@@ -127,16 +126,6 @@ class ScaleGestureDetector {
127
126
  return true;
128
127
  }
129
128
 
130
- adaptEvent(event, tracker) {
131
- if (tracker.getTrackedPointersCount() > 1 && event.eventType === _interfaces.EventTypes.DOWN) {
132
- event.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_DOWN;
133
- }
134
-
135
- if (tracker.getTrackedPointersCount() > 1 && event.eventType === _interfaces.EventTypes.UP) {
136
- event.eventType = _interfaces.EventTypes.ADDITIONAL_POINTER_UP;
137
- }
138
- }
139
-
140
129
  getCurrentSpan() {
141
130
  return this.currentSpan;
142
131
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["ScaleGestureDetector.ts"],"names":["ScaleGestureDetector","constructor","callbacks","onScaleBegin","onScale","onScaleEnd","spanSlop","DEFAULT_TOUCH_SLOP","minSpan","onTouchEvent","event","tracker","adaptEvent","currentTime","time","action","eventType","numOfPointers","getTrackedPointersCount","streamComplete","EventTypes","UP","ADDITIONAL_POINTER_UP","CANCEL","DOWN","inProgress","initialSpan","configChanged","ADDITIONAL_POINTER_DOWN","pointerUp","ignoredPointer","pointerId","undefined","div","sumX","getSumX","sumY","getSumY","focusX","focusY","devSumX","devSumY","getData","forEach","value","key","Math","abs","lastX","lastY","devX","devY","spanX","spanY","span","hypot","wasInProgress","prevSpan","currentSpan","prevTime","MOVE","getCurrentSpan","getFocusX","getFocusY","getTimeDelta","getScaleFactor"],"mappings":";;;;;;;AAAA;;AACA;;;;AAgBe,MAAMA,oBAAN,CAA2D;AA0BjEC,EAAAA,WAAW,CAACC,SAAD,EAAkC;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,wCAL/B,KAK+B;;AAAA;;AAAA;;AAClD,SAAKC,YAAL,GAAoBD,SAAS,CAACC,YAA9B;AACA,SAAKC,OAAL,GAAeF,SAAS,CAACE,OAAzB;AACA,SAAKC,UAAL,GAAkBH,SAAS,CAACG,UAA5B;AAEA,SAAKC,QAAL,GAAgBC,gCAAqB,CAArC;AACA,SAAKC,OAAL,GAAe,CAAf;AACD;;AAEMC,EAAAA,YAAY,CACjBC,KADiB,EAEjBC,OAFiB,EAGR;AACT,SAAKC,UAAL,CAAgBF,KAAhB,EAAuBC,OAAvB;AAEA,SAAKE,WAAL,GAAmBH,KAAK,CAACI,IAAzB;AAEA,UAAMC,MAAkB,GAAGL,KAAK,CAACM,SAAjC;AACA,UAAMC,aAAa,GAAGN,OAAO,CAACO,uBAAR,EAAtB;AAEA,UAAMC,cAAuB,GAC3BJ,MAAM,KAAKK,uBAAWC,EAAtB,IACAN,MAAM,KAAKK,uBAAWE,qBADtB,IAEAP,MAAM,KAAKK,uBAAWG,MAHxB;;AAKA,QAAIR,MAAM,KAAKK,uBAAWI,IAAtB,IAA8BL,cAAlC,EAAkD;AAChD,UAAI,KAAKM,UAAT,EAAqB;AACnB,aAAKpB,UAAL,CAAgB,IAAhB,EAAsBK,KAAtB;AACA,aAAKe,UAAL,GAAkB,KAAlB;AACA,aAAKC,WAAL,GAAmB,CAAnB;AACD;;AAED,UAAIP,cAAJ,EAAoB;AAClB,eAAO,IAAP;AACD;AACF;;AAED,UAAMQ,aAAsB,GAC1BZ,MAAM,KAAKK,uBAAWI,IAAtB,IACAT,MAAM,KAAKK,uBAAWE,qBADtB,IAEAP,MAAM,KAAKK,uBAAWQ,uBAHxB;AAKA,UAAMC,SAAS,GAAGd,MAAM,KAAKK,uBAAWE,qBAAxC;AAEA,UAAMQ,cAAkC,GAAGD,SAAS,GAChDnB,KAAK,CAACqB,SAD0C,GAEhDC,SAFJ,CAhCS,CAoCT;;AAEA,UAAMC,GAAW,GAAGJ,SAAS,GAAGZ,aAAa,GAAG,CAAnB,GAAuBA,aAApD;AAEA,UAAMiB,IAAI,GAAGvB,OAAO,CAACwB,OAAR,CAAgBL,cAAhB,CAAb;AACA,UAAMM,IAAI,GAAGzB,OAAO,CAAC0B,OAAR,CAAgBP,cAAhB,CAAb;AAEA,UAAMQ,MAAM,GAAGJ,IAAI,GAAGD,GAAtB;AACA,UAAMM,MAAM,GAAGH,IAAI,GAAGH,GAAtB,CA5CS,CA8CT;;AAEA,QAAIO,OAAO,GAAG,CAAd;AACA,QAAIC,OAAO,GAAG,CAAd;AAEA9B,IAAAA,OAAO,CAAC+B,OAAR,GAAkBC,OAAlB,CAA0B,CAACC,KAAD,EAAQC,GAAR,KAAgB;AACxC,UAAIA,GAAG,KAAKf,cAAZ,EAA4B;AAC1B;AACD;;AAEDU,MAAAA,OAAO,IAAIM,IAAI,CAACC,GAAL,CAASH,KAAK,CAACI,KAAN,GAAcV,MAAvB,CAAX;AACAG,MAAAA,OAAO,IAAIK,IAAI,CAACC,GAAL,CAASH,KAAK,CAACK,KAAN,GAAcV,MAAvB,CAAX;AACD,KAPD;AASA,UAAMW,IAAY,GAAGV,OAAO,GAAGP,GAA/B;AACA,UAAMkB,IAAY,GAAGV,OAAO,GAAGR,GAA/B;AAEA,UAAMmB,KAAa,GAAGF,IAAI,GAAG,CAA7B;AACA,UAAMG,KAAa,GAAGF,IAAI,GAAG,CAA7B;AAEA,UAAMG,IAAI,GAAGR,IAAI,CAACS,KAAL,CAAWH,KAAX,EAAkBC,KAAlB,CAAb,CAlES,CAoET;;AACA,UAAMG,aAAsB,GAAG,KAAK/B,UAApC;AACA,SAAKa,MAAL,GAAcA,MAAd;AACA,SAAKC,MAAL,GAAcA,MAAd;;AAEA,QAAI,KAAKd,UAAL,KAAoB6B,IAAI,GAAG,KAAK9C,OAAZ,IAAuBmB,aAA3C,CAAJ,EAA+D;AAC7D,WAAKtB,UAAL,CAAgB,IAAhB,EAAsBK,KAAtB;AACA,WAAKe,UAAL,GAAkB,KAAlB;AACA,WAAKC,WAAL,GAAmB4B,IAAnB;AACD;;AAED,QAAI3B,aAAJ,EAAmB;AACjB,WAAKD,WAAL,GAAmB,KAAK+B,QAAL,GAAgB,KAAKC,WAAL,GAAmBJ,IAAtD;AACD;;AAED,QACE,CAAC,KAAK7B,UAAN,IACA6B,IAAI,IAAI,KAAK9C,OADb,KAECgD,aAAa,IAAIV,IAAI,CAACC,GAAL,CAASO,IAAI,GAAG,KAAK5B,WAArB,IAAoC,KAAKpB,QAF3D,CADF,EAIE;AACA,WAAKmD,QAAL,GAAgB,KAAKC,WAAL,GAAmBJ,IAAnC;AACA,WAAKK,QAAL,GAAgB,KAAK9C,WAArB;AACA,WAAKY,UAAL,GAAkB,KAAKtB,YAAL,CAAkB,IAAlB,CAAlB;AACD,KA3FQ,CA6FT;;;AACA,QAAIY,MAAM,KAAKK,uBAAWwC,IAA1B,EAAgC;AAC9B,aAAO,IAAP;AACD;;AAED,SAAKF,WAAL,GAAmBJ,IAAnB;;AAEA,QAAI,KAAK7B,UAAL,IAAmB,CAAC,KAAKrB,OAAL,CAAa,IAAb,EAAmBM,KAAnB,CAAxB,EAAmD;AACjD,aAAO,IAAP;AACD;;AAED,SAAK+C,QAAL,GAAgB,KAAKC,WAArB;AACA,SAAKC,QAAL,GAAgB,KAAK9C,WAArB;AAEA,WAAO,IAAP;AACD;;AAEOD,EAAAA,UAAU,CAChBF,KADgB,EAEhBC,OAFgB,EAGV;AACN,QACEA,OAAO,CAACO,uBAAR,KAAoC,CAApC,IACAR,KAAK,CAACM,SAAN,KAAoBI,uBAAWI,IAFjC,EAGE;AACAd,MAAAA,KAAK,CAACM,SAAN,GAAkBI,uBAAWQ,uBAA7B;AACD;;AAED,QACEjB,OAAO,CAACO,uBAAR,KAAoC,CAApC,IACAR,KAAK,CAACM,SAAN,KAAoBI,uBAAWC,EAFjC,EAGE;AACAX,MAAAA,KAAK,CAACM,SAAN,GAAkBI,uBAAWE,qBAA7B;AACD;AACF;;AAEMuC,EAAAA,cAAc,GAAW;AAC9B,WAAO,KAAKH,WAAZ;AACD;;AAEMI,EAAAA,SAAS,GAAW;AACzB,WAAO,KAAKxB,MAAZ;AACD;;AAEMyB,EAAAA,SAAS,GAAW;AACzB,WAAO,KAAKxB,MAAZ;AACD;;AAEMyB,EAAAA,YAAY,GAAW;AAC5B,WAAO,KAAKnD,WAAL,GAAmB,KAAK8C,QAA/B;AACD;;AAEMM,EAAAA,cAAc,CAAChD,aAAD,EAAgC;AACnD,QAAIA,aAAa,GAAG,CAApB,EAAuB;AACrB,aAAO,CAAP;AACD;;AAED,WAAO,KAAKwC,QAAL,GAAgB,CAAhB,GAAoB,KAAKC,WAAL,GAAmB,KAAKD,QAA5C,GAAuD,CAA9D;AACD;;AA7LuE","sourcesContent":["import { DEFAULT_TOUCH_SLOP } from '../constants';\nimport { AdaptedPointerEvent, EventTypes } from '../interfaces';\n\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface ScaleGestureListener {\n onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n onScale: (\n detector: ScaleGestureDetector,\n event: AdaptedPointerEvent\n ) => boolean;\n onScaleEnd: (\n detector: ScaleGestureDetector,\n event: AdaptedPointerEvent\n ) => void;\n}\n\nexport default class ScaleGestureDetector implements ScaleGestureListener {\n public onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n public onScale: (\n detector: ScaleGestureDetector,\n event: AdaptedPointerEvent\n ) => boolean;\n public onScaleEnd: (\n detector: ScaleGestureDetector,\n event: AdaptedPointerEvent\n ) => void;\n\n private focusX!: number;\n private focusY!: number;\n\n private currentSpan!: number;\n private prevSpan!: number;\n private initialSpan!: number;\n\n private currentTime!: number;\n private prevTime!: number;\n\n private inProgress = false;\n\n private spanSlop: number;\n private minSpan: number;\n\n public constructor(callbacks: ScaleGestureListener) {\n this.onScaleBegin = callbacks.onScaleBegin;\n this.onScale = callbacks.onScale;\n this.onScaleEnd = callbacks.onScaleEnd;\n\n this.spanSlop = DEFAULT_TOUCH_SLOP * 2;\n this.minSpan = 0;\n }\n\n public onTouchEvent(\n event: AdaptedPointerEvent,\n tracker: PointerTracker\n ): boolean {\n this.adaptEvent(event, tracker);\n\n this.currentTime = event.time;\n\n const action: EventTypes = event.eventType;\n const numOfPointers = tracker.getTrackedPointersCount();\n\n const streamComplete: boolean =\n action === EventTypes.UP ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.CANCEL;\n\n if (action === EventTypes.DOWN || streamComplete) {\n if (this.inProgress) {\n this.onScaleEnd(this, event);\n this.inProgress = false;\n this.initialSpan = 0;\n }\n\n if (streamComplete) {\n return true;\n }\n }\n\n const configChanged: boolean =\n action === EventTypes.DOWN ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.ADDITIONAL_POINTER_DOWN;\n\n const pointerUp = action === EventTypes.ADDITIONAL_POINTER_UP;\n\n const ignoredPointer: number | undefined = pointerUp\n ? event.pointerId\n : undefined;\n\n //Determine focal point\n\n const div: number = pointerUp ? numOfPointers - 1 : numOfPointers;\n\n const sumX = tracker.getSumX(ignoredPointer);\n const sumY = tracker.getSumY(ignoredPointer);\n\n const focusX = sumX / div;\n const focusY = sumY / div;\n\n //Determine average deviation from focal point\n\n let devSumX = 0;\n let devSumY = 0;\n\n tracker.getData().forEach((value, key) => {\n if (key === ignoredPointer) {\n return;\n }\n\n devSumX += Math.abs(value.lastX - focusX);\n devSumY += Math.abs(value.lastY - focusY);\n });\n\n const devX: number = devSumX / div;\n const devY: number = devSumY / div;\n\n const spanX: number = devX * 2;\n const spanY: number = devY * 2;\n\n const span = Math.hypot(spanX, spanY);\n\n //Begin/end events\n const wasInProgress: boolean = this.inProgress;\n this.focusX = focusX;\n this.focusY = focusY;\n\n if (this.inProgress && (span < this.minSpan || configChanged)) {\n this.onScaleEnd(this, event);\n this.inProgress = false;\n this.initialSpan = span;\n }\n\n if (configChanged) {\n this.initialSpan = this.prevSpan = this.currentSpan = span;\n }\n\n if (\n !this.inProgress &&\n span >= this.minSpan &&\n (wasInProgress || Math.abs(span - this.initialSpan) > this.spanSlop)\n ) {\n this.prevSpan = this.currentSpan = span;\n this.prevTime = this.currentTime;\n this.inProgress = this.onScaleBegin(this);\n }\n\n //Handle motion\n if (action !== EventTypes.MOVE) {\n return true;\n }\n\n this.currentSpan = span;\n\n if (this.inProgress && !this.onScale(this, event)) {\n return true;\n }\n\n this.prevSpan = this.currentSpan;\n this.prevTime = this.currentTime;\n\n return true;\n }\n\n private adaptEvent(\n event: AdaptedPointerEvent,\n tracker: PointerTracker\n ): void {\n if (\n tracker.getTrackedPointersCount() > 1 &&\n event.eventType === EventTypes.DOWN\n ) {\n event.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;\n }\n\n if (\n tracker.getTrackedPointersCount() > 1 &&\n event.eventType === EventTypes.UP\n ) {\n event.eventType = EventTypes.ADDITIONAL_POINTER_UP;\n }\n }\n\n public getCurrentSpan(): number {\n return this.currentSpan;\n }\n\n public getFocusX(): number {\n return this.focusX;\n }\n\n public getFocusY(): number {\n return this.focusY;\n }\n\n public getTimeDelta(): number {\n return this.currentTime - this.prevTime;\n }\n\n public getScaleFactor(numOfPointers: number): number {\n if (numOfPointers < 2) {\n return 1;\n }\n\n return this.prevSpan > 0 ? this.currentSpan / this.prevSpan : 1;\n }\n}\n"]}
1
+ {"version":3,"sources":["ScaleGestureDetector.ts"],"names":["ScaleGestureDetector","constructor","callbacks","onScaleBegin","onScale","onScaleEnd","spanSlop","DEFAULT_TOUCH_SLOP","minSpan","onTouchEvent","event","tracker","currentTime","time","action","eventType","numOfPointers","getTrackedPointersCount","streamComplete","EventTypes","UP","ADDITIONAL_POINTER_UP","CANCEL","DOWN","inProgress","initialSpan","configChanged","ADDITIONAL_POINTER_DOWN","pointerUp","ignoredPointer","pointerId","undefined","div","sumX","getSumX","sumY","getSumY","focusX","focusY","devSumX","devSumY","getData","forEach","value","key","Math","abs","lastX","lastY","devX","devY","spanX","spanY","span","hypot","wasInProgress","prevSpan","currentSpan","prevTime","MOVE","getCurrentSpan","getFocusX","getFocusY","getTimeDelta","getScaleFactor"],"mappings":"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","sourcesContent":["import { DEFAULT_TOUCH_SLOP } from '../constants';\nimport { AdaptedEvent, EventTypes } from '../interfaces';\n\nimport PointerTracker from '../tools/PointerTracker';\n\nexport interface ScaleGestureListener {\n onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n onScale: (detector: ScaleGestureDetector) => boolean;\n onScaleEnd: (detector: ScaleGestureDetector) => void;\n}\n\nexport default class ScaleGestureDetector implements ScaleGestureListener {\n public onScaleBegin: (detector: ScaleGestureDetector) => boolean;\n public onScale: (detector: ScaleGestureDetector) => boolean;\n public onScaleEnd: (detector: ScaleGestureDetector) => void;\n\n private focusX!: number;\n private focusY!: number;\n\n private currentSpan!: number;\n private prevSpan!: number;\n private initialSpan!: number;\n\n private currentTime!: number;\n private prevTime!: number;\n\n private inProgress = false;\n\n private spanSlop: number;\n private minSpan: number;\n\n public constructor(callbacks: ScaleGestureListener) {\n this.onScaleBegin = callbacks.onScaleBegin;\n this.onScale = callbacks.onScale;\n this.onScaleEnd = callbacks.onScaleEnd;\n\n this.spanSlop = DEFAULT_TOUCH_SLOP * 2;\n this.minSpan = 0;\n }\n\n public onTouchEvent(event: AdaptedEvent, tracker: PointerTracker): boolean {\n this.currentTime = event.time;\n\n const action: EventTypes = event.eventType;\n const numOfPointers = tracker.getTrackedPointersCount();\n\n const streamComplete: boolean =\n action === EventTypes.UP ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.CANCEL;\n\n if (action === EventTypes.DOWN || streamComplete) {\n if (this.inProgress) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = 0;\n }\n\n if (streamComplete) {\n return true;\n }\n }\n\n const configChanged: boolean =\n action === EventTypes.DOWN ||\n action === EventTypes.ADDITIONAL_POINTER_UP ||\n action === EventTypes.ADDITIONAL_POINTER_DOWN;\n\n const pointerUp = action === EventTypes.ADDITIONAL_POINTER_UP;\n\n const ignoredPointer: number | undefined = pointerUp\n ? event.pointerId\n : undefined;\n\n //Determine focal point\n\n const div: number = pointerUp ? numOfPointers - 1 : numOfPointers;\n\n const sumX = tracker.getSumX(ignoredPointer);\n const sumY = tracker.getSumY(ignoredPointer);\n\n const focusX = sumX / div;\n const focusY = sumY / div;\n\n //Determine average deviation from focal point\n\n let devSumX = 0;\n let devSumY = 0;\n\n tracker.getData().forEach((value, key) => {\n if (key === ignoredPointer) {\n return;\n }\n\n devSumX += Math.abs(value.lastX - focusX);\n devSumY += Math.abs(value.lastY - focusY);\n });\n\n const devX: number = devSumX / div;\n const devY: number = devSumY / div;\n\n const spanX: number = devX * 2;\n const spanY: number = devY * 2;\n\n const span = Math.hypot(spanX, spanY);\n\n //Begin/end events\n const wasInProgress: boolean = this.inProgress;\n this.focusX = focusX;\n this.focusY = focusY;\n\n if (this.inProgress && (span < this.minSpan || configChanged)) {\n this.onScaleEnd(this);\n this.inProgress = false;\n this.initialSpan = span;\n }\n\n if (configChanged) {\n this.initialSpan = this.prevSpan = this.currentSpan = span;\n }\n\n if (\n !this.inProgress &&\n span >= this.minSpan &&\n (wasInProgress || Math.abs(span - this.initialSpan) > this.spanSlop)\n ) {\n this.prevSpan = this.currentSpan = span;\n this.prevTime = this.currentTime;\n this.inProgress = this.onScaleBegin(this);\n }\n\n //Handle motion\n if (action !== EventTypes.MOVE) {\n return true;\n }\n\n this.currentSpan = span;\n\n if (this.inProgress && !this.onScale(this)) {\n return true;\n }\n\n this.prevSpan = this.currentSpan;\n this.prevTime = this.currentTime;\n\n return true;\n }\n\n public getCurrentSpan(): number {\n return this.currentSpan;\n }\n\n public getFocusX(): number {\n return this.focusX;\n }\n\n public getFocusY(): number {\n return this.focusY;\n }\n\n public getTimeDelta(): number {\n return this.currentTime - this.prevTime;\n }\n\n public getScaleFactor(numOfPointers: number): number {\n if (numOfPointers < 2) {\n return 1;\n }\n\n return this.prevSpan > 0 ? this.currentSpan / this.prevSpan : 1;\n }\n}\n"]}