react-native-screen-transitions 3.3.0-beta.2 → 3.3.0-beta.4
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.
- package/README.md +95 -31
- package/lib/commonjs/shared/animation/snap-to.js +17 -10
- package/lib/commonjs/shared/animation/snap-to.js.map +1 -1
- package/lib/commonjs/shared/components/create-transition-aware-component.js +20 -18
- package/lib/commonjs/shared/components/create-transition-aware-component.js.map +1 -1
- package/lib/commonjs/shared/components/screen-container.js +68 -9
- package/lib/commonjs/shared/components/screen-container.js.map +1 -1
- package/lib/commonjs/shared/constants.js +8 -1
- package/lib/commonjs/shared/constants.js.map +1 -1
- package/lib/commonjs/shared/hooks/gestures/use-build-gestures.js +49 -39
- package/lib/commonjs/shared/hooks/gestures/use-build-gestures.js.map +1 -1
- package/lib/commonjs/shared/hooks/gestures/use-screen-gesture-handlers.js +110 -61
- package/lib/commonjs/shared/hooks/gestures/use-screen-gesture-handlers.js.map +1 -1
- package/lib/commonjs/shared/hooks/gestures/use-scroll-registry.js +67 -70
- package/lib/commonjs/shared/hooks/gestures/use-scroll-registry.js.map +1 -1
- package/lib/commonjs/shared/providers/gestures.provider.js +113 -25
- package/lib/commonjs/shared/providers/gestures.provider.js.map +1 -1
- package/lib/commonjs/shared/types/ownership.types.js +71 -0
- package/lib/commonjs/shared/types/ownership.types.js.map +1 -0
- package/lib/commonjs/shared/utils/gesture/check-gesture-activation.js +72 -128
- package/lib/commonjs/shared/utils/gesture/check-gesture-activation.js.map +1 -1
- package/lib/commonjs/shared/utils/gesture/compute-claimed-directions.js +81 -0
- package/lib/commonjs/shared/utils/gesture/compute-claimed-directions.js.map +1 -0
- package/lib/commonjs/shared/utils/gesture/determine-snap-target.js +1 -1
- package/lib/commonjs/shared/utils/gesture/determine-snap-target.js.map +1 -1
- package/lib/commonjs/shared/utils/gesture/find-collapse-target.js +48 -0
- package/lib/commonjs/shared/utils/gesture/find-collapse-target.js.map +1 -0
- package/lib/commonjs/shared/utils/gesture/resolve-ownership.js +87 -0
- package/lib/commonjs/shared/utils/gesture/resolve-ownership.js.map +1 -0
- package/lib/commonjs/shared/utils/gesture/velocity.js +16 -5
- package/lib/commonjs/shared/utils/gesture/velocity.js.map +1 -1
- package/lib/module/shared/animation/snap-to.js +16 -10
- package/lib/module/shared/animation/snap-to.js.map +1 -1
- package/lib/module/shared/components/create-transition-aware-component.js +20 -18
- package/lib/module/shared/components/create-transition-aware-component.js.map +1 -1
- package/lib/module/shared/components/screen-container.js +68 -10
- package/lib/module/shared/components/screen-container.js.map +1 -1
- package/lib/module/shared/constants.js +7 -0
- package/lib/module/shared/constants.js.map +1 -1
- package/lib/module/shared/hooks/gestures/use-build-gestures.js +49 -39
- package/lib/module/shared/hooks/gestures/use-build-gestures.js.map +1 -1
- package/lib/module/shared/hooks/gestures/use-screen-gesture-handlers.js +112 -63
- package/lib/module/shared/hooks/gestures/use-screen-gesture-handlers.js.map +1 -1
- package/lib/module/shared/hooks/gestures/use-scroll-registry.js +68 -70
- package/lib/module/shared/hooks/gestures/use-scroll-registry.js.map +1 -1
- package/lib/module/shared/providers/gestures.provider.js +113 -25
- package/lib/module/shared/providers/gestures.provider.js.map +1 -1
- package/lib/module/shared/types/ownership.types.js +67 -0
- package/lib/module/shared/types/ownership.types.js.map +1 -0
- package/lib/module/shared/utils/gesture/check-gesture-activation.js +70 -126
- package/lib/module/shared/utils/gesture/check-gesture-activation.js.map +1 -1
- package/lib/module/shared/utils/gesture/compute-claimed-directions.js +77 -0
- package/lib/module/shared/utils/gesture/compute-claimed-directions.js.map +1 -0
- package/lib/module/shared/utils/gesture/determine-snap-target.js +1 -1
- package/lib/module/shared/utils/gesture/determine-snap-target.js.map +1 -1
- package/lib/module/shared/utils/gesture/find-collapse-target.js +44 -0
- package/lib/module/shared/utils/gesture/find-collapse-target.js.map +1 -0
- package/lib/module/shared/utils/gesture/resolve-ownership.js +83 -0
- package/lib/module/shared/utils/gesture/resolve-ownership.js.map +1 -0
- package/lib/module/shared/utils/gesture/velocity.js +16 -5
- package/lib/module/shared/utils/gesture/velocity.js.map +1 -1
- package/lib/typescript/shared/animation/snap-to.d.ts.map +1 -1
- package/lib/typescript/shared/components/create-transition-aware-component.d.ts.map +1 -1
- package/lib/typescript/shared/components/screen-container.d.ts.map +1 -1
- package/lib/typescript/shared/constants.d.ts +6 -0
- package/lib/typescript/shared/constants.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/gestures/use-build-gestures.d.ts +15 -3
- package/lib/typescript/shared/hooks/gestures/use-build-gestures.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/gestures/use-screen-gesture-handlers.d.ts +52 -2
- package/lib/typescript/shared/hooks/gestures/use-screen-gesture-handlers.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/gestures/use-scroll-registry.d.ts +11 -6
- package/lib/typescript/shared/hooks/gestures/use-scroll-registry.d.ts.map +1 -1
- package/lib/typescript/shared/hooks/use-backdrop-pointer-events.d.ts +1 -1
- package/lib/typescript/shared/hooks/use-backdrop-pointer-events.d.ts.map +1 -1
- package/lib/typescript/shared/providers/gestures.provider.d.ts +28 -3
- package/lib/typescript/shared/providers/gestures.provider.d.ts.map +1 -1
- package/lib/typescript/shared/types/ownership.types.d.ts +52 -0
- package/lib/typescript/shared/types/ownership.types.d.ts.map +1 -0
- package/lib/typescript/shared/types/screen.types.d.ts +22 -1
- package/lib/typescript/shared/types/screen.types.d.ts.map +1 -1
- package/lib/typescript/shared/utils/gesture/check-gesture-activation.d.ts +23 -19
- package/lib/typescript/shared/utils/gesture/check-gesture-activation.d.ts.map +1 -1
- package/lib/typescript/shared/utils/gesture/compute-claimed-directions.d.ts +23 -0
- package/lib/typescript/shared/utils/gesture/compute-claimed-directions.d.ts.map +1 -0
- package/lib/typescript/shared/utils/gesture/determine-snap-target.d.ts +5 -1
- package/lib/typescript/shared/utils/gesture/determine-snap-target.d.ts.map +1 -1
- package/lib/typescript/shared/utils/gesture/find-collapse-target.d.ts +17 -0
- package/lib/typescript/shared/utils/gesture/find-collapse-target.d.ts.map +1 -0
- package/lib/typescript/shared/utils/gesture/resolve-ownership.d.ts +36 -0
- package/lib/typescript/shared/utils/gesture/resolve-ownership.d.ts.map +1 -0
- package/lib/typescript/shared/utils/gesture/velocity.d.ts.map +1 -1
- package/package.json +121 -120
- package/src/shared/animation/snap-to.ts +17 -11
- package/src/shared/components/create-transition-aware-component.tsx +28 -25
- package/src/shared/components/screen-container.tsx +79 -12
- package/src/shared/constants.ts +7 -0
- package/src/shared/hooks/gestures/use-build-gestures.tsx +80 -44
- package/src/shared/hooks/gestures/use-screen-gesture-handlers.ts +147 -71
- package/src/shared/hooks/gestures/use-scroll-registry.tsx +94 -86
- package/src/shared/hooks/use-backdrop-pointer-events.ts +1 -1
- package/src/shared/providers/gestures.provider.tsx +168 -25
- package/src/shared/types/ownership.types.ts +77 -0
- package/src/shared/types/screen.types.ts +24 -1
- package/src/shared/utils/gesture/check-gesture-activation.ts +82 -116
- package/src/shared/utils/gesture/compute-claimed-directions.ts +93 -0
- package/src/shared/utils/gesture/determine-snap-target.ts +6 -2
- package/src/shared/utils/gesture/find-collapse-target.ts +42 -0
- package/src/shared/utils/gesture/resolve-ownership.ts +110 -0
- package/src/shared/utils/gesture/velocity.ts +16 -6
- package/src/shared/__tests__/bounds.store.test.ts +0 -394
- package/src/shared/__tests__/derivations.test.ts +0 -156
- package/src/shared/__tests__/determine-dismissal.test.ts +0 -111
- package/src/shared/__tests__/determine-snap-target.test.ts +0 -268
- package/src/shared/__tests__/geometry.test.ts +0 -130
- package/src/shared/__tests__/gesture-activation.test.ts +0 -471
- package/src/shared/__tests__/gesture.velocity.test.ts +0 -131
- package/src/shared/__tests__/history.store.test.ts +0 -550
- package/src/shared/__tests__/sync-routes-with-removed.test.ts +0 -137
- package/src/shared/__tests__/validate-snap-points.test.ts +0 -125
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
/** biome-ignore-all lint/style/noNonNullAssertion: <Options always exist> */
|
|
3
4
|
import { runOnUI } from "react-native-reanimated";
|
|
4
5
|
import { DefaultSnapSpec } from "../configs/specs";
|
|
5
6
|
import { AnimationStore } from "../stores/animation.store";
|
|
6
7
|
import { HistoryStore } from "../stores/history.store";
|
|
7
8
|
import { animateToProgress } from "../utils/animation/animate-to-progress";
|
|
9
|
+
import { logger } from "../utils/logger";
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Programmatically snap the currently focused screen to a specific snap point.
|
|
@@ -23,22 +25,26 @@ import { animateToProgress } from "../utils/animation/animate-to-progress";
|
|
|
23
25
|
* ```
|
|
24
26
|
*/
|
|
25
27
|
export function snapTo(index) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
// Find the most recent screen that has snapPoints defined.
|
|
29
|
+
// This handles cases where parent screens (e.g., expo-router) register after
|
|
30
|
+
// ComponentStack screens, but the ComponentStack is what we want to snap.
|
|
31
|
+
const allHistory = HistoryStore.toArray();
|
|
32
|
+
const screenWithSnapPoints = allHistory.filter(entry => {
|
|
33
|
+
const sp = entry.descriptor.options?.snapPoints;
|
|
34
|
+
return sp && sp.length > 0;
|
|
35
|
+
}).pop(); // Last item is most recent (toArray returns oldest-first)
|
|
36
|
+
|
|
37
|
+
if (!screenWithSnapPoints) {
|
|
38
|
+
logger.warn("snapTo: No screens with snapPoints in history");
|
|
29
39
|
return;
|
|
30
40
|
}
|
|
31
41
|
const {
|
|
32
42
|
descriptor
|
|
33
|
-
} =
|
|
34
|
-
const snapPoints = descriptor.options
|
|
35
|
-
if (!snapPoints || snapPoints.length === 0) {
|
|
36
|
-
console.warn("snapTo: No snapPoints defined on current screen");
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
43
|
+
} = screenWithSnapPoints;
|
|
44
|
+
const snapPoints = descriptor.options.snapPoints;
|
|
39
45
|
const sorted = [...snapPoints].sort((a, b) => a - b);
|
|
40
46
|
if (index < 0 || index >= sorted.length) {
|
|
41
|
-
|
|
47
|
+
logger.warn(`snapTo: index ${index} out of bounds (0-${sorted.length - 1})`);
|
|
42
48
|
return;
|
|
43
49
|
}
|
|
44
50
|
const targetProgress = sorted[index];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["runOnUI","DefaultSnapSpec","AnimationStore","HistoryStore","animateToProgress","snapTo","index","
|
|
1
|
+
{"version":3,"names":["runOnUI","DefaultSnapSpec","AnimationStore","HistoryStore","animateToProgress","logger","snapTo","index","allHistory","toArray","screenWithSnapPoints","filter","entry","sp","descriptor","options","snapPoints","length","pop","warn","sorted","sort","a","b","targetProgress","animations","getAll","route","key","target","spec","open","transitionSpec","expand","close","collapse"],"sourceRoot":"../../../../src","sources":["shared/animation/snap-to.ts"],"mappings":";;AAAA;AACA,SAASA,OAAO,QAAQ,yBAAyB;AACjD,SAASC,eAAe,QAAQ,kBAAkB;AAClD,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,iBAAiB,QAAQ,wCAAwC;AAC1E,SAASC,MAAM,QAAQ,iBAAiB;;AAExC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,MAAMA,CAACC,KAAa,EAAQ;EAC3C;EACA;EACA;EACA,MAAMC,UAAU,GAAGL,YAAY,CAACM,OAAO,CAAC,CAAC;EACzC,MAAMC,oBAAoB,GAAGF,UAAU,CACrCG,MAAM,CAAEC,KAAK,IAAK;IAClB,MAAMC,EAAE,GAAGD,KAAK,CAACE,UAAU,CAACC,OAAO,EAAEC,UAAU;IAC/C,OAAOH,EAAE,IAAIA,EAAE,CAACI,MAAM,GAAG,CAAC;EAC3B,CAAC,CAAC,CACDC,GAAG,CAAC,CAAC,CAAC,CAAC;;EAET,IAAI,CAACR,oBAAoB,EAAE;IAC1BL,MAAM,CAACc,IAAI,CAAC,+CAA+C,CAAC;IAC5D;EACD;EAEA,MAAM;IAAEL;EAAW,CAAC,GAAGJ,oBAAoB;EAC3C,MAAMM,UAAU,GAAGF,UAAU,CAACC,OAAO,CAAEC,UAAW;EAElD,MAAMI,MAAM,GAAG,CAAC,GAAGJ,UAAU,CAAC,CAACK,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;EAEpD,IAAIhB,KAAK,GAAG,CAAC,IAAIA,KAAK,IAAIa,MAAM,CAACH,MAAM,EAAE;IACxCZ,MAAM,CAACc,IAAI,CACV,iBAAiBZ,KAAK,qBAAqBa,MAAM,CAACH,MAAM,GAAG,CAAC,GAC7D,CAAC;IACD;EACD;EAEA,MAAMO,cAAc,GAAGJ,MAAM,CAACb,KAAK,CAAC;EACpC,MAAMkB,UAAU,GAAGvB,cAAc,CAACwB,MAAM,CAACZ,UAAU,CAACa,KAAK,CAACC,GAAG,CAAC;EAE9D5B,OAAO,CAAC,MAAM;IACb,SAAS;;IACTI,iBAAiB,CAAC;MACjByB,MAAM,EAAEL,cAAc;MACtBC,UAAU;MACVK,IAAI,EAAE;QACLC,IAAI,EAAEjB,UAAU,CAACC,OAAO,CAACiB,cAAc,EAAEC,MAAM,IAAIhC,eAAe;QAClEiC,KAAK,EAAEpB,UAAU,CAACC,OAAO,CAACiB,cAAc,EAAEG,QAAQ,IAAIlC;MACvD;IACD,CAAC,CAAC;EACH,CAAC,CAAC,CAAC,CAAC;AACL","ignoreList":[]}
|
|
@@ -7,7 +7,6 @@ import { GestureDetector } from "react-native-gesture-handler";
|
|
|
7
7
|
import Animated, { runOnUI, useAnimatedRef } from "react-native-reanimated";
|
|
8
8
|
import { useAssociatedStyles } from "../hooks/animation/use-associated-style";
|
|
9
9
|
import { useScrollRegistry } from "../hooks/gestures/use-scroll-registry";
|
|
10
|
-
import { useGestureContext } from "../providers/gestures.provider";
|
|
11
10
|
import { RegisterBoundsProvider } from "../providers/register-bounds.provider";
|
|
12
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
12
|
export function createTransitionAwareComponent(Wrapped, options = {}) {
|
|
@@ -16,34 +15,37 @@ export function createTransitionAwareComponent(Wrapped, options = {}) {
|
|
|
16
15
|
} = options;
|
|
17
16
|
const AnimatedComponent = Animated.createAnimatedComponent(Wrapped);
|
|
18
17
|
const ScrollableInner = /*#__PURE__*/forwardRef((props, ref) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
// Determine scroll direction from the horizontal prop (standard ScrollView API)
|
|
19
|
+
const scrollDirection = props.horizontal ? "horizontal" : "vertical";
|
|
20
|
+
|
|
21
|
+
// Get scroll handlers and the gesture owner's nativeGesture for this axis
|
|
22
22
|
const {
|
|
23
23
|
scrollHandler,
|
|
24
24
|
onContentSizeChange,
|
|
25
25
|
onLayout,
|
|
26
|
-
|
|
27
|
-
onTouchEnd
|
|
26
|
+
nativeGesture
|
|
28
27
|
} = useScrollRegistry({
|
|
29
28
|
onScroll: props.onScroll,
|
|
30
29
|
onContentSizeChange: props.onContentSizeChange,
|
|
31
30
|
onLayout: props.onLayout,
|
|
32
|
-
|
|
33
|
-
onTouchEnd: props.onTouchEnd
|
|
31
|
+
direction: scrollDirection
|
|
34
32
|
});
|
|
33
|
+
const scrollableComponent = /*#__PURE__*/_jsx(AnimatedComponent, {
|
|
34
|
+
...props,
|
|
35
|
+
ref: ref,
|
|
36
|
+
onScroll: scrollHandler,
|
|
37
|
+
onContentSizeChange: onContentSizeChange,
|
|
38
|
+
onLayout: onLayout,
|
|
39
|
+
scrollEventThrottle: props.scrollEventThrottle || 16
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// If no gesture owner found for this axis, render without GestureDetector
|
|
43
|
+
if (!nativeGesture) {
|
|
44
|
+
return scrollableComponent;
|
|
45
|
+
}
|
|
35
46
|
return /*#__PURE__*/_jsx(GestureDetector, {
|
|
36
47
|
gesture: nativeGesture,
|
|
37
|
-
children:
|
|
38
|
-
...props,
|
|
39
|
-
ref: ref,
|
|
40
|
-
onScroll: scrollHandler,
|
|
41
|
-
onContentSizeChange: onContentSizeChange,
|
|
42
|
-
onLayout: onLayout,
|
|
43
|
-
onTouchStart: onTouchStart,
|
|
44
|
-
onTouchEnd: onTouchEnd,
|
|
45
|
-
scrollEventThrottle: props.scrollEventThrottle || 16
|
|
46
|
-
})
|
|
48
|
+
children: scrollableComponent
|
|
47
49
|
});
|
|
48
50
|
});
|
|
49
51
|
const Inner = /*#__PURE__*/forwardRef((props, _) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["forwardRef","memo","GestureDetector","Animated","runOnUI","useAnimatedRef","useAssociatedStyles","useScrollRegistry","
|
|
1
|
+
{"version":3,"names":["forwardRef","memo","GestureDetector","Animated","runOnUI","useAnimatedRef","useAssociatedStyles","useScrollRegistry","RegisterBoundsProvider","jsx","_jsx","createTransitionAwareComponent","Wrapped","options","isScrollable","AnimatedComponent","createAnimatedComponent","ScrollableInner","props","ref","scrollDirection","horizontal","scrollHandler","onContentSizeChange","onLayout","nativeGesture","onScroll","direction","scrollableComponent","scrollEventThrottle","gesture","children","Inner","_","style","sharedBoundTag","styleId","onPress","rest","animatedRef","associatedStyles","id","captureActiveOnPress","handleInitialLayout","collapsable"],"sourceRoot":"../../../../src","sources":["shared/components/create-transition-aware-component.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
/** biome-ignore-all lint/style/noNonNullAssertion: <Screen gesture is under the gesture context, so this will always exist.> */
|
|
3
4
|
import { StackActions } from "@react-navigation/native";
|
|
4
5
|
import { memo, useCallback } from "react";
|
|
5
6
|
import { Pressable, StyleSheet, View } from "react-native";
|
|
6
|
-
import
|
|
7
|
+
import { GestureDetector } from "react-native-gesture-handler";
|
|
8
|
+
import Animated, { runOnUI, useAnimatedStyle } from "react-native-reanimated";
|
|
9
|
+
import { DefaultSnapSpec } from "../configs/specs";
|
|
7
10
|
import { NO_STYLES } from "../constants";
|
|
8
11
|
import { useBackdropPointerEvents } from "../hooks/use-backdrop-pointer-events";
|
|
12
|
+
import { useGestureContext } from "../providers/gestures.provider";
|
|
9
13
|
import { useKeys } from "../providers/screen/keys.provider";
|
|
10
14
|
import { useScreenStyles } from "../providers/screen/styles.provider";
|
|
15
|
+
import { AnimationStore } from "../stores/animation.store";
|
|
16
|
+
import { GestureStore } from "../stores/gesture.store";
|
|
17
|
+
import { animateToProgress } from "../utils/animation/animate-to-progress";
|
|
18
|
+
import { findCollapseTarget } from "../utils/gesture/find-collapse-target";
|
|
11
19
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
20
|
export const ScreenContainer = /*#__PURE__*/memo(({
|
|
13
21
|
children
|
|
@@ -22,10 +30,57 @@ export const ScreenContainer = /*#__PURE__*/memo(({
|
|
|
22
30
|
pointerEvents,
|
|
23
31
|
backdropBehavior
|
|
24
32
|
} = useBackdropPointerEvents();
|
|
25
|
-
const
|
|
33
|
+
const gestureContext = useGestureContext();
|
|
34
|
+
const isBackdropActive = backdropBehavior === "dismiss" || backdropBehavior === "collapse";
|
|
35
|
+
const handleDismiss = useCallback(() => {
|
|
36
|
+
const state = current.navigation.getState();
|
|
37
|
+
current.navigation.dispatch({
|
|
38
|
+
...StackActions.pop(),
|
|
39
|
+
source: current.route.key,
|
|
40
|
+
target: state.key
|
|
41
|
+
});
|
|
42
|
+
}, [current]);
|
|
26
43
|
const handleBackdropPress = useCallback(() => {
|
|
27
|
-
|
|
28
|
-
|
|
44
|
+
if (backdropBehavior === "dismiss") {
|
|
45
|
+
handleDismiss();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (backdropBehavior === "collapse") {
|
|
49
|
+
const snapPoints = current.options.snapPoints;
|
|
50
|
+
const canDismiss = current.options.gestureEnabled !== false;
|
|
51
|
+
|
|
52
|
+
// No snap points → fallback to dismiss
|
|
53
|
+
if (!snapPoints || snapPoints.length === 0) {
|
|
54
|
+
handleDismiss();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const animations = AnimationStore.getAll(current.route.key);
|
|
58
|
+
const gestures = GestureStore.getRouteGestures(current.route.key);
|
|
59
|
+
const transitionSpec = current.options.transitionSpec;
|
|
60
|
+
runOnUI(() => {
|
|
61
|
+
"worklet";
|
|
62
|
+
|
|
63
|
+
const {
|
|
64
|
+
target,
|
|
65
|
+
shouldDismiss
|
|
66
|
+
} = findCollapseTarget(animations.progress.value, snapPoints, canDismiss);
|
|
67
|
+
|
|
68
|
+
// If already dismissing, skip
|
|
69
|
+
if (gestures.isDismissing.value) return;
|
|
70
|
+
gestures.isDismissing.value = shouldDismiss ? 1 : 0;
|
|
71
|
+
const spec = shouldDismiss ? transitionSpec : {
|
|
72
|
+
open: transitionSpec?.expand ?? DefaultSnapSpec,
|
|
73
|
+
close: transitionSpec?.collapse ?? DefaultSnapSpec
|
|
74
|
+
};
|
|
75
|
+
animateToProgress({
|
|
76
|
+
target,
|
|
77
|
+
spec,
|
|
78
|
+
animations,
|
|
79
|
+
onAnimationFinish: shouldDismiss ? handleDismiss : undefined
|
|
80
|
+
});
|
|
81
|
+
})();
|
|
82
|
+
}
|
|
83
|
+
}, [backdropBehavior, current, handleDismiss]);
|
|
29
84
|
const animatedContentStyle = useAnimatedStyle(() => {
|
|
30
85
|
"worklet";
|
|
31
86
|
|
|
@@ -41,15 +96,18 @@ export const ScreenContainer = /*#__PURE__*/memo(({
|
|
|
41
96
|
pointerEvents: pointerEvents,
|
|
42
97
|
children: [/*#__PURE__*/_jsx(Pressable, {
|
|
43
98
|
style: StyleSheet.absoluteFillObject,
|
|
44
|
-
pointerEvents:
|
|
45
|
-
onPress:
|
|
99
|
+
pointerEvents: isBackdropActive ? "auto" : "none",
|
|
100
|
+
onPress: isBackdropActive ? handleBackdropPress : undefined,
|
|
46
101
|
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
47
102
|
style: [StyleSheet.absoluteFillObject, animatedBackdropStyle]
|
|
48
103
|
})
|
|
49
|
-
}), /*#__PURE__*/_jsx(
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
104
|
+
}), /*#__PURE__*/_jsx(GestureDetector, {
|
|
105
|
+
gesture: gestureContext.panGesture,
|
|
106
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
107
|
+
style: [styles.content, animatedContentStyle],
|
|
108
|
+
pointerEvents: isBackdropActive ? "box-none" : pointerEvents,
|
|
109
|
+
children: children
|
|
110
|
+
})
|
|
53
111
|
})]
|
|
54
112
|
});
|
|
55
113
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StackActions","memo","useCallback","Pressable","StyleSheet","View","Animated","useAnimatedStyle","NO_STYLES","useBackdropPointerEvents","useKeys","useScreenStyles","jsx","_jsx","jsxs","_jsxs","ScreenContainer","children","stylesMap","current","pointerEvents","backdropBehavior","
|
|
1
|
+
{"version":3,"names":["StackActions","memo","useCallback","Pressable","StyleSheet","View","GestureDetector","Animated","runOnUI","useAnimatedStyle","DefaultSnapSpec","NO_STYLES","useBackdropPointerEvents","useGestureContext","useKeys","useScreenStyles","AnimationStore","GestureStore","animateToProgress","findCollapseTarget","jsx","_jsx","jsxs","_jsxs","ScreenContainer","children","stylesMap","current","pointerEvents","backdropBehavior","gestureContext","isBackdropActive","handleDismiss","state","navigation","getState","dispatch","pop","source","route","key","target","handleBackdropPress","snapPoints","options","canDismiss","gestureEnabled","length","animations","getAll","gestures","getRouteGestures","transitionSpec","shouldDismiss","progress","value","isDismissing","spec","open","expand","close","collapse","onAnimationFinish","undefined","animatedContentStyle","contentStyle","animatedBackdropStyle","backdropStyle","overlayStyle","style","styles","container","absoluteFillObject","onPress","gesture","panGesture","content","create","flex"],"sourceRoot":"../../../../src","sources":["shared/components/screen-container.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -84,6 +84,7 @@ export const FULLSCREEN_DIMENSIONS = dimensions => {
|
|
|
84
84
|
* Default gesture config
|
|
85
85
|
*/
|
|
86
86
|
export const GESTURE_VELOCITY_IMPACT = 0.3;
|
|
87
|
+
export const SNAP_VELOCITY_IMPACT = 0.1;
|
|
87
88
|
export const DEFAULT_GESTURE_DIRECTION = "horizontal";
|
|
88
89
|
export const DEFAULT_GESTURE_DRIVES_PROGRESS = true;
|
|
89
90
|
export const DEFAULT_GESTURE_ACTIVATION_AREA = "screen";
|
|
@@ -95,4 +96,10 @@ export const FALSE = 0;
|
|
|
95
96
|
* Small value for floating-point comparisons to handle animation/interpolation imprecision
|
|
96
97
|
*/
|
|
97
98
|
export const EPSILON = 1e-5;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Threshold for snapping animations to target when "close enough" (1% of range).
|
|
102
|
+
* Prevents micro-jitter/oscillation near animation endpoints.
|
|
103
|
+
*/
|
|
104
|
+
export const ANIMATION_SNAP_THRESHOLD = 0.01;
|
|
98
105
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","MASK_STYLE_ID","CONTAINER_STYLE_ID","NO_STYLES","Object","freeze","DEFAULT_GESTURE_VALUES","x","y","normalizedX","normalizedY","isDismissing","isDragging","direction","createScreenTransitionState","route","meta","progress","closing","animating","entering","gesture","DEFAULT_SCREEN_TRANSITION_STATE","EMPTY_BOUND_HELPER_RESULT","EMPTY_BOUND_HELPER_RESULT_RAW","scaleX","scaleY","scale","translateX","translateY","width","height","ENTER_RANGE","EXIT_RANGE","FULLSCREEN_DIMENSIONS","dimensions","pageX","pageY","GESTURE_VELOCITY_IMPACT","DEFAULT_GESTURE_DIRECTION","DEFAULT_GESTURE_DRIVES_PROGRESS","DEFAULT_GESTURE_ACTIVATION_AREA","IS_WEB","OS","TRUE","FALSE","EPSILON"],"sourceRoot":"../../../src","sources":["shared/constants.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AAOvC;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAG,cAAc;AAC3C,OAAO,MAAMC,kBAAkB,GAAG,iBAAiB;;AAEnD;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;;AAE1C;AACA;AACA;AACA,MAAMC,sBAAsB,GAAG;EAC9BC,CAAC,EAAE,CAAC;EACJC,CAAC,EAAE,CAAC;EACJC,WAAW,EAAE,CAAC;EACdC,WAAW,EAAE,CAAC;EACdC,YAAY,EAAE,CAAC;EACfC,UAAU,EAAE,CAAC;EACbC,SAAS,EAAE;AACZ,CAAU;;AAEV;AACA;AACA;AACA,OAAO,MAAMC,2BAA2B,GAAGA,CAC1CC,KAAqB,EACrBC,IAA8B,MACF;EAC5BC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE;IAAE,GAAGf;EAAuB,CAAC;EACtCS,KAAK;EACLC;AACD,CAAC,CAAC;;AAEF;AACA;AACA;AACA,OAAO,MAAMM,+BAAsD,GAClElB,MAAM,CAACC,MAAM,CAAC;EACbY,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAEf,sBAAsB;EAC/BS,KAAK,EAAE,CAAC;AACT,CAAC,CAAC;;AAEH;AACA;AACA;AACA,OAAO,MAAMQ,yBAAyB,GAAGnB,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1D,OAAO,MAAMmB,6BAA6B,GAAGpB,MAAM,CAACC,MAAM,CAAC;EAC1DoB,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,KAAK,EAAE,CAAC;EACRC,UAAU,EAAE,CAAC;EACbC,UAAU,EAAE,CAAC;EACbC,KAAK,EAAE,CAAC;EACRC,MAAM,EAAE;AACT,CAAC,CAAC;AACF,OAAO,MAAMC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAU;AAC1C,OAAO,MAAMC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,CAAU;AAEzC,OAAO,MAAMC,qBAAqB,GACjCC,UAAkB,IACM;EACxB,SAAS;;EACT,OAAO;IACN5B,CAAC,EAAE,CAAC;IACJC,CAAC,EAAE,CAAC;IACJ4B,KAAK,EAAE,CAAC;IACRC,KAAK,EAAE,CAAC;IACRP,KAAK,EAAEK,UAAU,CAACL,KAAK;IACvBC,MAAM,EAAEI,UAAU,CAACJ;EACpB,CAAC;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMO,uBAAuB,GAAG,GAAG;AAC1C,OAAO,MAAMC,yBAAyB,GAAG,YAAY;AACrD,OAAO,MAAMC,+BAA+B,GAAG,IAAI;AACnD,OAAO,MAAMC,+BAA+C,GAAG,QAAQ;AAEvE,OAAO,MAAMC,MAAM,
|
|
1
|
+
{"version":3,"names":["Platform","MASK_STYLE_ID","CONTAINER_STYLE_ID","NO_STYLES","Object","freeze","DEFAULT_GESTURE_VALUES","x","y","normalizedX","normalizedY","isDismissing","isDragging","direction","createScreenTransitionState","route","meta","progress","closing","animating","entering","gesture","DEFAULT_SCREEN_TRANSITION_STATE","EMPTY_BOUND_HELPER_RESULT","EMPTY_BOUND_HELPER_RESULT_RAW","scaleX","scaleY","scale","translateX","translateY","width","height","ENTER_RANGE","EXIT_RANGE","FULLSCREEN_DIMENSIONS","dimensions","pageX","pageY","GESTURE_VELOCITY_IMPACT","SNAP_VELOCITY_IMPACT","DEFAULT_GESTURE_DIRECTION","DEFAULT_GESTURE_DRIVES_PROGRESS","DEFAULT_GESTURE_ACTIVATION_AREA","IS_WEB","OS","TRUE","FALSE","EPSILON","ANIMATION_SNAP_THRESHOLD"],"sourceRoot":"../../../src","sources":["shared/constants.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AAOvC;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAG,cAAc;AAC3C,OAAO,MAAMC,kBAAkB,GAAG,iBAAiB;;AAEnD;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;;AAE1C;AACA;AACA;AACA,MAAMC,sBAAsB,GAAG;EAC9BC,CAAC,EAAE,CAAC;EACJC,CAAC,EAAE,CAAC;EACJC,WAAW,EAAE,CAAC;EACdC,WAAW,EAAE,CAAC;EACdC,YAAY,EAAE,CAAC;EACfC,UAAU,EAAE,CAAC;EACbC,SAAS,EAAE;AACZ,CAAU;;AAEV;AACA;AACA;AACA,OAAO,MAAMC,2BAA2B,GAAGA,CAC1CC,KAAqB,EACrBC,IAA8B,MACF;EAC5BC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE;IAAE,GAAGf;EAAuB,CAAC;EACtCS,KAAK;EACLC;AACD,CAAC,CAAC;;AAEF;AACA;AACA;AACA,OAAO,MAAMM,+BAAsD,GAClElB,MAAM,CAACC,MAAM,CAAC;EACbY,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAE,CAAC;EACVC,SAAS,EAAE,CAAC;EACZC,QAAQ,EAAE,CAAC;EACXC,OAAO,EAAEf,sBAAsB;EAC/BS,KAAK,EAAE,CAAC;AACT,CAAC,CAAC;;AAEH;AACA;AACA;AACA,OAAO,MAAMQ,yBAAyB,GAAGnB,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1D,OAAO,MAAMmB,6BAA6B,GAAGpB,MAAM,CAACC,MAAM,CAAC;EAC1DoB,MAAM,EAAE,CAAC;EACTC,MAAM,EAAE,CAAC;EACTC,KAAK,EAAE,CAAC;EACRC,UAAU,EAAE,CAAC;EACbC,UAAU,EAAE,CAAC;EACbC,KAAK,EAAE,CAAC;EACRC,MAAM,EAAE;AACT,CAAC,CAAC;AACF,OAAO,MAAMC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAU;AAC1C,OAAO,MAAMC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,CAAU;AAEzC,OAAO,MAAMC,qBAAqB,GACjCC,UAAkB,IACM;EACxB,SAAS;;EACT,OAAO;IACN5B,CAAC,EAAE,CAAC;IACJC,CAAC,EAAE,CAAC;IACJ4B,KAAK,EAAE,CAAC;IACRC,KAAK,EAAE,CAAC;IACRP,KAAK,EAAEK,UAAU,CAACL,KAAK;IACvBC,MAAM,EAAEI,UAAU,CAACJ;EACpB,CAAC;AACF,CAAC;;AAED;AACA;AACA;AACA,OAAO,MAAMO,uBAAuB,GAAG,GAAG;AAC1C,OAAO,MAAMC,oBAAoB,GAAG,GAAG;AACvC,OAAO,MAAMC,yBAAyB,GAAG,YAAY;AACrD,OAAO,MAAMC,+BAA+B,GAAG,IAAI;AACnD,OAAO,MAAMC,+BAA+C,GAAG,QAAQ;AAEvE,OAAO,MAAMC,MAAM,GAAG3C,QAAQ,CAAC4C,EAAE,KAAK,KAAK;AAE3C,OAAO,MAAMC,IAAI,GAAG,CAAC;AACrB,OAAO,MAAMC,KAAK,GAAG,CAAC;;AAEtB;AACA;AACA;AACA,OAAO,MAAMC,OAAO,GAAG,IAAI;;AAE3B;AACA;AACA;AACA;AACA,OAAO,MAAMC,wBAAwB,GAAG,IAAI","ignoreList":[]}
|
|
@@ -5,10 +5,43 @@ import { useCallback, useMemo, useRef } from "react";
|
|
|
5
5
|
import { Gesture } from "react-native-gesture-handler";
|
|
6
6
|
import { useKeys } from "../../providers/screen/keys.provider";
|
|
7
7
|
import { GestureStore } from "../../stores/gesture.store";
|
|
8
|
+
import { claimsAnyDirection } from "../../utils/gesture/compute-claimed-directions";
|
|
9
|
+
import { resolveOwnership } from "../../utils/gesture/resolve-ownership";
|
|
8
10
|
import { useScreenGestureHandlers } from "./use-screen-gesture-handlers";
|
|
11
|
+
const DIRECTIONS = ["vertical", "vertical-inverted", "horizontal", "horizontal-inverted"];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Finds ancestor pan gestures that we shadow (claim the same direction).
|
|
15
|
+
* Used to block ancestors when child claims priority.
|
|
16
|
+
*/
|
|
17
|
+
function findShadowedAncestorPanGestures(selfClaims, ancestorContext, isIsolated) {
|
|
18
|
+
const shadowedGestures = [];
|
|
19
|
+
let ancestor = ancestorContext;
|
|
20
|
+
while (ancestor) {
|
|
21
|
+
if (ancestor.isIsolated !== isIsolated) break;
|
|
22
|
+
const shadowsAncestor = DIRECTIONS.some(dir => selfClaims[dir] && ancestor?.claimedDirections?.[dir]);
|
|
23
|
+
if (shadowsAncestor && ancestor.panGesture) {
|
|
24
|
+
shadowedGestures.push(ancestor.panGesture);
|
|
25
|
+
}
|
|
26
|
+
ancestor = ancestor.ancestorContext;
|
|
27
|
+
}
|
|
28
|
+
return shadowedGestures;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Builds the Pan gesture for screen dismissal.
|
|
32
|
+
*
|
|
33
|
+
* Handles shadowing: when child claims same direction as ancestor,
|
|
34
|
+
* child's pan blocks ancestor's pan via `blocksExternalGesture()`.
|
|
35
|
+
*
|
|
36
|
+
* ScrollView coordination is handled separately by useScrollRegistry,
|
|
37
|
+
* which creates its own Native gesture per ScrollView.
|
|
38
|
+
*/
|
|
9
39
|
export const useBuildGestures = ({
|
|
10
40
|
scrollConfig,
|
|
11
|
-
ancestorContext
|
|
41
|
+
ancestorContext,
|
|
42
|
+
claimedDirections,
|
|
43
|
+
childDirectionClaims,
|
|
44
|
+
isIsolated
|
|
12
45
|
}) => {
|
|
13
46
|
const {
|
|
14
47
|
current
|
|
@@ -17,33 +50,21 @@ export const useBuildGestures = ({
|
|
|
17
50
|
const isFirstScreen = useMemo(() => {
|
|
18
51
|
return navState.routes.findIndex(r => r.key === current.route.key) === 0;
|
|
19
52
|
}, [navState.routes, current.route.key]);
|
|
20
|
-
|
|
21
|
-
// Ref for external gesture coordination (e.g., swipeable lists)
|
|
22
53
|
const panGestureRef = useRef(undefined);
|
|
23
54
|
const gestureAnimationValues = GestureStore.getRouteGestures(current.route.key);
|
|
24
55
|
const {
|
|
25
56
|
snapPoints
|
|
26
57
|
} = current.options;
|
|
27
|
-
|
|
28
|
-
// Dismiss gesture is controlled by gestureEnabled (disabled for first screen)
|
|
29
58
|
const canDismiss = Boolean(isFirstScreen ? false : current.options.gestureEnabled);
|
|
30
|
-
|
|
31
|
-
// Snap navigation works independently - enabled when snap points exist
|
|
32
|
-
// This matches iOS native sheet behavior where gestureEnabled: false
|
|
33
|
-
// disables dismiss but you can still drag between detents
|
|
34
59
|
const hasSnapPoints = Array.isArray(snapPoints) && snapPoints.length > 0;
|
|
35
60
|
const gestureEnabled = canDismiss || hasSnapPoints;
|
|
61
|
+
const ownershipStatus = useMemo(() => resolveOwnership(claimedDirections, ancestorContext ?? null), [claimedDirections, ancestorContext]);
|
|
62
|
+
const selfClaimsAny = claimsAnyDirection(claimedDirections);
|
|
36
63
|
const handleDismiss = useCallback(() => {
|
|
37
|
-
|
|
38
|
-
// avoid racing with the ancestor
|
|
39
|
-
if (ancestorContext?.gestureAnimationValues.isDismissing?.value) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
64
|
+
if (ancestorContext?.gestureAnimationValues.isDismissing?.value) return;
|
|
42
65
|
const state = current.navigation.getState();
|
|
43
66
|
const routeStillPresent = state.routes.some(route => route.key === current.route.key);
|
|
44
|
-
if (!routeStillPresent)
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
67
|
+
if (!routeStillPresent) return;
|
|
47
68
|
current.navigation.dispatch({
|
|
48
69
|
...StackActions.pop(),
|
|
49
70
|
source: current.route.key,
|
|
@@ -60,38 +81,27 @@ export const useBuildGestures = ({
|
|
|
60
81
|
scrollConfig,
|
|
61
82
|
canDismiss,
|
|
62
83
|
handleDismiss,
|
|
63
|
-
|
|
84
|
+
ownershipStatus,
|
|
85
|
+
ancestorIsDismissing: ancestorContext?.gestureAnimationValues.isDismissing,
|
|
86
|
+
claimedDirections,
|
|
87
|
+
ancestorContext,
|
|
88
|
+
childDirectionClaims
|
|
64
89
|
});
|
|
65
90
|
return useMemo(() => {
|
|
66
91
|
const panGesture = Gesture.Pan().withRef(panGestureRef).enabled(gestureEnabled).manualActivation(true).onTouchesDown(onTouchesDown).onTouchesMove(onTouchesMove).onStart(onStart).onUpdate(onUpdate).onEnd(onEnd);
|
|
67
92
|
|
|
68
|
-
//
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
panGesture.blocksExternalGesture(nativeGesture);
|
|
74
|
-
} else {
|
|
75
|
-
// This screen has no gestures
|
|
76
|
-
// Find nearest ancestor with gestureEnabled=true (attached pan)
|
|
77
|
-
let activePanAncestor = ancestorContext;
|
|
78
|
-
while (activePanAncestor && !activePanAncestor.gestureEnabled) {
|
|
79
|
-
activePanAncestor = activePanAncestor.ancestorContext;
|
|
80
|
-
}
|
|
81
|
-
if (activePanAncestor?.panGesture) {
|
|
82
|
-
// Found an ancestor with enabled pan - wait for it
|
|
83
|
-
nativeGesture = Gesture.Native().requireExternalGestureToFail(activePanAncestor.panGesture);
|
|
84
|
-
} else {
|
|
85
|
-
// No ancestor with enabled pan - plain native
|
|
86
|
-
nativeGesture = Gesture.Native();
|
|
93
|
+
// Block shadowed ancestor pan gestures when we claim same directions
|
|
94
|
+
if (selfClaimsAny) {
|
|
95
|
+
const shadowedAncestorGestures = findShadowedAncestorPanGestures(claimedDirections, ancestorContext, isIsolated);
|
|
96
|
+
for (const ancestorPan of shadowedAncestorGestures) {
|
|
97
|
+
panGesture.blocksExternalGesture(ancestorPan);
|
|
87
98
|
}
|
|
88
99
|
}
|
|
89
100
|
return {
|
|
90
101
|
panGesture,
|
|
91
102
|
panGestureRef,
|
|
92
|
-
nativeGesture,
|
|
93
103
|
gestureAnimationValues
|
|
94
104
|
};
|
|
95
|
-
}, [gestureEnabled, onTouchesDown, onTouchesMove, onStart, onUpdate, onEnd, gestureAnimationValues, ancestorContext]);
|
|
105
|
+
}, [gestureEnabled, selfClaimsAny, claimedDirections, onTouchesDown, onTouchesMove, onStart, onUpdate, onEnd, gestureAnimationValues, ancestorContext, isIsolated]);
|
|
96
106
|
};
|
|
97
107
|
//# sourceMappingURL=use-build-gestures.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StackActions","useCallback","useMemo","useRef","Gesture","useKeys","GestureStore","useScreenGestureHandlers","useBuildGestures","scrollConfig","
|
|
1
|
+
{"version":3,"names":["StackActions","useCallback","useMemo","useRef","Gesture","useKeys","GestureStore","claimsAnyDirection","resolveOwnership","useScreenGestureHandlers","DIRECTIONS","findShadowedAncestorPanGestures","selfClaims","ancestorContext","isIsolated","shadowedGestures","ancestor","shadowsAncestor","some","dir","claimedDirections","panGesture","push","useBuildGestures","scrollConfig","childDirectionClaims","current","navState","navigation","getState","isFirstScreen","routes","findIndex","r","key","route","panGestureRef","undefined","gestureAnimationValues","getRouteGestures","snapPoints","options","canDismiss","Boolean","gestureEnabled","hasSnapPoints","Array","isArray","length","ownershipStatus","selfClaimsAny","handleDismiss","isDismissing","value","state","routeStillPresent","dispatch","pop","source","target","onTouchesDown","onTouchesMove","onStart","onUpdate","onEnd","ancestorIsDismissing","Pan","withRef","enabled","manualActivation","shadowedAncestorGestures","ancestorPan","blocksExternalGesture"],"sourceRoot":"../../../../../src","sources":["shared/hooks/gestures/use-build-gestures.tsx"],"mappings":"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","ignoreList":[]}
|