react-native-gesture-handler 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -0
- package/RNGestureHandler.podspec +1 -1
- package/android/build.gradle +69 -29
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +1 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/NativeViewGestureHandler.kt +39 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +8 -2
- package/ios/Handlers/RNNativeViewHandler.mm +4 -4
- package/ios/RNGestureHandlerButtonComponentView.h +2 -2
- package/ios/RNGestureHandlerButtonComponentView.mm +2 -2
- package/ios/RNGestureHandlerManager.mm +9 -9
- package/ios/RNGestureHandlerModule.mm +16 -16
- package/ios/RNGestureHandlerRootViewComponentView.mm +2 -2
- package/ios/RNRootViewGestureRecognizer.m +3 -3
- package/lib/commonjs/EnableNewWebImplementation.js +35 -0
- package/lib/commonjs/EnableNewWebImplementation.js.map +1 -0
- package/lib/commonjs/GestureHandlerRootViewContext.js +15 -0
- package/lib/commonjs/GestureHandlerRootViewContext.js.map +1 -0
- package/lib/commonjs/RNGestureHandlerModule.macos.js +6 -6
- package/lib/commonjs/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.web.js +6 -6
- package/lib/commonjs/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/commonjs/RNGestureHandlerModule.windows.js +6 -6
- package/lib/commonjs/RNGestureHandlerModule.windows.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.web.js +6 -5
- package/lib/commonjs/components/GestureComponents.web.js.map +1 -1
- package/lib/commonjs/components/GestureHandlerButton.js +3 -5
- package/lib/commonjs/components/GestureHandlerButton.js.map +1 -1
- package/lib/commonjs/{GestureHandlerRootView.android.js → components/GestureHandlerRootView.android.js} +8 -7
- package/lib/commonjs/components/GestureHandlerRootView.android.js.map +1 -0
- package/lib/commonjs/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +8 -2
- package/lib/commonjs/components/GestureHandlerRootView.js.map +1 -0
- package/lib/commonjs/{GestureHandlerRootView.web.js → components/GestureHandlerRootView.web.js} +7 -1
- package/lib/commonjs/components/GestureHandlerRootView.web.js.map +1 -0
- package/lib/commonjs/components/Swipeable.js +17 -3
- package/lib/commonjs/components/Swipeable.js.map +1 -1
- package/lib/commonjs/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
- package/lib/commonjs/handlers/createHandler.js +21 -13
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestureHandlerCommon.js +5 -4
- package/lib/commonjs/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector.js +19 -9
- package/lib/commonjs/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js +22 -19
- package/lib/commonjs/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/commonjs/index.js +16 -4
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils.js +0 -6
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/handlers/FlingGestureHandler.js +0 -5
- package/lib/commonjs/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +3 -0
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/ManualGestureHandler.js +0 -5
- package/lib/commonjs/web/handlers/ManualGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +0 -6
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +2 -12
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PinchGestureHandler.js +0 -5
- package/lib/commonjs/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/RotationGestureHandler.js +0 -6
- package/lib/commonjs/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/TapGestureHandler.js +0 -6
- package/lib/commonjs/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/commonjs/web/tools/CircularBuffer.js +59 -0
- package/lib/commonjs/web/tools/CircularBuffer.js.map +1 -0
- package/lib/commonjs/web/tools/LeastSquareSolver.js +204 -0
- package/lib/commonjs/web/tools/LeastSquareSolver.js.map +1 -0
- package/lib/commonjs/web/tools/PointerEventManager.js +27 -0
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/PointerTracker.js +11 -7
- package/lib/commonjs/web/tools/PointerTracker.js.map +1 -1
- package/lib/commonjs/web/tools/VelocityTracker.js +111 -0
- package/lib/commonjs/web/tools/VelocityTracker.js.map +1 -0
- package/lib/commonjs/web_hammer/GestureHandler.js +1 -1
- package/lib/commonjs/web_hammer/GestureHandler.js.map +1 -1
- package/lib/module/EnableNewWebImplementation.js +22 -0
- package/lib/module/EnableNewWebImplementation.js.map +1 -0
- package/lib/module/GestureHandlerRootViewContext.js +3 -0
- package/lib/module/GestureHandlerRootViewContext.js.map +1 -0
- package/lib/module/RNGestureHandlerModule.macos.js +6 -6
- package/lib/module/RNGestureHandlerModule.macos.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.web.js +6 -6
- package/lib/module/RNGestureHandlerModule.web.js.map +1 -1
- package/lib/module/RNGestureHandlerModule.windows.js +6 -6
- package/lib/module/RNGestureHandlerModule.windows.js.map +1 -1
- package/lib/module/components/GestureComponents.web.js +5 -6
- package/lib/module/components/GestureComponents.web.js.map +1 -1
- package/lib/module/components/GestureHandlerButton.js +1 -4
- package/lib/module/components/GestureHandlerButton.js.map +1 -1
- package/lib/module/components/GestureHandlerRootView.android.js +14 -0
- package/lib/module/components/GestureHandlerRootView.android.js.map +1 -0
- package/lib/module/{GestureHandlerRootView.js → components/GestureHandlerRootView.js} +5 -2
- package/lib/module/components/GestureHandlerRootView.js.map +1 -0
- package/lib/module/components/GestureHandlerRootView.web.js +9 -0
- package/lib/module/components/GestureHandlerRootView.web.js.map +1 -0
- package/lib/module/components/Swipeable.js +17 -3
- package/lib/module/components/Swipeable.js.map +1 -1
- package/lib/module/{gestureHandlerRootHOC.js.map → components/gestureHandlerRootHOC.js.map} +1 -1
- package/lib/module/handlers/createHandler.js +20 -13
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestureHandlerCommon.js +5 -4
- package/lib/module/handlers/gestureHandlerCommon.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector.js +18 -10
- package/lib/module/handlers/gestures/GestureDetector.js.map +1 -1
- package/lib/module/handlers/gestures/reanimatedWrapper.js +19 -16
- package/lib/module/handlers/gestures/reanimatedWrapper.js.map +1 -1
- package/lib/module/index.js +4 -4
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils.js +0 -4
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/handlers/FlingGestureHandler.js +0 -5
- package/lib/module/web/handlers/FlingGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +3 -0
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/ManualGestureHandler.js +0 -5
- package/lib/module/web/handlers/ManualGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +0 -6
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +2 -9
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PinchGestureHandler.js +0 -5
- package/lib/module/web/handlers/PinchGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/RotationGestureHandler.js +0 -6
- package/lib/module/web/handlers/RotationGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/TapGestureHandler.js +0 -6
- package/lib/module/web/handlers/TapGestureHandler.js.map +1 -1
- package/lib/module/web/tools/CircularBuffer.js +50 -0
- package/lib/module/web/tools/CircularBuffer.js.map +1 -0
- package/lib/module/web/tools/LeastSquareSolver.js +195 -0
- package/lib/module/web/tools/LeastSquareSolver.js.map +1 -0
- package/lib/module/web/tools/PointerEventManager.js +27 -0
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/PointerTracker.js +8 -7
- package/lib/module/web/tools/PointerTracker.js.map +1 -1
- package/lib/module/web/tools/VelocityTracker.js +98 -0
- package/lib/module/web/tools/VelocityTracker.js.map +1 -0
- package/lib/module/web_hammer/GestureHandler.js +1 -1
- package/lib/module/web_hammer/GestureHandler.js.map +1 -1
- package/lib/typescript/EnableNewWebImplementation.d.ts +3 -0
- package/lib/typescript/GestureHandlerRootViewContext.d.ts +3 -0
- package/lib/typescript/components/GestureComponents.web.d.ts +1 -1
- package/lib/typescript/components/Swipeable.d.ts +12 -1
- package/lib/typescript/{gestureHandlerRootHOC.d.ts → components/gestureHandlerRootHOC.d.ts} +1 -1
- package/lib/typescript/index.d.ts +4 -4
- package/lib/typescript/utils.d.ts +0 -1
- package/lib/typescript/web/handlers/FlingGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/ManualGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/PinchGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/RotationGestureHandler.d.ts +0 -1
- package/lib/typescript/web/handlers/TapGestureHandler.d.ts +0 -1
- package/lib/typescript/web/tools/CircularBuffer.d.ts +11 -0
- package/lib/typescript/web/tools/LeastSquareSolver.d.ts +12 -0
- package/lib/typescript/web/tools/PointerEventManager.d.ts +2 -0
- package/lib/typescript/web/tools/PointerTracker.d.ts +1 -0
- package/lib/typescript/web/tools/VelocityTracker.d.ts +13 -0
- package/package.json +3 -3
- package/src/EnableNewWebImplementation.ts +35 -0
- package/src/GestureHandlerRootViewContext.ts +3 -0
- package/src/RNGestureHandlerModule.macos.ts +6 -6
- package/src/RNGestureHandlerModule.web.ts +6 -6
- package/src/RNGestureHandlerModule.windows.ts +6 -6
- package/src/components/GestureComponents.web.tsx +5 -6
- package/src/components/GestureHandlerButton.tsx +2 -7
- package/src/components/GestureHandlerRootView.android.tsx +24 -0
- package/src/{GestureHandlerRootView.tsx → components/GestureHandlerRootView.tsx} +7 -2
- package/src/{GestureHandlerRootView.web.tsx → components/GestureHandlerRootView.web.tsx} +6 -1
- package/src/components/Swipeable.tsx +30 -4
- package/src/{gestureHandlerRootHOC.tsx → components/gestureHandlerRootHOC.tsx} +1 -1
- package/src/handlers/createHandler.tsx +20 -9
- package/src/handlers/gestureHandlerCommon.ts +5 -6
- package/src/handlers/gestures/GestureDetector.tsx +19 -9
- package/src/handlers/gestures/reanimatedWrapper.ts +21 -20
- package/src/index.ts +7 -3
- package/src/utils.ts +0 -5
- package/src/web/handlers/FlingGestureHandler.ts +0 -5
- package/src/web/handlers/GestureHandler.ts +3 -0
- package/src/web/handlers/ManualGestureHandler.ts +0 -5
- package/src/web/handlers/NativeViewGestureHandler.ts +0 -6
- package/src/web/handlers/PanGestureHandler.ts +2 -9
- package/src/web/handlers/PinchGestureHandler.ts +0 -5
- package/src/web/handlers/RotationGestureHandler.ts +0 -7
- package/src/web/handlers/TapGestureHandler.ts +0 -6
- package/src/web/tools/CircularBuffer.ts +42 -0
- package/src/web/tools/LeastSquareSolver.ts +182 -0
- package/src/web/tools/PointerEventManager.ts +29 -0
- package/src/web/tools/PointerTracker.ts +7 -7
- package/src/web/tools/VelocityTracker.ts +98 -0
- package/src/web_hammer/GestureHandler.ts +1 -1
- package/lib/commonjs/EnableExperimentalWebImplementation.js +0 -31
- package/lib/commonjs/EnableExperimentalWebImplementation.js.map +0 -1
- package/lib/commonjs/GestureHandlerRootView.android.js.map +0 -1
- package/lib/commonjs/GestureHandlerRootView.js.map +0 -1
- package/lib/commonjs/GestureHandlerRootView.web.js.map +0 -1
- package/lib/module/EnableExperimentalWebImplementation.js +0 -20
- package/lib/module/EnableExperimentalWebImplementation.js.map +0 -1
- package/lib/module/GestureHandlerRootView.android.js +0 -14
- package/lib/module/GestureHandlerRootView.android.js.map +0 -1
- package/lib/module/GestureHandlerRootView.js.map +0 -1
- package/lib/module/GestureHandlerRootView.web.js +0 -6
- package/lib/module/GestureHandlerRootView.web.js.map +0 -1
- package/lib/typescript/EnableExperimentalWebImplementation.d.ts +0 -2
- package/src/EnableExperimentalWebImplementation.ts +0 -27
- package/src/GestureHandlerRootView.android.tsx +0 -24
- /package/lib/commonjs/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
- /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
- /package/lib/commonjs/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
- /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
- /package/lib/commonjs/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
- /package/lib/module/{gestureHandlerRootHOC.js → components/gestureHandlerRootHOC.js} +0 -0
- /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js +0 -0
- /package/lib/module/{fabric → specs}/RNGestureHandlerButtonNativeComponent.js.map +0 -0
- /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js +0 -0
- /package/lib/module/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.js.map +0 -0
- /package/lib/typescript/{GestureHandlerRootView.android.d.ts → components/GestureHandlerRootView.android.d.ts} +0 -0
- /package/lib/typescript/{GestureHandlerRootView.d.ts → components/GestureHandlerRootView.d.ts} +0 -0
- /package/lib/typescript/{GestureHandlerRootView.web.d.ts → components/GestureHandlerRootView.web.d.ts} +0 -0
- /package/lib/typescript/{fabric → specs}/RNGestureHandlerButtonNativeComponent.d.ts +0 -0
- /package/lib/typescript/{fabric → specs}/RNGestureHandlerRootViewNativeComponent.d.ts +0 -0
- /package/src/{fabric → specs}/RNGestureHandlerButtonNativeComponent.ts +0 -0
- /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 {
|
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
|
153
|
+
// use queueMicrotask to extract handlerTags, because all refs should be initialized
|
151
154
|
// when it's ran
|
152
|
-
|
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
|
173
|
+
// use queueMicrotask to extract handlerTags, because all refs should be initialized
|
171
174
|
// when it's ran
|
172
|
-
|
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
|
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
|
-
|
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:
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
)
|
48
|
-
|
49
|
-
}
|
50
|
-
|
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 {
|
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
|
202
|
-
velocityY: this.velocityY
|
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
|
-
|
78
|
-
const
|
79
|
-
const dt = event.time - element.timeStamp;
|
77
|
+
this.velocityTracker.add(event);
|
78
|
+
const [velocityX, velocityY] = this.velocityTracker.getVelocity();
|
80
79
|
|
81
|
-
element.velocityX =
|
82
|
-
element.velocityY =
|
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
|
|