react-native-gesture-handler 2.9.0 → 2.10.1

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 (224) hide show
  1. package/README.md +1 -0
  2. package/RNGestureHandler.podspec +1 -1
  3. package/android/build.gradle +69 -29
  4. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +1 -1
  5. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -0
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +39 -0
  7. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +8 -2
  8. package/ios/Handlers/RNNativeViewHandler.mm +4 -4
  9. package/ios/RNGestureHandlerButtonComponentView.h +2 -2
  10. package/ios/RNGestureHandlerButtonComponentView.mm +2 -2
  11. package/ios/RNGestureHandlerManager.mm +65 -16
  12. package/ios/RNGestureHandlerModule.mm +20 -16
  13. package/ios/RNGestureHandlerRootViewComponentView.mm +2 -2
  14. package/ios/RNRootViewGestureRecognizer.m +3 -3
  15. package/lib/commonjs/EnableNewWebImplementation.js +35 -0
  16. package/lib/commonjs/EnableNewWebImplementation.js.map +1 -0
  17. package/lib/commonjs/GestureHandlerRootViewContext.js +15 -0
  18. package/lib/commonjs/GestureHandlerRootViewContext.js.map +1 -0
  19. package/lib/commonjs/RNGestureHandlerModule.macos.js +6 -6
  20. package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
  21. package/lib/commonjs/RNGestureHandlerModule.web.js +6 -6
  22. package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
  23. package/lib/commonjs/RNGestureHandlerModule.windows.js +6 -6
  24. package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
  25. package/lib/commonjs/components/GestureComponents.web.js +6 -5
  26. package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
  27. package/lib/commonjs/components/GestureHandlerButton.js +3 -5
  28. package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
  29. package/lib/commonjs/{GestureHandlerRootView.android.js → components/GestureHandlerRootView.android.js} +8 -7
  30. package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -0
  31. package/lib/commonjs/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +8 -2
  32. package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -0
  33. package/lib/commonjs/{GestureHandlerRootView.web.js → components/GestureHandlerRootView.web.js} +7 -1
  34. package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -0
  35. package/lib/commonjs/components/Swipeable.js +17 -3
  36. package/lib/commonjs/components/Swipeable.js.map +1 -1
  37. package/lib/commonjs/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
  38. package/lib/commonjs/handlers/createHandler.js +21 -13
  39. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  40. package/lib/commonjs/handlers/gestureHandlerCommon.js +5 -4
  41. package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
  42. package/lib/commonjs/handlers/gestures/GestureDetector.js +19 -9
  43. package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
  44. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +22 -19
  45. package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
  46. package/lib/commonjs/index.js +16 -4
  47. package/lib/commonjs/index.js.map +1 -1
  48. package/lib/commonjs/utils.js +0 -6
  49. package/lib/commonjs/utils.js.map +1 -1
  50. package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -5
  51. package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
  52. package/lib/commonjs/web/handlers/GestureHandler.js +3 -0
  53. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  54. package/lib/commonjs/web/handlers/ManualGestureHandler.js +0 -5
  55. package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
  56. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +0 -6
  57. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  58. package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -12
  59. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  60. package/lib/commonjs/web/handlers/PinchGestureHandler.js +0 -5
  61. package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
  62. package/lib/commonjs/web/handlers/RotationGestureHandler.js +0 -6
  63. package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
  64. package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -6
  65. package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
  66. package/lib/commonjs/web/tools/CircularBuffer.js +59 -0
  67. package/lib/commonjs/web/tools/CircularBuffer.js.map +1 -0
  68. package/lib/commonjs/web/tools/LeastSquareSolver.js +204 -0
  69. package/lib/commonjs/web/tools/LeastSquareSolver.js.map +1 -0
  70. package/lib/commonjs/web/tools/PointerEventManager.js +27 -0
  71. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  72. package/lib/commonjs/web/tools/PointerTracker.js +11 -7
  73. package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
  74. package/lib/commonjs/web/tools/VelocityTracker.js +111 -0
  75. package/lib/commonjs/web/tools/VelocityTracker.js.map +1 -0
  76. package/lib/commonjs/web_hammer/GestureHandler.js +1 -1
  77. package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -1
  78. package/lib/module/EnableNewWebImplementation.js +22 -0
  79. package/lib/module/EnableNewWebImplementation.js.map +1 -0
  80. package/lib/module/GestureHandlerRootViewContext.js +3 -0
  81. package/lib/module/GestureHandlerRootViewContext.js.map +1 -0
  82. package/lib/module/RNGestureHandlerModule.macos.js +6 -6
  83. package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
  84. package/lib/module/RNGestureHandlerModule.web.js +6 -6
  85. package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
  86. package/lib/module/RNGestureHandlerModule.windows.js +6 -6
  87. package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
  88. package/lib/module/components/GestureComponents.web.js +5 -6
  89. package/lib/module/components/GestureComponents.web.js.map +1 -1
  90. package/lib/module/components/GestureHandlerButton.js +1 -4
  91. package/lib/module/components/GestureHandlerButton.js.map +1 -1
  92. package/lib/module/components/GestureHandlerRootView.android.js +14 -0
  93. package/lib/module/components/GestureHandlerRootView.android.js.map +1 -0
  94. package/lib/module/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +5 -2
  95. package/lib/module/components/GestureHandlerRootView.js.map +1 -0
  96. package/lib/module/components/GestureHandlerRootView.web.js +9 -0
  97. package/lib/module/components/GestureHandlerRootView.web.js.map +1 -0
  98. package/lib/module/components/Swipeable.js +17 -3
  99. package/lib/module/components/Swipeable.js.map +1 -1
  100. package/lib/module/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
  101. package/lib/module/handlers/createHandler.js +20 -13
  102. package/lib/module/handlers/createHandler.js.map +1 -1
  103. package/lib/module/handlers/gestureHandlerCommon.js +5 -4
  104. package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
  105. package/lib/module/handlers/gestures/GestureDetector.js +18 -10
  106. package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
  107. package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -16
  108. package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
  109. package/lib/module/index.js +4 -4
  110. package/lib/module/index.js.map +1 -1
  111. package/lib/module/utils.js +0 -4
  112. package/lib/module/utils.js.map +1 -1
  113. package/lib/module/web/handlers/FlingGestureHandler.js +0 -5
  114. package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
  115. package/lib/module/web/handlers/GestureHandler.js +3 -0
  116. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  117. package/lib/module/web/handlers/ManualGestureHandler.js +0 -5
  118. package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
  119. package/lib/module/web/handlers/NativeViewGestureHandler.js +0 -6
  120. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  121. package/lib/module/web/handlers/PanGestureHandler.js +2 -9
  122. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  123. package/lib/module/web/handlers/PinchGestureHandler.js +0 -5
  124. package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
  125. package/lib/module/web/handlers/RotationGestureHandler.js +0 -6
  126. package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
  127. package/lib/module/web/handlers/TapGestureHandler.js +0 -6
  128. package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
  129. package/lib/module/web/tools/CircularBuffer.js +50 -0
  130. package/lib/module/web/tools/CircularBuffer.js.map +1 -0
  131. package/lib/module/web/tools/LeastSquareSolver.js +195 -0
  132. package/lib/module/web/tools/LeastSquareSolver.js.map +1 -0
  133. package/lib/module/web/tools/PointerEventManager.js +27 -0
  134. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  135. package/lib/module/web/tools/PointerTracker.js +8 -7
  136. package/lib/module/web/tools/PointerTracker.js.map +1 -1
  137. package/lib/module/web/tools/VelocityTracker.js +98 -0
  138. package/lib/module/web/tools/VelocityTracker.js.map +1 -0
  139. package/lib/module/web_hammer/GestureHandler.js +1 -1
  140. package/lib/module/web_hammer/GestureHandler.js.map +1 -1
  141. package/lib/typescript/EnableNewWebImplementation.d.ts +3 -0
  142. package/lib/typescript/GestureHandlerRootViewContext.d.ts +3 -0
  143. package/lib/typescript/components/GestureComponents.web.d.ts +1 -1
  144. package/lib/typescript/components/Swipeable.d.ts +12 -1
  145. package/lib/typescript/{gestureHandlerRootHOC.d.ts → components/gestureHandlerRootHOC.d.ts} +1 -1
  146. package/lib/typescript/index.d.ts +4 -4
  147. package/lib/typescript/utils.d.ts +0 -1
  148. package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -1
  149. package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +0 -1
  150. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +0 -1
  151. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -1
  152. package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +0 -1
  153. package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +0 -1
  154. package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -1
  155. package/lib/typescript/web/tools/CircularBuffer.d.ts +11 -0
  156. package/lib/typescript/web/tools/LeastSquareSolver.d.ts +12 -0
  157. package/lib/typescript/web/tools/PointerEventManager.d.ts +2 -0
  158. package/lib/typescript/web/tools/PointerTracker.d.ts +1 -0
  159. package/lib/typescript/web/tools/VelocityTracker.d.ts +13 -0
  160. package/package.json +3 -3
  161. package/src/EnableNewWebImplementation.ts +35 -0
  162. package/src/GestureHandlerRootViewContext.ts +3 -0
  163. package/src/RNGestureHandlerModule.macos.ts +6 -6
  164. package/src/RNGestureHandlerModule.web.ts +6 -6
  165. package/src/RNGestureHandlerModule.windows.ts +6 -6
  166. package/src/components/GestureComponents.web.tsx +5 -6
  167. package/src/components/GestureHandlerButton.tsx +2 -7
  168. package/src/components/GestureHandlerRootView.android.tsx +24 -0
  169. package/src/{GestureHandlerRootView.tsx → components/GestureHandlerRootView.tsx} +7 -2
  170. package/src/{GestureHandlerRootView.web.tsx → components/GestureHandlerRootView.web.tsx} +6 -1
  171. package/src/components/Swipeable.tsx +30 -4
  172. package/src/{gestureHandlerRootHOC.tsx → components/gestureHandlerRootHOC.tsx} +1 -1
  173. package/src/handlers/createHandler.tsx +20 -9
  174. package/src/handlers/gestureHandlerCommon.ts +5 -6
  175. package/src/handlers/gestures/GestureDetector.tsx +19 -9
  176. package/src/handlers/gestures/reanimatedWrapper.ts +21 -20
  177. package/src/index.ts +7 -3
  178. package/src/utils.ts +0 -5
  179. package/src/web/handlers/FlingGestureHandler.ts +0 -5
  180. package/src/web/handlers/GestureHandler.ts +3 -0
  181. package/src/web/handlers/ManualGestureHandler.ts +0 -5
  182. package/src/web/handlers/NativeViewGestureHandler.ts +0 -6
  183. package/src/web/handlers/PanGestureHandler.ts +2 -9
  184. package/src/web/handlers/PinchGestureHandler.ts +0 -5
  185. package/src/web/handlers/RotationGestureHandler.ts +0 -7
  186. package/src/web/handlers/TapGestureHandler.ts +0 -6
  187. package/src/web/tools/CircularBuffer.ts +42 -0
  188. package/src/web/tools/LeastSquareSolver.ts +182 -0
  189. package/src/web/tools/PointerEventManager.ts +29 -0
  190. package/src/web/tools/PointerTracker.ts +7 -7
  191. package/src/web/tools/VelocityTracker.ts +98 -0
  192. package/src/web_hammer/GestureHandler.ts +1 -1
  193. package/lib/commonjs/EnableExperimentalWebImplementation.js +0 -31
  194. package/lib/commonjs/EnableExperimentalWebImplementation.js.map +0 -1
  195. package/lib/commonjs/GestureHandlerRootView.android.js.map +0 -1
  196. package/lib/commonjs/GestureHandlerRootView.js.map +0 -1
  197. package/lib/commonjs/GestureHandlerRootView.web.js.map +0 -1
  198. package/lib/module/EnableExperimentalWebImplementation.js +0 -20
  199. package/lib/module/EnableExperimentalWebImplementation.js.map +0 -1
  200. package/lib/module/GestureHandlerRootView.android.js +0 -14
  201. package/lib/module/GestureHandlerRootView.android.js.map +0 -1
  202. package/lib/module/GestureHandlerRootView.js.map +0 -1
  203. package/lib/module/GestureHandlerRootView.web.js +0 -6
  204. package/lib/module/GestureHandlerRootView.web.js.map +0 -1
  205. package/lib/typescript/EnableExperimentalWebImplementation.d.ts +0 -2
  206. package/src/EnableExperimentalWebImplementation.ts +0 -27
  207. package/src/GestureHandlerRootView.android.tsx +0 -24
  208. /package/lib/commonjs/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
  209. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
  210. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
  211. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
  212. /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
  213. /package/lib/module/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
  214. /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
  215. /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
  216. /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
  217. /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
  218. /package/lib/typescript/{GestureHandlerRootView.android.d.ts → components/GestureHandlerRootView.android.d.ts} +0 -0
  219. /package/lib/typescript/{GestureHandlerRootView.d.ts → components/GestureHandlerRootView.d.ts} +0 -0
  220. /package/lib/typescript/{GestureHandlerRootView.web.d.ts → components/GestureHandlerRootView.web.d.ts} +0 -0
  221. /package/lib/typescript/{fabric → specs}/RNGestureHandlerButtonNativeComponent.d.ts +0 -0
  222. /package/lib/typescript/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.d.ts +0 -0
  223. /package/src/{fabric → specs}/RNGestureHandlerButtonNativeComponent.ts +0 -0
  224. /package/src/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.ts +0 -0
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, useState } from 'react';
1
+ import React, { useContext, useEffect, useRef, useState } from 'react';
2
2
  import {
3
3
  GestureType,
4
4
  HandlerCallbacks,
@@ -42,7 +42,9 @@ import { Platform } from 'react-native';
42
42
  import type RNGestureHandlerModuleWeb from '../../RNGestureHandlerModule.web';
43
43
  import { onGestureHandlerEvent } from './eventReceiver';
44
44
  import { RNRenderer } from '../../RNRenderer';
45
- import { isExperimentalWebImplementationEnabled } from '../../EnableExperimentalWebImplementation';
45
+ import { isNewWebImplementationEnabled } from '../../EnableNewWebImplementation';
46
+ import { nativeViewGestureHandlerProps } from '../NativeViewGestureHandler';
47
+ import GestureHandlerRootViewContext from '../../GestureHandlerRootViewContext';
46
48
 
47
49
  declare const global: {
48
50
  isFormsStackingContext: (node: unknown) => boolean | null; // JSI function
@@ -56,6 +58,7 @@ const ALLOWED_PROPS = [
56
58
  ...longPressGestureHandlerProps,
57
59
  ...forceTouchGestureHandlerProps,
58
60
  ...flingGestureHandlerProps,
61
+ ...nativeViewGestureHandlerProps,
59
62
  ];
60
63
 
61
64
  export type GestureConfigReference = {
@@ -147,9 +150,9 @@ function attachHandlers({
147
150
  preparedGesture.firstExecution = false;
148
151
  }
149
152
 
150
- // use setImmediate to extract handlerTags, because all refs should be initialized
153
+ // use queueMicrotask to extract handlerTags, because all refs should be initialized
151
154
  // when it's ran
152
- setImmediate(() => {
155
+ queueMicrotask(() => {
153
156
  if (!mountedRef.current) {
154
157
  return;
155
158
  }
@@ -167,9 +170,9 @@ function attachHandlers({
167
170
  registerHandler(handler.handlerTag, handler, handler.config.testId);
168
171
  }
169
172
 
170
- // use setImmediate to extract handlerTags, because all refs should be initialized
173
+ // use queueMicrotask to extract handlerTags, because all refs should be initialized
171
174
  // when it's ran
172
- setImmediate(() => {
175
+ queueMicrotask(() => {
173
176
  if (!mountedRef.current) {
174
177
  return;
175
178
  }
@@ -254,10 +257,10 @@ function updateHandlers(
254
257
  }
255
258
  }
256
259
 
257
- // use setImmediate to extract handlerTags, because when it's ran, all refs should be updated
260
+ // use queueMicrotask to extract handlerTags, because when it's ran, all refs should be updated
258
261
  // and handlerTags in BaseGesture references should be updated in the loop above (we need to wait
259
262
  // in case of external relations)
260
- setImmediate(() => {
263
+ queueMicrotask(() => {
261
264
  if (!mountedRef.current) {
262
265
  return;
263
266
  }
@@ -603,6 +606,13 @@ interface GestureDetectorState {
603
606
  forceReattach: boolean;
604
607
  }
605
608
  export const GestureDetector = (props: GestureDetectorProps) => {
609
+ const rootViewContext = useContext(GestureHandlerRootViewContext);
610
+ if (__DEV__ && !rootViewContext) {
611
+ throw new Error(
612
+ 'GestureDetector must be used as a descendant of GestureHandlerRootView. Otherwise the gestures will not be recognized. See https://docs.swmansion.com/react-native-gesture-handler/docs/installation for more details.'
613
+ );
614
+ }
615
+
606
616
  const gestureConfig = props.gesture;
607
617
 
608
618
  if (props.userSelect) {
@@ -624,7 +634,7 @@ export const GestureDetector = (props: GestureDetectorProps) => {
624
634
  onGestureHandlerEvent: (e: HandlerStateChangeEvent<unknown>) => {
625
635
  onGestureHandlerEvent(e.nativeEvent);
626
636
  },
627
- onGestureHandlerStateChange: isExperimentalWebImplementationEnabled()
637
+ onGestureHandlerStateChange: isNewWebImplementationEnabled()
628
638
  ? (e: HandlerStateChangeEvent<unknown>) => {
629
639
  onGestureHandlerEvent(e.nativeEvent);
630
640
  }
@@ -29,27 +29,28 @@ let Reanimated: {
29
29
 
30
30
  try {
31
31
  Reanimated = require('react-native-reanimated');
32
+ } catch (e) {
33
+ // When 'react-native-reanimated' is not available we want to quietly continue
34
+ // @ts-ignore TS demands the variable to be initialized
35
+ Reanimated = undefined;
36
+ }
32
37
 
33
- if (!Reanimated.useSharedValue) {
34
- // @ts-ignore Make sure the loaded module is actually Reanimated, if it's not
35
- // reset the module to undefined so we can fallback to the default implementation
36
- Reanimated = undefined;
37
- throw new Error('react-native-reanimated is not found');
38
- }
38
+ if (!Reanimated?.useSharedValue) {
39
+ // @ts-ignore Make sure the loaded module is actually Reanimated, if it's not
40
+ // reset the module to undefined so we can fallback to the default implementation
41
+ Reanimated = undefined;
42
+ }
39
43
 
40
- if (!Reanimated.setGestureState) {
41
- Reanimated.setGestureState = () => {
42
- 'worklet';
43
- console.warn(
44
- tagMessage(
45
- 'Please use newer version of react-native-reanimated in order to control state of the gestures.'
46
- )
47
- );
48
- };
49
- }
50
- // When 'react-native-reanimated' is not available we want to
51
- // quietly continue
52
- // eslint-disable-next-line no-empty
53
- } catch (e) {}
44
+ if (Reanimated !== undefined && !Reanimated.setGestureState) {
45
+ // The loaded module is Reanimated but it doesn't have the setGestureState defined
46
+ Reanimated.setGestureState = () => {
47
+ 'worklet';
48
+ console.warn(
49
+ tagMessage(
50
+ 'Please use newer version of react-native-reanimated in order to control state of the gestures.'
51
+ )
52
+ );
53
+ };
54
+ }
54
55
 
55
56
  export { Reanimated };
package/src/index.ts CHANGED
@@ -2,8 +2,8 @@ import { initialize } from './init';
2
2
 
3
3
  export { Directions } from './Directions';
4
4
  export { State } from './State';
5
- export { default as gestureHandlerRootHOC } from './gestureHandlerRootHOC';
6
- export { default as GestureHandlerRootView } from './GestureHandlerRootView';
5
+ export { default as gestureHandlerRootHOC } from './components/gestureHandlerRootHOC';
6
+ export { default as GestureHandlerRootView } from './components/GestureHandlerRootView';
7
7
  export type {
8
8
  // event types
9
9
  GestureEvent,
@@ -92,6 +92,7 @@ export {
92
92
  BaseButton,
93
93
  RectButton,
94
94
  BorderlessButton,
95
+ PureNativeButton,
95
96
  } from './components/GestureButtons';
96
97
  export {
97
98
  TouchableHighlight,
@@ -157,6 +158,9 @@ export type {
157
158
  } from './components/DrawerLayout';
158
159
  export { default as DrawerLayout } from './components/DrawerLayout';
159
160
 
160
- export { enableExperimentalWebImplementation } from './EnableExperimentalWebImplementation';
161
+ export {
162
+ enableExperimentalWebImplementation,
163
+ enableLegacyWebImplementation,
164
+ } from './EnableNewWebImplementation';
161
165
 
162
166
  initialize();
package/src/utils.ts CHANGED
@@ -55,11 +55,6 @@ export function isFabric(): boolean {
55
55
  return !!global?.nativeFabricUIManager;
56
56
  }
57
57
 
58
- export function shouldUseCodegenNativeComponent(): boolean {
59
- // use codegenNativeComponent starting with RN 0.68
60
- return REACT_NATIVE_VERSION.minor >= 68 || REACT_NATIVE_VERSION.major > 0;
61
- }
62
-
63
58
  export function isRemoteDebuggingEnabled(): boolean {
64
59
  // react-native-reanimated checks if in remote debugging in the same way
65
60
  // @ts-ignore global is available but node types are not included
@@ -159,11 +159,6 @@ export default class FlingGestureHandler extends GestureHandler {
159
159
  this.endFling();
160
160
  }
161
161
 
162
- protected onPointerCancel(event: AdaptedEvent): void {
163
- super.onPointerCancel(event);
164
- this.reset();
165
- }
166
-
167
162
  public activate(force?: boolean): void {
168
163
  super.activate(force);
169
164
  this.end();
@@ -352,6 +352,9 @@ export default abstract class GestureHandler {
352
352
  if (this.config.needsPointerData) {
353
353
  this.sendTouchEvent(event);
354
354
  }
355
+
356
+ this.cancel();
357
+ this.reset();
355
358
  }
356
359
  protected onPointerOutOfBounds(event: AdaptedEvent): void {
357
360
  this.tryToSendMoveEvent(true);
@@ -40,9 +40,4 @@ export default class ManualGestureHandler extends GestureHandler {
40
40
  super.onPointerRemove(event);
41
41
  this.tracker.removeFromTracker(event.pointerId);
42
42
  }
43
-
44
- protected onPointerCancel(event: AdaptedEvent): void {
45
- super.onPointerCancel(event);
46
- this.reset();
47
- }
48
43
  }
@@ -115,12 +115,6 @@ export default class NativeViewGestureHandler extends GestureHandler {
115
115
  }
116
116
  }
117
117
 
118
- protected onPointerCancel(event: AdaptedEvent): void {
119
- super.onPointerCancel(event);
120
- this.cancel();
121
- this.reset();
122
- }
123
-
124
118
  public shouldRecognizeSimultaneously(handler: GestureHandler): boolean {
125
119
  if (super.shouldRecognizeSimultaneously(handler)) {
126
120
  return true;
@@ -1,4 +1,3 @@
1
- import { PixelRatio } from 'react-native';
2
1
  import { State } from '../../State';
3
2
  import { DEFAULT_TOUCH_SLOP } from '../constants';
4
3
  import { AdaptedEvent, Config } from '../interfaces';
@@ -188,7 +187,6 @@ export default class PanGestureHandler extends GestureHandler {
188
187
 
189
188
  protected transformNativeEvent() {
190
189
  const rect: DOMRect = this.view.getBoundingClientRect();
191
- const ratio = PixelRatio.get();
192
190
 
193
191
  const translationX: number = this.getTranslationX();
194
192
  const translationY: number = this.getTranslationY();
@@ -198,8 +196,8 @@ export default class PanGestureHandler extends GestureHandler {
198
196
  translationY: isNaN(translationY) ? 0 : translationY,
199
197
  absoluteX: this.tracker.getLastAvgX(),
200
198
  absoluteY: this.tracker.getLastAvgY(),
201
- velocityX: this.velocityX * ratio * 10,
202
- velocityY: this.velocityY * ratio * 10,
199
+ velocityX: this.velocityX,
200
+ velocityY: this.velocityY,
203
201
  x: this.tracker.getLastAvgX() - rect.left,
204
202
  y: this.tracker.getLastAvgY() - rect.top,
205
203
  };
@@ -306,11 +304,6 @@ export default class PanGestureHandler extends GestureHandler {
306
304
  super.onPointerMove(event);
307
305
  }
308
306
 
309
- protected onPointerCancel(event: AdaptedEvent): void {
310
- super.onPointerCancel(event);
311
-
312
- this.reset();
313
- }
314
307
  protected onPointerOutOfBounds(event: AdaptedEvent): void {
315
308
  if (this.getShouldCancelWhenOutside()) {
316
309
  return;
@@ -127,11 +127,6 @@ export default class PinchGestureHandler extends GestureHandler {
127
127
  super.onPointerOutOfBounds(event);
128
128
  }
129
129
 
130
- protected onPointerCancel(event: AdaptedEvent): void {
131
- super.onPointerCancel(event);
132
- this.reset();
133
- }
134
-
135
130
  private tryBegin(): void {
136
131
  if (this.currentState !== State.UNDETERMINED) {
137
132
  return;
@@ -148,13 +148,6 @@ export default class RotationGestureHandler extends GestureHandler {
148
148
  this.tracker.removeFromTracker(event.pointerId);
149
149
  }
150
150
 
151
- protected onPointerCancel(event: AdaptedEvent): void {
152
- super.onPointerCancel(event);
153
- this.end();
154
-
155
- this.reset();
156
- }
157
-
158
151
  protected tryBegin(): void {
159
152
  if (this.currentState !== State.UNDETERMINED) {
160
153
  return;
@@ -197,12 +197,6 @@ export default class TapGestureHandler extends GestureHandler {
197
197
  super.onPointerOutOfBounds(event);
198
198
  }
199
199
 
200
- protected onPointerCancel(event: AdaptedEvent): void {
201
- super.onPointerCancel(event);
202
- this.tracker.resetTracker();
203
- this.fail();
204
- }
205
-
206
200
  private updateState(event: AdaptedEvent): void {
207
201
  if (
208
202
  this.currentMaxNumberOfPointers < this.tracker.getTrackedPointersCount()
@@ -0,0 +1,42 @@
1
+ export default class CircularBuffer<T> {
2
+ private bufferSize: number;
3
+ private buffer: T[];
4
+ private index: number;
5
+ private actualSize: number;
6
+
7
+ constructor(size: number) {
8
+ this.bufferSize = size;
9
+ this.buffer = new Array<T>(size);
10
+ this.index = 0;
11
+ this.actualSize = 0;
12
+ }
13
+
14
+ public get size(): number {
15
+ return this.actualSize;
16
+ }
17
+
18
+ public push(element: T): void {
19
+ this.buffer[this.index] = element;
20
+ this.index = (this.index + 1) % this.bufferSize;
21
+ this.actualSize = Math.min(this.actualSize + 1, this.bufferSize);
22
+ }
23
+
24
+ public get(at: number): T {
25
+ if (this.actualSize === this.bufferSize) {
26
+ let index = (this.index + at) % this.bufferSize;
27
+ if (index < 0) {
28
+ index += this.bufferSize;
29
+ }
30
+
31
+ return this.buffer[index];
32
+ } else {
33
+ return this.buffer[at];
34
+ }
35
+ }
36
+
37
+ public clear(): void {
38
+ this.buffer = new Array<T>(this.bufferSize);
39
+ this.index = 0;
40
+ this.actualSize = 0;
41
+ }
42
+ }
@@ -0,0 +1,182 @@
1
+ // Implementation taken from Flutter's LeastSquareSolver
2
+ // https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/gestures/lsq_solver.dart
3
+
4
+ class Vector {
5
+ private offset: number;
6
+ private length: number;
7
+ private elements: number[];
8
+
9
+ constructor(length: number) {
10
+ this.offset = 0;
11
+ this.length = length;
12
+ this.elements = new Array<number>(length);
13
+ }
14
+
15
+ public static fromVOL(
16
+ values: number[],
17
+ offset: number,
18
+ length: number
19
+ ): Vector {
20
+ const result = new Vector(0);
21
+
22
+ result.offset = offset;
23
+ result.length = length;
24
+ result.elements = values;
25
+
26
+ return result;
27
+ }
28
+
29
+ public get(index: number): number {
30
+ return this.elements[this.offset + index];
31
+ }
32
+
33
+ public set(index: number, value: number): void {
34
+ this.elements[this.offset + index] = value;
35
+ }
36
+
37
+ public dot(other: Vector): number {
38
+ let result = 0;
39
+ for (let i = 0; i < this.length; i++) {
40
+ result += this.get(i) * other.get(i);
41
+ }
42
+ return result;
43
+ }
44
+
45
+ public norm() {
46
+ return Math.sqrt(this.dot(this));
47
+ }
48
+ }
49
+
50
+ class Matrix {
51
+ private columns: number;
52
+ private elements: number[];
53
+
54
+ constructor(rows: number, columns: number) {
55
+ this.columns = columns;
56
+ this.elements = new Array<number>(rows * columns);
57
+ }
58
+
59
+ public get(row: number, column: number): number {
60
+ return this.elements[row * this.columns + column];
61
+ }
62
+
63
+ public set(row: number, column: number, value: number): void {
64
+ this.elements[row * this.columns + column] = value;
65
+ }
66
+
67
+ public getRow(row: number): Vector {
68
+ return Vector.fromVOL(this.elements, row * this.columns, this.columns);
69
+ }
70
+ }
71
+
72
+ /// An nth degree polynomial fit to a dataset.
73
+ class PolynomialFit {
74
+ /// The polynomial coefficients of the fit.
75
+ ///
76
+ /// For each `i`, the element `coefficients[i]` is the coefficient of
77
+ /// the `i`-th power of the variable.
78
+ public coefficients: number[];
79
+
80
+ /// Creates a polynomial fit of the given degree.
81
+ ///
82
+ /// There are n + 1 coefficients in a fit of degree n.
83
+ constructor(degree: number) {
84
+ this.coefficients = new Array<number>(degree + 1);
85
+ }
86
+ }
87
+
88
+ const precisionErrorTolerance = 1e-10;
89
+
90
+ /// Uses the least-squares algorithm to fit a polynomial to a set of data.
91
+ export default class LeastSquareSolver {
92
+ /// The x-coordinates of each data point.
93
+ private x: number[];
94
+ /// The y-coordinates of each data point.
95
+ private y: number[];
96
+ /// The weight to use for each data point.
97
+ private w: number[];
98
+
99
+ /// Creates a least-squares solver.
100
+ ///
101
+ /// The [x], [y], and [w] arguments must not be null.
102
+ constructor(x: number[], y: number[], w: number[]) {
103
+ this.x = x;
104
+ this.y = y;
105
+ this.w = w;
106
+ }
107
+
108
+ /// Fits a polynomial of the given degree to the data points.
109
+ ///
110
+ /// When there is not enough data to fit a curve null is returned.
111
+ public solve(degree: number): PolynomialFit | null {
112
+ if (degree > this.x.length) {
113
+ // Not enough data to fit a curve.
114
+ return null;
115
+ }
116
+
117
+ const result = new PolynomialFit(degree);
118
+
119
+ // Shorthands for the purpose of notation equivalence to original C++ code.
120
+ const m = this.x.length;
121
+ const n = degree + 1;
122
+
123
+ // Expand the X vector to a matrix A, pre-multiplied by the weights.
124
+ const a = new Matrix(n, m);
125
+ for (let h = 0; h < m; h++) {
126
+ a.set(0, h, this.w[h]);
127
+
128
+ for (let i = 1; i < n; i++) {
129
+ a.set(i, h, a.get(i - 1, h) * this.x[h]);
130
+ }
131
+ }
132
+
133
+ // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
134
+
135
+ // Orthonormal basis, column-major ordVectorer.
136
+ const q = new Matrix(n, m);
137
+ // Upper triangular matrix, row-major order.
138
+ const r = new Matrix(n, m);
139
+
140
+ for (let j = 0; j < n; j += 1) {
141
+ for (let h = 0; h < m; h += 1) {
142
+ q.set(j, h, a.get(j, h));
143
+ }
144
+ for (let i = 0; i < j; i += 1) {
145
+ const dot = q.getRow(j).dot(q.getRow(i));
146
+ for (let h = 0; h < m; h += 1) {
147
+ q.set(j, h, q.get(j, h) - dot * q.get(i, h));
148
+ }
149
+ }
150
+
151
+ const norm = q.getRow(j).norm();
152
+ if (norm < precisionErrorTolerance) {
153
+ // Vectors are linearly dependent or zero so no solution.
154
+ return null;
155
+ }
156
+
157
+ const inverseNorm = 1.0 / norm;
158
+ for (let h = 0; h < m; h += 1) {
159
+ q.set(j, h, q.get(j, h) * inverseNorm);
160
+ }
161
+ for (let i = 0; i < n; i += 1) {
162
+ r.set(j, i, i < j ? 0.0 : q.getRow(j).dot(a.getRow(i)));
163
+ }
164
+ }
165
+
166
+ // Solve R B = Qt W Y to find B. This is easy because R is upper triangular.
167
+ // We just work from bottom-right to top-left calculating B's coefficients.
168
+ const wy = new Vector(m);
169
+ for (let h = 0; h < m; h += 1) {
170
+ wy.set(h, this.y[h] * this.w[h]);
171
+ }
172
+ for (let i = n - 1; i >= 0; i -= 1) {
173
+ result.coefficients[i] = q.getRow(i).dot(wy);
174
+ for (let j = n - 1; j > i; j -= 1) {
175
+ result.coefficients[i] -= r.get(i, j) * result.coefficients[j];
176
+ }
177
+ result.coefficients[i] /= r.get(i, i);
178
+ }
179
+
180
+ return result;
181
+ }
182
+ }
@@ -8,6 +8,8 @@ import EventManager from './EventManager';
8
8
  import { isPointerInBounds } from '../utils';
9
9
 
10
10
  export default class PointerEventManager extends EventManager {
11
+ private trackedPointers = new Set<number>();
12
+
11
13
  public setListeners(): void {
12
14
  this.view.addEventListener('pointerdown', (event: PointerEvent): void => {
13
15
  if (event.pointerType === PointerType.TOUCH) {
@@ -24,6 +26,7 @@ export default class PointerEventManager extends EventManager {
24
26
 
25
27
  target.setPointerCapture(adaptedEvent.pointerId);
26
28
  this.markAsInBounds(adaptedEvent.pointerId);
29
+ this.trackedPointers.add(adaptedEvent.pointerId);
27
30
 
28
31
  if (++this.activePointersCounter > 1) {
29
32
  adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_DOWN;
@@ -51,6 +54,7 @@ export default class PointerEventManager extends EventManager {
51
54
 
52
55
  target.releasePointerCapture(adaptedEvent.pointerId);
53
56
  this.markAsOutOfBounds(adaptedEvent.pointerId);
57
+ this.trackedPointers.delete(adaptedEvent.pointerId);
54
58
 
55
59
  if (--this.activePointersCounter > 0) {
56
60
  adaptedEvent.eventType = EventTypes.ADDITIONAL_POINTER_UP;
@@ -115,7 +119,27 @@ export default class PointerEventManager extends EventManager {
115
119
  this.onPointerCancel(adaptedEvent);
116
120
  this.markAsOutOfBounds(adaptedEvent.pointerId);
117
121
  this.activePointersCounter = 0;
122
+ this.trackedPointers.clear();
118
123
  });
124
+
125
+ this.view.addEventListener(
126
+ 'lostpointercapture',
127
+ (event: PointerEvent): void => {
128
+ const adaptedEvent: AdaptedEvent = this.mapEvent(
129
+ event,
130
+ EventTypes.CANCEL
131
+ );
132
+
133
+ if (this.trackedPointers.has(adaptedEvent.pointerId)) {
134
+ // in some cases the `pointerup` event is not fired, but `lostpointercapture` is
135
+ // we simulate the `pointercancel` event here to make sure the gesture handler stops tracking it
136
+ this.onPointerCancel(adaptedEvent);
137
+
138
+ this.activePointersCounter = 0;
139
+ this.trackedPointers.clear();
140
+ }
141
+ }
142
+ );
119
143
  }
120
144
 
121
145
  protected mapEvent(event: PointerEvent, eventType: EventTypes): AdaptedEvent {
@@ -131,4 +155,9 @@ export default class PointerEventManager extends EventManager {
131
155
  time: event.timeStamp,
132
156
  };
133
157
  }
158
+
159
+ public resetManager(): void {
160
+ super.resetManager();
161
+ this.trackedPointers.clear();
162
+ }
134
163
  }
@@ -1,4 +1,5 @@
1
1
  import { AdaptedEvent } from '../interfaces';
2
+ import VelocityTracker from './VelocityTracker';
2
3
 
3
4
  export interface TrackerElement {
4
5
  lastX: number;
@@ -10,11 +11,10 @@ export interface TrackerElement {
10
11
  velocityY: number;
11
12
  }
12
13
 
13
- // Used to scale velocity so that it is similar to velocity in Android/iOS
14
- const VELOCITY_FACTOR = 0.2;
15
14
  const MAX_POINTERS = 20;
16
15
 
17
16
  export default class PointerTracker {
17
+ private velocityTracker = new VelocityTracker();
18
18
  private trackedPointers: Map<number, TrackerElement> = new Map<
19
19
  number,
20
20
  TrackerElement
@@ -74,12 +74,11 @@ export default class PointerTracker {
74
74
 
75
75
  this.lastMovedPointerId = event.pointerId;
76
76
 
77
- const dx = event.x - element.lastX;
78
- const dy = event.y - element.lastY;
79
- const dt = event.time - element.timeStamp;
77
+ this.velocityTracker.add(event);
78
+ const [velocityX, velocityY] = this.velocityTracker.getVelocity();
80
79
 
81
- element.velocityX = (dx / dt) * 1000 * VELOCITY_FACTOR;
82
- element.velocityY = (dy / dt) * 1000 * VELOCITY_FACTOR;
80
+ element.velocityX = velocityX;
81
+ element.velocityY = velocityY;
83
82
 
84
83
  element.lastX = event.x;
85
84
  element.lastY = event.y;
@@ -223,6 +222,7 @@ export default class PointerTracker {
223
222
  }
224
223
 
225
224
  public resetTracker(): void {
225
+ this.velocityTracker.reset();
226
226
  this.trackedPointers.clear();
227
227
  this.lastMovedPointerId = NaN;
228
228