react-native-gesture-handler 2.7.1 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }