react-native-gesture-handler 2.9.0 → 2.10.1

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