react-native-gesture-handler 2.7.1 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/RNGestureHandler.podspec +1 -1
  2. package/android/build.gradle +53 -46
  3. package/android/noreanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +3 -3
  4. package/android/reanimated/src/main/java/com/swmansion/gesturehandler/ReanimatedEventDispatcher.kt +7 -7
  5. package/android/src/fabric/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +2 -2
  6. package/android/src/main/java/com/swmansion/gesturehandler/RNGestureHandlerPackage.kt +3 -3
  7. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/FlingGestureHandler.kt +12 -9
  8. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandler.kt +39 -31
  9. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerInteractionController.kt +1 -1
  10. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerOrchestrator.kt +28 -19
  11. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureHandlerRegistry.kt +1 -1
  12. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/GestureUtils.kt +1 -1
  13. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/LongPressGestureHandler.kt +1 -1
  14. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ManualGestureHandler.kt +1 -1
  15. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/NativeViewGestureHandler.kt +5 -5
  16. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/OnTouchEventListener.kt +1 -1
  17. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PanGestureHandler.kt +7 -5
  18. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PinchGestureHandler.kt +11 -4
  19. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/PointerEventsConfig.kt +1 -1
  20. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/RotationGestureDetector.kt +1 -1
  21. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/RotationGestureHandler.kt +7 -2
  22. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ScaleGestureDetector.java +1 -1
  23. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/TapGestureHandler.kt +3 -3
  24. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/core}/ViewConfigurationHelper.kt +1 -1
  25. package/android/{lib/src/main/java/com/swmansion/gesturehandler → src/main/java/com/swmansion/gesturehandler/react}/Extensions.kt +3 -3
  26. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +8 -6
  27. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEnabledRootView.kt +1 -5
  28. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEvent.kt +20 -8
  29. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerEventDataExtractor.kt +1 -1
  30. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerInteractionManager.kt +3 -3
  31. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +40 -15
  32. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRegistry.kt +2 -2
  33. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt +8 -6
  34. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt +0 -2
  35. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootViewManager.kt +4 -2
  36. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerStateChangeEvent.kt +7 -7
  37. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerTouchEvent.kt +5 -5
  38. package/android/src/main/java/com/swmansion/gesturehandler/react/RNViewConfigurationHelper.kt +2 -2
  39. package/android/src/main/jni/CMakeLists.txt +10 -44
  40. package/android/src/main/jni/cpp-adapter.cpp +16 -13
  41. package/android/src/paper/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +5 -5
  42. package/ios/Handlers/RNFlingHandler.m +39 -37
  43. package/ios/Handlers/RNForceTouchHandler.m +19 -17
  44. package/ios/Handlers/RNLongPressHandler.m +20 -22
  45. package/ios/Handlers/RNManualHandler.m +23 -8
  46. package/ios/Handlers/RNNativeViewHandler.mm +92 -88
  47. package/ios/Handlers/RNPanHandler.m +28 -32
  48. package/ios/Handlers/RNPinchHandler.m +9 -10
  49. package/ios/Handlers/RNRotationHandler.m +11 -14
  50. package/ios/Handlers/RNTapHandler.m +26 -26
  51. package/ios/RNGestureHandler.h +31 -24
  52. package/ios/RNGestureHandler.m +278 -273
  53. package/ios/RNGestureHandlerActionType.h +6 -4
  54. package/ios/RNGestureHandlerButton.m +11 -12
  55. package/ios/RNGestureHandlerButtonComponentView.mm +7 -8
  56. package/ios/RNGestureHandlerButtonManager.m +6 -5
  57. package/ios/RNGestureHandlerDirection.h +4 -4
  58. package/ios/RNGestureHandlerEvents.h +3 -4
  59. package/ios/RNGestureHandlerEvents.m +114 -119
  60. package/ios/RNGestureHandlerManager.h +1 -2
  61. package/ios/RNGestureHandlerManager.mm +176 -178
  62. package/ios/RNGestureHandlerModule.h +1 -2
  63. package/ios/RNGestureHandlerModule.mm +126 -122
  64. package/ios/RNGestureHandlerPointerTracker.h +1 -1
  65. package/ios/RNGestureHandlerPointerTracker.m +40 -37
  66. package/ios/RNGestureHandlerRegistry.h +3 -1
  67. package/ios/RNGestureHandlerRegistry.m +24 -22
  68. package/ios/RNGestureHandlerState.h +6 -6
  69. package/ios/RNGestureHandlerStateManager.h +1 -1
  70. package/ios/RNManualActivationRecognizer.m +9 -9
  71. package/ios/RNRootViewGestureRecognizer.m +36 -39
  72. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  73. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  74. package/lib/commonjs/RNGestureHandlerModule.windows.js +156 -0
  75. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -0
  76. package/lib/commonjs/components/DrawerLayout.js +1 -0
  77. package/lib/commonjs/components/DrawerLayout.js.map +1 -1
  78. package/lib/commonjs/components/Swipeable.js.map +1 -1
  79. package/lib/commonjs/components/touchables/TouchableOpacity.js.map +1 -1
  80. package/lib/commonjs/gestureHandlerRootHOC.js +2 -1
  81. package/lib/commonjs/gestureHandlerRootHOC.js.map +1 -1
  82. package/lib/commonjs/getShadowNodeFromRef.js +2 -2
  83. package/lib/commonjs/getShadowNodeFromRef.js.map +1 -1
  84. package/lib/commonjs/handlers/LongPressGestureHandler.js +3 -1
  85. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  86. package/lib/commonjs/handlers/TapGestureHandler.js +3 -1
  87. package/lib/commonjs/handlers/TapGestureHandler.js.map +1 -1
  88. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  89. package/lib/commonjs/handlers/gestureHandlerCommon.js +5 -2
  90. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  91. package/lib/commonjs/handlers/gestureHandlerTypesCompat.js +4 -0
  92. package/lib/commonjs/handlers/gestures/GestureDetector.js +87 -38
  93. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  94. package/lib/commonjs/handlers/gestures/eventReceiver.js.map +1 -1
  95. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  96. package/lib/commonjs/handlers/gestures/longPressGesture.js +1 -0
  97. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
  98. package/lib/commonjs/handlers/gestures/tapGesture.js +1 -0
  99. package/lib/commonjs/handlers/gestures/tapGesture.js.map +1 -1
  100. package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
  101. package/lib/commonjs/web/detectors/RotationGestureDetector.js.map +1 -1
  102. package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -1
  103. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  104. package/lib/commonjs/web/handlers/GestureHandler.js +28 -3
  105. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  106. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +0 -2
  107. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  108. package/lib/commonjs/web/handlers/ManualGestureHandler.js +15 -0
  109. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
  110. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +0 -2
  111. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  112. package/lib/commonjs/web/handlers/PanGestureHandler.js +0 -5
  113. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  114. package/lib/commonjs/web/handlers/PinchGestureHandler.js +0 -1
  115. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  116. package/lib/commonjs/web/handlers/RotationGestureHandler.js +0 -1
  117. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  118. package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -2
  119. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  120. package/lib/commonjs/web/interfaces.js.map +1 -1
  121. package/lib/commonjs/web/tools/InteractionManager.js.map +1 -1
  122. package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -1
  123. package/lib/commonjs/web_hammer/NodeManager.js +4 -1
  124. package/lib/commonjs/web_hammer/NodeManager.js.map +1 -1
  125. package/lib/commonjs/web_hammer/PanGestureHandler.js +25 -6
  126. package/lib/commonjs/web_hammer/PanGestureHandler.js.map +1 -1
  127. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  128. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  129. package/lib/module/RNGestureHandlerModule.windows.js +117 -0
  130. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -0
  131. package/lib/module/components/DrawerLayout.js +1 -0
  132. package/lib/module/components/DrawerLayout.js.map +1 -1
  133. package/lib/module/components/Swipeable.js.map +1 -1
  134. package/lib/module/components/touchables/TouchableOpacity.js.map +1 -1
  135. package/lib/module/gestureHandlerRootHOC.js +2 -1
  136. package/lib/module/gestureHandlerRootHOC.js.map +1 -1
  137. package/lib/module/getShadowNodeFromRef.js +2 -2
  138. package/lib/module/getShadowNodeFromRef.js.map +1 -1
  139. package/lib/module/handlers/LongPressGestureHandler.js +3 -1
  140. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  141. package/lib/module/handlers/TapGestureHandler.js +3 -1
  142. package/lib/module/handlers/TapGestureHandler.js.map +1 -1
  143. package/lib/module/handlers/createHandler.js.map +1 -1
  144. package/lib/module/handlers/gestureHandlerCommon.js +5 -2
  145. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  146. package/lib/module/handlers/gestureHandlerTypesCompat.js +1 -1
  147. package/lib/module/handlers/gestures/GestureDetector.js +89 -39
  148. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  149. package/lib/module/handlers/gestures/eventReceiver.js.map +1 -1
  150. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  151. package/lib/module/handlers/gestures/longPressGesture.js +1 -0
  152. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
  153. package/lib/module/handlers/gestures/tapGesture.js +1 -0
  154. package/lib/module/handlers/gestures/tapGesture.js.map +1 -1
  155. package/lib/module/jestUtils/jestUtils.js.map +1 -1
  156. package/lib/module/web/detectors/RotationGestureDetector.js.map +1 -1
  157. package/lib/module/web/handlers/FlingGestureHandler.js +0 -1
  158. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  159. package/lib/module/web/handlers/GestureHandler.js +28 -3
  160. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  161. package/lib/module/web/handlers/LongPressGestureHandler.js +0 -2
  162. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  163. package/lib/module/web/handlers/ManualGestureHandler.js +15 -0
  164. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
  165. package/lib/module/web/handlers/NativeViewGestureHandler.js +0 -2
  166. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  167. package/lib/module/web/handlers/PanGestureHandler.js +0 -5
  168. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  169. package/lib/module/web/handlers/PinchGestureHandler.js +0 -1
  170. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  171. package/lib/module/web/handlers/RotationGestureHandler.js +0 -1
  172. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  173. package/lib/module/web/handlers/TapGestureHandler.js +0 -2
  174. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  175. package/lib/module/web/interfaces.js.map +1 -1
  176. package/lib/module/web/tools/InteractionManager.js.map +1 -1
  177. package/lib/module/web_hammer/GestureHandler.js.map +1 -1
  178. package/lib/module/web_hammer/NodeManager.js +4 -1
  179. package/lib/module/web_hammer/NodeManager.js.map +1 -1
  180. package/lib/module/web_hammer/PanGestureHandler.js +25 -6
  181. package/lib/module/web_hammer/PanGestureHandler.js.map +1 -1
  182. package/lib/typescript/RNGestureHandlerModule.macos.d.ts +1 -1
  183. package/lib/typescript/RNGestureHandlerModule.web.d.ts +1 -1
  184. package/lib/typescript/RNGestureHandlerModule.windows.d.ts +48 -0
  185. package/lib/typescript/components/DrawerLayout.d.ts +10 -1
  186. package/lib/typescript/components/Swipeable.d.ts +3 -2
  187. package/lib/typescript/fabric/RNGestureHandlerButtonNativeComponent.d.ts +1 -1
  188. package/lib/typescript/fabric/RNGestureHandlerRootViewNativeComponent.d.ts +1 -1
  189. package/lib/typescript/gestureHandlerRootHOC.d.ts +1 -1
  190. package/lib/typescript/handlers/NativeViewGestureHandler.d.ts +1 -1
  191. package/lib/typescript/handlers/PanGestureHandler.d.ts +1 -1
  192. package/lib/typescript/handlers/gestureHandlerCommon.d.ts +3 -1
  193. package/lib/typescript/handlers/gestures/GestureDetector.d.ts +3 -1
  194. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +3 -1
  195. package/lib/typescript/web/interfaces.d.ts +3 -1
  196. package/lib/typescript/web/tools/NodeManager.d.ts +2 -2
  197. package/package.json +17 -14
  198. package/src/RNGestureHandlerModule.macos.ts +2 -2
  199. package/src/RNGestureHandlerModule.web.ts +2 -2
  200. package/src/RNGestureHandlerModule.windows.ts +140 -0
  201. package/src/components/DrawerLayout.tsx +22 -12
  202. package/src/components/Swipeable.tsx +16 -13
  203. package/src/components/touchables/TouchableOpacity.tsx +1 -1
  204. package/src/gestureHandlerRootHOC.tsx +4 -1
  205. package/src/getShadowNodeFromRef.ts +3 -3
  206. package/src/handlers/LongPressGestureHandler.ts +3 -1
  207. package/src/handlers/TapGestureHandler.ts +3 -1
  208. package/src/handlers/createHandler.tsx +13 -15
  209. package/src/handlers/gestureHandlerCommon.ts +9 -4
  210. package/src/handlers/gestureHandlerTypesCompat.ts +34 -17
  211. package/src/handlers/gestures/GestureDetector.tsx +117 -44
  212. package/src/handlers/gestures/eventReceiver.ts +2 -1
  213. package/src/handlers/gestures/gesture.ts +8 -12
  214. package/src/handlers/gestures/longPressGesture.ts +1 -0
  215. package/src/handlers/gestures/tapGesture.ts +1 -0
  216. package/src/jestUtils/jestUtils.ts +3 -4
  217. package/src/web/detectors/RotationGestureDetector.ts +2 -1
  218. package/src/web/handlers/FlingGestureHandler.ts +2 -3
  219. package/src/web/handlers/GestureHandler.ts +30 -11
  220. package/src/web/handlers/LongPressGestureHandler.ts +0 -3
  221. package/src/web/handlers/ManualGestureHandler.ts +10 -1
  222. package/src/web/handlers/NativeViewGestureHandler.ts +0 -2
  223. package/src/web/handlers/PanGestureHandler.ts +0 -6
  224. package/src/web/handlers/PinchGestureHandler.ts +0 -2
  225. package/src/web/handlers/RotationGestureHandler.ts +2 -5
  226. package/src/web/handlers/TapGestureHandler.ts +0 -3
  227. package/src/web/interfaces.ts +3 -0
  228. package/src/web/tools/InteractionManager.ts +2 -3
  229. package/src/web_hammer/GestureHandler.ts +6 -8
  230. package/src/web_hammer/NodeManager.ts +3 -1
  231. package/src/web_hammer/PanGestureHandler.ts +12 -6
  232. package/android/lib/build.gradle +0 -28
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, RefObject } from 'react';
1
+ import React, { useEffect, useRef, useState } from 'react';
2
2
  import {
3
3
  GestureType,
4
4
  HandlerCallbacks,
@@ -18,6 +18,7 @@ import {
18
18
  GestureStateChangeEvent,
19
19
  HandlerStateChangeEvent,
20
20
  scheduleFlushOperations,
21
+ UserSelect,
21
22
  } from '../gestureHandlerCommon';
22
23
  import {
23
24
  GestureStateManager,
@@ -125,10 +126,11 @@ interface WebEventHandler {
125
126
 
126
127
  interface AttachHandlersConfig {
127
128
  preparedGesture: GestureConfigReference;
128
- gestureConfig: ComposedGesture | GestureType | undefined;
129
+ gestureConfig: ComposedGesture | GestureType;
129
130
  gesture: GestureType[];
130
131
  viewTag: number;
131
132
  webEventHandlersRef: React.RefObject<WebEventHandler>;
133
+ mountedRef: React.RefObject<boolean>;
132
134
  }
133
135
 
134
136
  function attachHandlers({
@@ -137,9 +139,10 @@ function attachHandlers({
137
139
  gesture,
138
140
  viewTag,
139
141
  webEventHandlersRef,
142
+ mountedRef,
140
143
  }: AttachHandlersConfig) {
141
144
  if (!preparedGesture.firstExecution) {
142
- gestureConfig?.initialize();
145
+ gestureConfig.initialize();
143
146
  } else {
144
147
  preparedGesture.firstExecution = false;
145
148
  }
@@ -147,7 +150,10 @@ function attachHandlers({
147
150
  // use setImmediate to extract handlerTags, because all refs should be initialized
148
151
  // when it's ran
149
152
  setImmediate(() => {
150
- gestureConfig?.prepare();
153
+ if (!mountedRef.current) {
154
+ return;
155
+ }
156
+ gestureConfig.prepare();
151
157
  });
152
158
 
153
159
  for (const handler of gesture) {
@@ -164,6 +170,9 @@ function attachHandlers({
164
170
  // use setImmediate to extract handlerTags, because all refs should be initialized
165
171
  // when it's ran
166
172
  setImmediate(() => {
173
+ if (!mountedRef.current) {
174
+ return;
175
+ }
167
176
  for (const handler of gesture) {
168
177
  let requireToFail: number[] = [];
169
178
  if (handler.config.requireToFail) {
@@ -197,7 +206,9 @@ function attachHandlers({
197
206
  : ActionType.JS_FUNCTION_NEW_API;
198
207
 
199
208
  if (Platform.OS === 'web') {
200
- (RNGestureHandlerModule.attachGestureHandler as typeof RNGestureHandlerModuleWeb.attachGestureHandler)(
209
+ (
210
+ RNGestureHandlerModule.attachGestureHandler as typeof RNGestureHandlerModuleWeb.attachGestureHandler
211
+ )(
201
212
  gesture.handlerTag,
202
213
  viewTag,
203
214
  ActionType.JS_FUNCTION_OLD_API, // ignored on web
@@ -215,9 +226,9 @@ function attachHandlers({
215
226
  if (preparedGesture.animatedHandlers) {
216
227
  const isAnimatedGesture = (g: GestureType) => g.shouldUseReanimated;
217
228
 
218
- preparedGesture.animatedHandlers.value = (gesture
229
+ preparedGesture.animatedHandlers.value = gesture
219
230
  .filter(isAnimatedGesture)
220
- .map((g) => g.handlers) as unknown) as HandlerCallbacks<
231
+ .map((g) => g.handlers) as unknown as HandlerCallbacks<
221
232
  Record<string, unknown>
222
233
  >[];
223
234
  }
@@ -225,11 +236,11 @@ function attachHandlers({
225
236
 
226
237
  function updateHandlers(
227
238
  preparedGesture: GestureConfigReference,
228
- gestureConfig: ComposedGesture | GestureType | undefined,
239
+ gestureConfig: ComposedGesture | GestureType,
229
240
  gesture: GestureType[],
230
- mountedRef: RefObject<boolean>
241
+ mountedRef: React.RefObject<boolean>
231
242
  ) {
232
- gestureConfig?.prepare();
243
+ gestureConfig.prepare();
233
244
 
234
245
  for (let i = 0; i < gesture.length; i++) {
235
246
  const handler = preparedGesture.config[i];
@@ -278,9 +289,9 @@ function updateHandlers(
278
289
  if (preparedGesture.animatedHandlers) {
279
290
  const previousHandlersValue =
280
291
  preparedGesture.animatedHandlers.value ?? [];
281
- const newHandlersValue = (preparedGesture.config
292
+ const newHandlersValue = preparedGesture.config
282
293
  .filter((g) => g.shouldUseReanimated) // ignore gestures that shouldn't run on UI
283
- .map((g) => g.handlers) as unknown) as HandlerCallbacks<
294
+ .map((g) => g.handlers) as unknown as HandlerCallbacks<
284
295
  Record<string, unknown>
285
296
  >[];
286
297
 
@@ -550,9 +561,11 @@ function validateDetectorChildren(ref: any) {
550
561
  ref._reactInternals.elementType
551
562
  : // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
552
563
  ref._reactInternalFiber.elementType;
553
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
554
- let instance = RNRenderer.findHostInstance_DEPRECATED(ref)
555
- ._internalFiberInstanceHandleDEV;
564
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
565
+ let instance =
566
+ RNRenderer.findHostInstance_DEPRECATED(
567
+ ref
568
+ )._internalFiberInstanceHandleDEV;
556
569
 
557
570
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
558
571
  while (instance && instance.elementType !== wrapType) {
@@ -569,16 +582,43 @@ function validateDetectorChildren(ref: any) {
569
582
  }
570
583
  }
571
584
 
585
+ const applyUserSelectProp = (
586
+ userSelect: UserSelect,
587
+ gesture: ComposedGesture | GestureType
588
+ ): void => {
589
+ for (const g of gesture.toGestureArray()) {
590
+ g.config.userSelect = userSelect;
591
+ }
592
+ };
593
+
572
594
  interface GestureDetectorProps {
573
- gesture?: ComposedGesture | GestureType;
595
+ gesture: ComposedGesture | GestureType;
596
+ userSelect?: UserSelect;
574
597
  children?: React.ReactNode;
575
598
  }
599
+ interface GestureDetectorState {
600
+ firstRender: boolean;
601
+ viewRef: React.Component | null;
602
+ previousViewTag: number;
603
+ forceReattach: boolean;
604
+ }
576
605
  export const GestureDetector = (props: GestureDetectorProps) => {
577
606
  const gestureConfig = props.gesture;
578
- const gesture = gestureConfig?.toGestureArray?.() ?? [];
607
+
608
+ if (props.userSelect) {
609
+ applyUserSelectProp(props.userSelect, gestureConfig);
610
+ }
611
+
612
+ const gesture = gestureConfig.toGestureArray();
579
613
  const useReanimatedHook = gesture.some((g) => g.shouldUseReanimated);
580
- const viewRef = useRef(null);
581
- const firstRenderRef = useRef(true);
614
+
615
+ // store state in ref to prevent unnecessary renders
616
+ const state = useRef<GestureDetectorState>({
617
+ firstRender: true,
618
+ viewRef: null,
619
+ previousViewTag: -1,
620
+ forceReattach: false,
621
+ }).current;
582
622
  const mountedRef = useRef(false);
583
623
  const webEventHandlersRef = useRef<WebEventHandler>({
584
624
  onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {
@@ -591,6 +631,11 @@ export const GestureDetector = (props: GestureDetectorProps) => {
591
631
  : undefined,
592
632
  });
593
633
 
634
+ const [renderState, setRenderState] = useState(false);
635
+ function forceRender() {
636
+ setRenderState(!renderState);
637
+ }
638
+
594
639
  const preparedGesture = React.useRef<GestureConfigReference>({
595
640
  config: gesture,
596
641
  animatedEventHandler: null,
@@ -607,13 +652,44 @@ export const GestureDetector = (props: GestureDetectorProps) => {
607
652
  );
608
653
  }
609
654
 
655
+ function onHandlersUpdate(skipConfigUpdate?: boolean) {
656
+ // if the underlying view has changed we need to reattach handlers to the new view
657
+ const viewTag = findNodeHandle(state.viewRef) as number;
658
+ const forceReattach = viewTag !== state.previousViewTag;
659
+
660
+ if (forceReattach || needsToReattach(preparedGesture, gesture)) {
661
+ validateDetectorChildren(state.viewRef);
662
+ dropHandlers(preparedGesture);
663
+ attachHandlers({
664
+ preparedGesture,
665
+ gestureConfig,
666
+ gesture,
667
+ webEventHandlersRef,
668
+ viewTag,
669
+ mountedRef,
670
+ });
671
+
672
+ state.previousViewTag = viewTag;
673
+ state.forceReattach = forceReattach;
674
+ if (forceReattach) {
675
+ forceRender();
676
+ }
677
+ } else if (!skipConfigUpdate) {
678
+ updateHandlers(preparedGesture, gestureConfig, gesture, mountedRef);
679
+ }
680
+ }
681
+
610
682
  // Reanimated event should be rebuilt only when gestures are reattached, otherwise
611
683
  // config update will be enough as all necessary items are stored in shared values anyway
612
684
  const needsToRebuildReanimatedEvent =
613
- preparedGesture.firstExecution || needsToReattach(preparedGesture, gesture);
685
+ preparedGesture.firstExecution ||
686
+ needsToReattach(preparedGesture, gesture) ||
687
+ state.forceReattach;
688
+
689
+ state.forceReattach = false;
614
690
 
615
691
  if (preparedGesture.firstExecution) {
616
- gestureConfig?.initialize?.();
692
+ gestureConfig.initialize();
617
693
  }
618
694
 
619
695
  if (useReanimatedHook) {
@@ -623,17 +699,19 @@ export const GestureDetector = (props: GestureDetectorProps) => {
623
699
  }
624
700
 
625
701
  useEffect(() => {
626
- firstRenderRef.current = true;
702
+ const viewTag = findNodeHandle(state.viewRef) as number;
703
+ state.firstRender = true;
627
704
  mountedRef.current = true;
628
- const viewTag = findNodeHandle(viewRef.current) as number;
629
705
 
630
- validateDetectorChildren(viewRef.current);
706
+ validateDetectorChildren(state.viewRef);
707
+
631
708
  attachHandlers({
632
709
  preparedGesture,
633
710
  gestureConfig,
634
711
  gesture,
635
- viewTag,
636
712
  webEventHandlersRef,
713
+ viewTag,
714
+ mountedRef,
637
715
  });
638
716
 
639
717
  return () => {
@@ -643,31 +721,26 @@ export const GestureDetector = (props: GestureDetectorProps) => {
643
721
  }, []);
644
722
 
645
723
  useEffect(() => {
646
- if (!firstRenderRef.current) {
647
- const viewTag = findNodeHandle(viewRef.current) as number;
648
-
649
- if (needsToReattach(preparedGesture, gesture)) {
650
- validateDetectorChildren(viewRef.current);
651
- dropHandlers(preparedGesture);
652
- attachHandlers({
653
- preparedGesture,
654
- gestureConfig,
655
- gesture,
656
- viewTag,
657
- webEventHandlersRef,
658
- });
659
- } else {
660
- updateHandlers(preparedGesture, gestureConfig, gesture, mountedRef);
661
- }
724
+ if (!state.firstRender) {
725
+ onHandlersUpdate();
662
726
  } else {
663
- firstRenderRef.current = false;
727
+ state.firstRender = false;
664
728
  }
665
729
  }, [props]);
666
730
 
667
731
  const refFunction = (ref: unknown) => {
668
732
  if (ref !== null) {
669
- //@ts-ignore Just setting the ref
670
- viewRef.current = ref;
733
+ // @ts-ignore Just setting the view ref
734
+ state.viewRef = ref;
735
+
736
+ // if it's the first render, also set the previousViewTag to prevent reattaching gestures when not needed
737
+ if (state.previousViewTag === -1) {
738
+ state.previousViewTag = findNodeHandle(state.viewRef) as number;
739
+ }
740
+
741
+ // pass true as `skipConfigUpdate`, here we only want to trigger the eventual reattaching of handlers
742
+ // in case the view has changed, while config update would be handled be the `useEffect` above
743
+ onHandlersUpdate(true);
671
744
 
672
745
  if (isFabric()) {
673
746
  const node = getShadowNodeFromRef(ref);
@@ -14,7 +14,8 @@ import {
14
14
  } from './gestureStateManager';
15
15
 
16
16
  let gestureHandlerEventSubscription: EmitterSubscription | null = null;
17
- let gestureHandlerStateChangeEventSubscription: EmitterSubscription | null = null;
17
+ let gestureHandlerStateChangeEventSubscription: EmitterSubscription | null =
18
+ null;
18
19
 
19
20
  const gestureStateManagers: Map<number, GestureStateManagerType> = new Map<
20
21
  number,
@@ -202,9 +202,8 @@ export abstract class BaseGesture<
202
202
  onTouchesDown(callback: TouchEventHandlerType) {
203
203
  this.config.needsPointerData = true;
204
204
  this.handlers.onTouchesDown = callback;
205
- this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_DOWN] = this.isWorklet(
206
- callback
207
- );
205
+ this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_DOWN] =
206
+ this.isWorklet(callback);
208
207
 
209
208
  return this;
210
209
  }
@@ -212,9 +211,8 @@ export abstract class BaseGesture<
212
211
  onTouchesMove(callback: TouchEventHandlerType) {
213
212
  this.config.needsPointerData = true;
214
213
  this.handlers.onTouchesMove = callback;
215
- this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_MOVE] = this.isWorklet(
216
- callback
217
- );
214
+ this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_MOVE] =
215
+ this.isWorklet(callback);
218
216
 
219
217
  return this;
220
218
  }
@@ -222,9 +220,8 @@ export abstract class BaseGesture<
222
220
  onTouchesUp(callback: TouchEventHandlerType) {
223
221
  this.config.needsPointerData = true;
224
222
  this.handlers.onTouchesUp = callback;
225
- this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_UP] = this.isWorklet(
226
- callback
227
- );
223
+ this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_UP] =
224
+ this.isWorklet(callback);
228
225
 
229
226
  return this;
230
227
  }
@@ -232,9 +229,8 @@ export abstract class BaseGesture<
232
229
  onTouchesCancelled(callback: TouchEventHandlerType) {
233
230
  this.config.needsPointerData = true;
234
231
  this.handlers.onTouchesCancelled = callback;
235
- this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_CANCELLED] = this.isWorklet(
236
- callback
237
- );
232
+ this.handlers.isWorklet[CALLBACK_TYPE.TOUCHES_CANCELLED] =
233
+ this.isWorklet(callback);
238
234
 
239
235
  return this;
240
236
  }
@@ -11,6 +11,7 @@ export class LongPressGesture extends BaseGesture<LongPressGestureHandlerEventPa
11
11
  super();
12
12
 
13
13
  this.handlerName = 'LongPressGestureHandler';
14
+ this.shouldCancelWhenOutside(true);
14
15
  }
15
16
 
16
17
  minDuration(duration: number) {
@@ -11,6 +11,7 @@ export class TapGesture extends BaseGesture<TapGestureHandlerEventPayload> {
11
11
  super();
12
12
 
13
13
  this.handlerName = 'TapGestureHandler';
14
+ this.shouldCancelWhenOutside(true);
14
15
  }
15
16
 
16
17
  minPointers(minPointers: number) {
@@ -464,9 +464,8 @@ export function fireGestureHandler<THandler extends AllGestures | AllHandlers>(
464
464
  componentOrGesture: ReactTestInstance | GestureType,
465
465
  eventList: Partial<GestureHandlerTestEvent<ExtractConfig<THandler>>>[] = []
466
466
  ): void {
467
- const { emitEvent, handlerType, handlerTag } = getHandlerData(
468
- componentOrGesture
469
- );
467
+ const { emitEvent, handlerType, handlerTag } =
468
+ getHandlerData(componentOrGesture);
470
469
 
471
470
  let _ = fillMissingStatesTransitions(
472
471
  eventList,
@@ -478,7 +477,7 @@ export function fireGestureHandler<THandler extends AllGestures | AllHandlers>(
478
477
  // @ts-ignore TODO
479
478
  _ = _.map(wrapWithNativeEvent);
480
479
 
481
- const events = (_ as unknown) as WrappedGestureHandlerTestEvent[];
480
+ const events = _ as unknown as WrappedGestureHandlerTestEvent[];
482
481
 
483
482
  const firstEvent = events.shift()!;
484
483
 
@@ -8,7 +8,8 @@ export interface RotationGestureListener {
8
8
  }
9
9
 
10
10
  export default class RotationGestureDetector
11
- implements RotationGestureListener {
11
+ implements RotationGestureListener
12
+ {
12
13
  onRotationBegin: (detector: RotationGestureDetector) => boolean;
13
14
  onRotation: (detector: RotationGestureDetector) => boolean;
14
15
  onRotationEnd: (detector: RotationGestureDetector) => void;
@@ -30,8 +30,6 @@ export default class FlingGestureHandler extends GestureHandler {
30
30
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
31
31
  super.updateGestureConfig({ enabled: enabled, ...props });
32
32
 
33
- this.enabled = enabled;
34
-
35
33
  if (this.config.direction) {
36
34
  this.direction = this.config.direction;
37
35
  }
@@ -124,7 +122,8 @@ export default class FlingGestureHandler extends GestureHandler {
124
122
  this.tracker.getTrackedPointersCount() >
125
123
  this.maxNumberOfPointersSimultaneously
126
124
  ) {
127
- this.maxNumberOfPointersSimultaneously = this.tracker.getTrackedPointersCount();
125
+ this.maxNumberOfPointersSimultaneously =
126
+ this.tracker.getTrackedPointersCount();
128
127
  }
129
128
  }
130
129
 
@@ -70,13 +70,18 @@ export default abstract class GestureHandler {
70
70
  );
71
71
  }
72
72
 
73
- this.view = (findNodeHandle(this.ref) as unknown) as HTMLElement;
73
+ this.view = findNodeHandle(this.ref) as unknown as HTMLElement;
74
74
  this.view.style['touchAction'] = 'none';
75
- this.view.style['webkitUserSelect'] = 'none';
76
- this.view.style['userSelect'] = 'none';
77
-
78
75
  //@ts-ignore This one disables default events on Safari
79
76
  this.view.style['WebkitTouchCallout'] = 'none';
77
+
78
+ if (!this.config.userSelect) {
79
+ this.view.style['webkitUserSelect'] = 'none';
80
+ this.view.style['userSelect'] = 'none';
81
+ } else {
82
+ this.view.style['webkitUserSelect'] = this.config.userSelect;
83
+ this.view.style['userSelect'] = this.config.userSelect;
84
+ }
80
85
  }
81
86
 
82
87
  private addEventManager(manager: EventManager): void {
@@ -322,6 +327,18 @@ export default abstract class GestureHandler {
322
327
  }
323
328
  }
324
329
  protected onPointerOut(event: AdaptedEvent): void {
330
+ if (this.shouldCancellWhenOutside) {
331
+ switch (this.currentState) {
332
+ case State.ACTIVE:
333
+ this.cancel();
334
+ break;
335
+ case State.BEGAN:
336
+ this.fail();
337
+ break;
338
+ }
339
+ return;
340
+ }
341
+
325
342
  if (this.config.needsPointerData) {
326
343
  this.sendTouchEvent(event);
327
344
  }
@@ -360,9 +377,8 @@ export default abstract class GestureHandler {
360
377
  const { onGestureHandlerEvent }: PropsRef = this.propsRef
361
378
  .current as PropsRef;
362
379
 
363
- const touchEvent: ResultTouchEvent | undefined = this.transformTouchEvent(
364
- event
365
- );
380
+ const touchEvent: ResultTouchEvent | undefined =
381
+ this.transformTouchEvent(event);
366
382
 
367
383
  if (touchEvent) {
368
384
  invokeNullableMethod(onGestureHandlerEvent, touchEvent);
@@ -374,10 +390,8 @@ export default abstract class GestureHandler {
374
390
  //
375
391
 
376
392
  public sendEvent = (newState: State, oldState: State): void => {
377
- const {
378
- onGestureHandlerEvent,
379
- onGestureHandlerStateChange,
380
- }: PropsRef = this.propsRef.current as PropsRef;
393
+ const { onGestureHandlerEvent, onGestureHandlerStateChange }: PropsRef =
394
+ this.propsRef.current as PropsRef;
381
395
 
382
396
  const resultEvent: ResultEvent = this.transformEventData(
383
397
  newState,
@@ -576,6 +590,11 @@ export default abstract class GestureHandler {
576
590
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
577
591
  this.config = { enabled: enabled, ...props };
578
592
  this.enabled = enabled;
593
+
594
+ if (this.config.shouldCancelWhenOutside !== undefined) {
595
+ this.setShouldCancelWhenOutside(this.config.shouldCancelWhenOutside);
596
+ }
597
+
579
598
  this.validateHitSlops();
580
599
 
581
600
  if (this.enabled) {
@@ -22,7 +22,6 @@ export default class LongPressGestureHandler extends GestureHandler {
22
22
 
23
23
  public init(ref: number, propsRef: React.RefObject<unknown>) {
24
24
  super.init(ref, propsRef);
25
- this.setShouldCancelWhenOutside(true);
26
25
 
27
26
  this.view.oncontextmenu = () => false;
28
27
  }
@@ -42,8 +41,6 @@ export default class LongPressGestureHandler extends GestureHandler {
42
41
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
43
42
  super.updateGestureConfig({ enabled: enabled, ...props });
44
43
 
45
- this.enabled = enabled;
46
-
47
44
  if (this.config.minDurationMs !== undefined) {
48
45
  this.minDurationMs = this.config.minDurationMs;
49
46
  }
@@ -1,4 +1,4 @@
1
- import { AdaptedEvent } from '../interfaces';
1
+ import { AdaptedEvent, Config } from '../interfaces';
2
2
  import GestureHandler from './GestureHandler';
3
3
 
4
4
  export default class ManualGestureHandler extends GestureHandler {
@@ -6,6 +6,10 @@ export default class ManualGestureHandler extends GestureHandler {
6
6
  super.init(ref, propsRef);
7
7
  }
8
8
 
9
+ public updateGestureConfig({ enabled = true, ...props }: Config): void {
10
+ super.updateGestureConfig({ enabled: enabled, ...props });
11
+ }
12
+
9
13
  protected onPointerDown(event: AdaptedEvent): void {
10
14
  this.tracker.addToTracker(event);
11
15
  super.onPointerDown(event);
@@ -22,6 +26,11 @@ export default class ManualGestureHandler extends GestureHandler {
22
26
  super.onPointerMove(event);
23
27
  }
24
28
 
29
+ protected onPointerOutOfBounds(event: AdaptedEvent): void {
30
+ this.tracker.track(event);
31
+ super.onPointerOutOfBounds(event);
32
+ }
33
+
25
34
  protected onPointerUp(event: AdaptedEvent): void {
26
35
  super.onPointerUp(event);
27
36
  this.tracker.removeFromTracker(event.pointerId);
@@ -29,8 +29,6 @@ export default class NativeViewGestureHandler extends GestureHandler {
29
29
  this.buttonRole = true;
30
30
  } else {
31
31
  this.buttonRole = false;
32
- this.view.style['webkitUserSelect'] = 'auto';
33
- this.view.style['userSelect'] = 'auto';
34
32
  }
35
33
  }
36
34
 
@@ -65,8 +65,6 @@ export default class PanGestureHandler extends GestureHandler {
65
65
  super.updateGestureConfig({ enabled: enabled, ...props });
66
66
  this.checkCustomActivationCriteria(this.customActivationProperties);
67
67
 
68
- this.enabled = enabled;
69
-
70
68
  if (this.config.minDist !== undefined) {
71
69
  this.minDistSq = this.config.minDist * this.config.minDist;
72
70
  } else if (this.hasCustomActivationCriteria) {
@@ -98,10 +96,6 @@ export default class PanGestureHandler extends GestureHandler {
98
96
  this.activateAfterLongPress = this.config.activateAfterLongPress;
99
97
  }
100
98
 
101
- if (this.config.shouldCancelWhenOutside !== undefined) {
102
- this.setShouldCancelWhenOutside(this.config.shouldCancelWhenOutside);
103
- }
104
-
105
99
  if (this.config.activeOffsetXStart !== undefined) {
106
100
  this.activeOffsetXStart = this.config.activeOffsetXStart;
107
101
 
@@ -57,8 +57,6 @@ export default class PinchGestureHandler extends GestureHandler {
57
57
 
58
58
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
59
59
  super.updateGestureConfig({ enabled: enabled, ...props });
60
-
61
- this.enabled = enabled;
62
60
  }
63
61
 
64
62
  protected transformNativeEvent() {
@@ -41,9 +41,8 @@ export default class RotationGestureHandler extends GestureHandler {
41
41
  },
42
42
  };
43
43
 
44
- private rotationGestureDetector: RotationGestureDetector = new RotationGestureDetector(
45
- this.rotationGestureListener
46
- );
44
+ private rotationGestureDetector: RotationGestureDetector =
45
+ new RotationGestureDetector(this.rotationGestureListener);
47
46
 
48
47
  public init(ref: number, propsRef: React.RefObject<unknown>): void {
49
48
  super.init(ref, propsRef);
@@ -53,8 +52,6 @@ export default class RotationGestureHandler extends GestureHandler {
53
52
 
54
53
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
55
54
  super.updateGestureConfig({ enabled: enabled, ...props });
56
-
57
- this.enabled = enabled;
58
55
  }
59
56
 
60
57
  protected transformNativeEvent() {
@@ -33,14 +33,11 @@ export default class TapGestureHandler extends GestureHandler {
33
33
 
34
34
  public init(ref: number, propsRef: React.RefObject<unknown>): void {
35
35
  super.init(ref, propsRef);
36
- this.setShouldCancelWhenOutside(true);
37
36
  }
38
37
 
39
38
  public updateGestureConfig({ enabled = true, ...props }: Config): void {
40
39
  super.updateGestureConfig({ enabled: enabled, ...props });
41
40
 
42
- this.enabled = enabled;
43
-
44
41
  if (this.config.numberOfTaps !== undefined) {
45
42
  this.numberOfTaps = this.config.numberOfTaps;
46
43
  }
@@ -1,3 +1,4 @@
1
+ import { UserSelect } from '../handlers/gestureHandlerCommon';
1
2
  import { Directions } from '../Directions';
2
3
  import { State } from '../State';
3
4
 
@@ -20,6 +21,7 @@ type ConfigArgs =
20
21
  | number
21
22
  | boolean
22
23
  | HitSlop
24
+ | UserSelect
23
25
  | Directions
24
26
  | Handler[]
25
27
  | null
@@ -31,6 +33,7 @@ export interface Config extends Record<string, ConfigArgs> {
31
33
  waitFor?: Handler[] | null;
32
34
  hitSlop?: HitSlop;
33
35
  shouldCancelWhenOutside?: boolean;
36
+ userSelect?: UserSelect;
34
37
 
35
38
  activateAfterLongPress?: number;
36
39
  failOffsetXStart?: number;
@@ -69,9 +69,8 @@ export default class InteractionManager {
69
69
  handler: GestureHandler,
70
70
  otherHandler: GestureHandler
71
71
  ): boolean {
72
- const simultaneousHandlers:
73
- | number[]
74
- | undefined = this.simultaneousRelations.get(handler.getTag());
72
+ const simultaneousHandlers: number[] | undefined =
73
+ this.simultaneousRelations.get(handler.getTag());
75
74
  if (!simultaneousHandlers) {
76
75
  return false;
77
76
  }