react-native-screen-transitions 3.3.0-beta.3 → 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 +2 -0
- 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 +59 -6
- 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 +112 -5
- 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 +1 -0
- 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 +59 -7
- 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 +112 -5
- 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 +27 -2
- 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 +1 -0
- package/src/shared/components/create-transition-aware-component.tsx +28 -25
- package/src/shared/components/screen-container.tsx +69 -7
- 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 +166 -5
- 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
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.findCollapseTarget = findCollapseTarget;
|
|
7
|
+
var _constants = require("../../constants");
|
|
8
|
+
/**
|
|
9
|
+
* Finds the next lower snap point for backdrop collapse behavior.
|
|
10
|
+
*
|
|
11
|
+
* - If above min snap: returns next lower snap point
|
|
12
|
+
* - If at or below min snap: returns 0 (dismiss) if canDismiss, else stays at min
|
|
13
|
+
*
|
|
14
|
+
* @param currentProgress - Current animation progress
|
|
15
|
+
* @param snapPoints - Array of snap points
|
|
16
|
+
* @param canDismiss - Whether dismissing is allowed
|
|
17
|
+
*/
|
|
18
|
+
function findCollapseTarget(currentProgress, snapPoints, canDismiss) {
|
|
19
|
+
"worklet";
|
|
20
|
+
|
|
21
|
+
const sorted = [...snapPoints].sort((a, b) => a - b);
|
|
22
|
+
const minSnap = sorted[0];
|
|
23
|
+
|
|
24
|
+
// Find next lower snap point
|
|
25
|
+
for (let i = sorted.length - 1; i >= 0; i--) {
|
|
26
|
+
if (sorted[i] < currentProgress - _constants.EPSILON) {
|
|
27
|
+
return {
|
|
28
|
+
target: sorted[i],
|
|
29
|
+
shouldDismiss: false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// At or below min snap → dismiss if allowed
|
|
35
|
+
if (canDismiss) {
|
|
36
|
+
return {
|
|
37
|
+
target: 0,
|
|
38
|
+
shouldDismiss: true
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Can't dismiss, stay at min
|
|
43
|
+
return {
|
|
44
|
+
target: minSnap,
|
|
45
|
+
shouldDismiss: false
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=find-collapse-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_constants","require","findCollapseTarget","currentProgress","snapPoints","canDismiss","sorted","sort","a","b","minSnap","i","length","EPSILON","target","shouldDismiss"],"sourceRoot":"../../../../../src","sources":["shared/utils/gesture/find-collapse-target.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CACjCC,eAAuB,EACvBC,UAAoB,EACpBC,UAAmB,EACQ;EAC3B,SAAS;;EAET,MAAMC,MAAM,GAAG,CAAC,GAAGF,UAAU,CAAC,CAACG,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,GAAGC,CAAC,CAAC;EACpD,MAAMC,OAAO,GAAGJ,MAAM,CAAC,CAAC,CAAC;;EAEzB;EACA,KAAK,IAAIK,CAAC,GAAGL,MAAM,CAACM,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;IAC5C,IAAIL,MAAM,CAACK,CAAC,CAAC,GAAGR,eAAe,GAAGU,kBAAO,EAAE;MAC1C,OAAO;QAAEC,MAAM,EAAER,MAAM,CAACK,CAAC,CAAC;QAAEI,aAAa,EAAE;MAAM,CAAC;IACnD;EACD;;EAEA;EACA,IAAIV,UAAU,EAAE;IACf,OAAO;MAAES,MAAM,EAAE,CAAC;MAAEC,aAAa,EAAE;IAAK,CAAC;EAC1C;;EAEA;EACA,OAAO;IAAED,MAAM,EAAEJ,OAAO;IAAEK,aAAa,EAAE;EAAM,CAAC;AACjD","ignoreList":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.findNearestOwner = findNearestOwner;
|
|
7
|
+
exports.resolveOwnership = resolveOwnership;
|
|
8
|
+
var _ownership = require("../../types/ownership.types");
|
|
9
|
+
/**
|
|
10
|
+
* Minimal interface for ancestor context needed for ownership resolution.
|
|
11
|
+
* This allows the function to be used without importing the full GestureContextType.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolves ownership status for all directions relative to the current screen.
|
|
16
|
+
*
|
|
17
|
+
* For each direction:
|
|
18
|
+
* 1. If the current screen claims it → 'self' (should activate)
|
|
19
|
+
* 2. Else, walk up ancestors looking for a claim → 'ancestor' (should fail to bubble)
|
|
20
|
+
* 3. If no one claims it → 'none' (should fail, no gesture response)
|
|
21
|
+
*
|
|
22
|
+
* This is computed during render (JS thread) and the result can be safely
|
|
23
|
+
* used in worklets since it's a plain object.
|
|
24
|
+
*
|
|
25
|
+
* @param selfClaims - The directions claimed by the current screen
|
|
26
|
+
* @param ancestorContext - The ancestor context chain (can be null if no ancestors)
|
|
27
|
+
* @returns Ownership status for all four directions
|
|
28
|
+
*/
|
|
29
|
+
function resolveOwnership(selfClaims, ancestorContext) {
|
|
30
|
+
const result = {
|
|
31
|
+
..._ownership.NO_OWNERSHIP
|
|
32
|
+
};
|
|
33
|
+
for (const direction of _ownership.DIRECTIONS) {
|
|
34
|
+
result[direction] = resolveDirectionOwnership(direction, selfClaims, ancestorContext);
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Resolves ownership for a single direction.
|
|
41
|
+
*/
|
|
42
|
+
function resolveDirectionOwnership(direction, selfClaims, ancestorContext) {
|
|
43
|
+
// Check self first
|
|
44
|
+
if (selfClaims[direction]) {
|
|
45
|
+
return "self";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Walk ancestors looking for a claim
|
|
49
|
+
let ancestor = ancestorContext;
|
|
50
|
+
while (ancestor) {
|
|
51
|
+
if (ancestor.claimedDirections?.[direction]) {
|
|
52
|
+
return "ancestor";
|
|
53
|
+
}
|
|
54
|
+
ancestor = ancestor.ancestorContext;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// No one claims this direction
|
|
58
|
+
return "none";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Finds the nearest ancestor (or self if isCurrentOwner) that claims any direction.
|
|
63
|
+
* Used for setting up native gesture relationships.
|
|
64
|
+
*
|
|
65
|
+
* @param selfClaimsAny - Whether the current screen claims any direction
|
|
66
|
+
* @param ancestorContext - The ancestor context chain
|
|
67
|
+
* @returns The nearest context that claims a direction, or null
|
|
68
|
+
*/
|
|
69
|
+
function findNearestOwner(selfClaimsAny, ancestorContext) {
|
|
70
|
+
// If self claims any direction, self is the nearest owner
|
|
71
|
+
// (but we return null since this is used for finding ANCESTOR owners)
|
|
72
|
+
if (selfClaimsAny) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Walk ancestors looking for one that claims any direction
|
|
77
|
+
let ancestor = ancestorContext;
|
|
78
|
+
while (ancestor) {
|
|
79
|
+
const claims = ancestor.claimedDirections;
|
|
80
|
+
if (claims?.vertical || claims?.["vertical-inverted"] || claims?.horizontal || claims?.["horizontal-inverted"]) {
|
|
81
|
+
return ancestor;
|
|
82
|
+
}
|
|
83
|
+
ancestor = ancestor.ancestorContext;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=resolve-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ownership","require","resolveOwnership","selfClaims","ancestorContext","result","NO_OWNERSHIP","direction","DIRECTIONS","resolveDirectionOwnership","ancestor","claimedDirections","findNearestOwner","selfClaimsAny","claims","vertical","horizontal"],"sourceRoot":"../../../../../src","sources":["shared/utils/gesture/resolve-ownership.ts"],"mappings":";;;;;;;AACA,IAAAA,UAAA,GAAAC,OAAA;AAOA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAC/BC,UAA6B,EAC7BC,eAA6C,EACxB;EACrB,MAAMC,MAA0B,GAAG;IAAE,GAAGC;EAAa,CAAC;EAEtD,KAAK,MAAMC,SAAS,IAAIC,qBAAU,EAAE;IACnCH,MAAM,CAACE,SAAS,CAAC,GAAGE,yBAAyB,CAC5CF,SAAS,EACTJ,UAAU,EACVC,eACD,CAAC;EACF;EAEA,OAAOC,MAAM;AACd;;AAEA;AACA;AACA;AACA,SAASI,yBAAyBA,CACjCF,SAAoB,EACpBJ,UAA6B,EAC7BC,eAA6C,EAC3B;EAClB;EACA,IAAID,UAAU,CAACI,SAAS,CAAC,EAAE;IAC1B,OAAO,MAAM;EACd;;EAEA;EACA,IAAIG,QAAQ,GAAGN,eAAe;EAC9B,OAAOM,QAAQ,EAAE;IAChB,IAAIA,QAAQ,CAACC,iBAAiB,GAAGJ,SAAS,CAAC,EAAE;MAC5C,OAAO,UAAU;IAClB;IACAG,QAAQ,GAAGA,QAAQ,CAACN,eAAe;EACpC;;EAEA;EACA,OAAO,MAAM;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASQ,gBAAgBA,CAC/BC,aAAsB,EACtBT,eAA6C,EACd;EAC/B;EACA;EACA,IAAIS,aAAa,EAAE;IAClB,OAAO,IAAI;EACZ;;EAEA;EACA,IAAIH,QAAQ,GAAGN,eAAe;EAC9B,OAAOM,QAAQ,EAAE;IAChB,MAAMI,MAAM,GAAGJ,QAAQ,CAACC,iBAAiB;IACzC,IACCG,MAAM,EAAEC,QAAQ,IAChBD,MAAM,GAAG,mBAAmB,CAAC,IAC7BA,MAAM,EAAEE,UAAU,IAClBF,MAAM,GAAG,qBAAqB,CAAC,EAC9B;MACD,OAAOJ,QAAQ;IAChB;IACAA,QAAQ,GAAGA,QAAQ,CAACN,eAAe;EACpC;EAEA,OAAO,IAAI;AACZ","ignoreList":[]}
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.velocity = void 0;
|
|
7
7
|
var _reactNativeReanimated = require("react-native-reanimated");
|
|
8
|
+
var _constants = require("../../constants");
|
|
8
9
|
const MAX_VELOCITY_MAGNITUDE = 3.2;
|
|
9
|
-
const NEAR_ZERO_THRESHOLD = 0.01;
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* Converts velocity from pixels/second to normalized units/second (0-1 range)
|
|
@@ -35,7 +35,7 @@ const normalizeTranslation = (translation, dimension) => {
|
|
|
35
35
|
const calculateRestoreVelocity = (currentValueNormalized, baseVelocityNormalized) => {
|
|
36
36
|
"worklet";
|
|
37
37
|
|
|
38
|
-
if (Math.abs(currentValueNormalized) <
|
|
38
|
+
if (Math.abs(currentValueNormalized) < _constants.ANIMATION_SNAP_THRESHOLD) return 0;
|
|
39
39
|
const directionTowardZero = Math.sign(currentValueNormalized) || 1;
|
|
40
40
|
const clampedVelocity = Math.min(Math.abs(baseVelocityNormalized), 1);
|
|
41
41
|
return -directionTowardZero * clampedVelocity;
|
|
@@ -84,11 +84,22 @@ const shouldPassDismissalThreshold = (translationPixels, velocityPixelsPerSecond
|
|
|
84
84
|
"worklet";
|
|
85
85
|
|
|
86
86
|
const normalizedTranslation = translationPixels / Math.max(1, screenSize);
|
|
87
|
+
|
|
88
|
+
// If translation is essentially zero, velocity alone shouldn't trigger dismissal.
|
|
89
|
+
// User must have meaningfully moved in the dismiss direction.
|
|
90
|
+
if (Math.abs(normalizedTranslation) < _constants.EPSILON) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
87
93
|
const normalizedVelocity = normalize(velocityPixelsPerSecond, screenSize);
|
|
88
94
|
const projectedNormalizedPosition = normalizedTranslation + normalizedVelocity * velocityWeight;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
95
|
+
|
|
96
|
+
// The dismiss direction is determined by the sign of the translation.
|
|
97
|
+
// Multiplying by this sign normalizes the projection so "toward dismiss" is always positive.
|
|
98
|
+
// This prevents dismissal when the user drags back (opposing velocity flips projection negative).
|
|
99
|
+
const dismissSign = Math.sign(translationPixels);
|
|
100
|
+
const projectedInDismissDirection = projectedNormalizedPosition * dismissSign;
|
|
101
|
+
const exceedsThreshold = projectedInDismissDirection > 0.5;
|
|
102
|
+
return exceedsThreshold;
|
|
92
103
|
};
|
|
93
104
|
const velocity = exports.velocity = {
|
|
94
105
|
normalize,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeReanimated","require","
|
|
1
|
+
{"version":3,"names":["_reactNativeReanimated","require","_constants","MAX_VELOCITY_MAGNITUDE","normalize","velocityPixelsPerSecond","screenSize","clamp","Math","max","normalizeTranslation","translation","dimension","calculateRestoreVelocity","currentValueNormalized","baseVelocityNormalized","abs","ANIMATION_SNAP_THRESHOLD","directionTowardZero","sign","clampedVelocity","min","calculateProgressVelocity","animations","shouldDismiss","event","dimensions","directions","currentProgress","progress","value","targetProgress","progressDelta","progressDirection","normalizedVelocityX","velocityX","width","normalizedVelocityY","velocityY","height","normalizedTranslationX","translationX","normalizedTranslationY","translationY","supportsHorizontalGestures","horizontal","horizontalInverted","supportsVerticalGestures","vertical","verticalInverted","progressVelocityMagnitude","shouldPassDismissalThreshold","translationPixels","velocityWeight","normalizedTranslation","EPSILON","normalizedVelocity","projectedNormalizedPosition","dismissSign","projectedInDismissDirection","exceedsThreshold","velocity","exports"],"sourceRoot":"../../../../../src","sources":["shared/utils/gesture/velocity.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
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,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":[]}
|
|
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,15 +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
7
|
import { GestureDetector } from "react-native-gesture-handler";
|
|
7
|
-
import Animated, { useAnimatedStyle } from "react-native-reanimated";
|
|
8
|
+
import Animated, { runOnUI, useAnimatedStyle } from "react-native-reanimated";
|
|
9
|
+
import { DefaultSnapSpec } from "../configs/specs";
|
|
8
10
|
import { NO_STYLES } from "../constants";
|
|
9
11
|
import { useBackdropPointerEvents } from "../hooks/use-backdrop-pointer-events";
|
|
10
12
|
import { useGestureContext } from "../providers/gestures.provider";
|
|
11
13
|
import { useKeys } from "../providers/screen/keys.provider";
|
|
12
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";
|
|
13
19
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
20
|
export const ScreenContainer = /*#__PURE__*/memo(({
|
|
15
21
|
children
|
|
@@ -25,10 +31,56 @@ export const ScreenContainer = /*#__PURE__*/memo(({
|
|
|
25
31
|
backdropBehavior
|
|
26
32
|
} = useBackdropPointerEvents();
|
|
27
33
|
const gestureContext = useGestureContext();
|
|
28
|
-
const
|
|
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]);
|
|
29
43
|
const handleBackdropPress = useCallback(() => {
|
|
30
|
-
|
|
31
|
-
|
|
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]);
|
|
32
84
|
const animatedContentStyle = useAnimatedStyle(() => {
|
|
33
85
|
"worklet";
|
|
34
86
|
|
|
@@ -44,8 +96,8 @@ export const ScreenContainer = /*#__PURE__*/memo(({
|
|
|
44
96
|
pointerEvents: pointerEvents,
|
|
45
97
|
children: [/*#__PURE__*/_jsx(Pressable, {
|
|
46
98
|
style: StyleSheet.absoluteFillObject,
|
|
47
|
-
pointerEvents:
|
|
48
|
-
onPress:
|
|
99
|
+
pointerEvents: isBackdropActive ? "auto" : "none",
|
|
100
|
+
onPress: isBackdropActive ? handleBackdropPress : undefined,
|
|
49
101
|
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
50
102
|
style: [StyleSheet.absoluteFillObject, animatedBackdropStyle]
|
|
51
103
|
})
|
|
@@ -53,7 +105,7 @@ export const ScreenContainer = /*#__PURE__*/memo(({
|
|
|
53
105
|
gesture: gestureContext.panGesture,
|
|
54
106
|
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
55
107
|
style: [styles.content, animatedContentStyle],
|
|
56
|
-
pointerEvents:
|
|
108
|
+
pointerEvents: isBackdropActive ? "box-none" : pointerEvents,
|
|
57
109
|
children: children
|
|
58
110
|
})
|
|
59
111
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["StackActions","memo","useCallback","Pressable","StyleSheet","View","GestureDetector","Animated","useAnimatedStyle","NO_STYLES","useBackdropPointerEvents","useGestureContext","useKeys","useScreenStyles","jsx","_jsx","jsxs","_jsxs","ScreenContainer","children","stylesMap","current","pointerEvents","backdropBehavior","gestureContext","
|
|
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":";;AAAA;AACA,SAASA,YAAY,QAAQ,0BAA0B;AACvD,SAASC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AACzC,SAASC,SAAS,EAAEC,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC1D,SAASC,eAAe,QAAQ,8BAA8B;AAC9D,OAAOC,QAAQ,IAAIC,OAAO,EAAEC,gBAAgB,QAAQ,yBAAyB;AAC7E,SAASC,eAAe,QAAQ,kBAAkB;AAClD,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,wBAAwB,QAAQ,sCAAsC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,OAAO,QAAQ,mCAAmC;AAC3D,SAASC,eAAe,QAAQ,qCAAqC;AACrE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,iBAAiB,QAAQ,wCAAwC;AAC1E,SAASC,kBAAkB,QAAQ,uCAAuC;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAM3E,OAAO,MAAMC,eAAe,gBAAGvB,IAAI,CAAC,CAAC;EAAEwB;AAAgB,CAAC,KAAK;EAC5D,MAAM;IAAEC;EAAU,CAAC,GAAGX,eAAe,CAAC,CAAC;EACvC,MAAM;IAAEY;EAAQ,CAAC,GAAGb,OAAO,CAAC,CAAC;EAC7B,MAAM;IAAEc,aAAa;IAAEC;EAAiB,CAAC,GAAGjB,wBAAwB,CAAC,CAAC;EACtE,MAAMkB,cAAc,GAAGjB,iBAAiB,CAAC,CAAC;EAE1C,MAAMkB,gBAAgB,GACrBF,gBAAgB,KAAK,SAAS,IAAIA,gBAAgB,KAAK,UAAU;EAElE,MAAMG,aAAa,GAAG9B,WAAW,CAAC,MAAM;IACvC,MAAM+B,KAAK,GAAGN,OAAO,CAACO,UAAU,CAACC,QAAQ,CAAC,CAAC;IAC3CR,OAAO,CAACO,UAAU,CAACE,QAAQ,CAAC;MAC3B,GAAGpC,YAAY,CAACqC,GAAG,CAAC,CAAC;MACrBC,MAAM,EAAEX,OAAO,CAACY,KAAK,CAACC,GAAG;MACzBC,MAAM,EAAER,KAAK,CAACO;IACf,CAAC,CAAC;EACH,CAAC,EAAE,CAACb,OAAO,CAAC,CAAC;EAEb,MAAMe,mBAAmB,GAAGxC,WAAW,CAAC,MAAM;IAC7C,IAAI2B,gBAAgB,KAAK,SAAS,EAAE;MACnCG,aAAa,CAAC,CAAC;MACf;IACD;IAEA,IAAIH,gBAAgB,KAAK,UAAU,EAAE;MACpC,MAAMc,UAAU,GAAGhB,OAAO,CAACiB,OAAO,CAACD,UAAU;MAC7C,MAAME,UAAU,GAAGlB,OAAO,CAACiB,OAAO,CAACE,cAAc,KAAK,KAAK;;MAE3D;MACA,IAAI,CAACH,UAAU,IAAIA,UAAU,CAACI,MAAM,KAAK,CAAC,EAAE;QAC3Cf,aAAa,CAAC,CAAC;QACf;MACD;MAEA,MAAMgB,UAAU,GAAGhC,cAAc,CAACiC,MAAM,CAACtB,OAAO,CAACY,KAAK,CAACC,GAAG,CAAC;MAC3D,MAAMU,QAAQ,GAAGjC,YAAY,CAACkC,gBAAgB,CAACxB,OAAO,CAACY,KAAK,CAACC,GAAG,CAAC;MACjE,MAAMY,cAAc,GAAGzB,OAAO,CAACiB,OAAO,CAACQ,cAAc;MAErD5C,OAAO,CAAC,MAAM;QACb,SAAS;;QACT,MAAM;UAAEiC,MAAM;UAAEY;QAAc,CAAC,GAAGlC,kBAAkB,CACnD6B,UAAU,CAACM,QAAQ,CAACC,KAAK,EACzBZ,UAAU,EACVE,UACD,CAAC;;QAED;QACA,IAAIK,QAAQ,CAACM,YAAY,CAACD,KAAK,EAAE;QAEjCL,QAAQ,CAACM,YAAY,CAACD,KAAK,GAAGF,aAAa,GAAG,CAAC,GAAG,CAAC;QAEnD,MAAMI,IAAI,GAAGJ,aAAa,GACvBD,cAAc,GACd;UACAM,IAAI,EAAEN,cAAc,EAAEO,MAAM,IAAIjD,eAAe;UAC/CkD,KAAK,EAAER,cAAc,EAAES,QAAQ,IAAInD;QACpC,CAAC;QAEHQ,iBAAiB,CAAC;UACjBuB,MAAM;UACNgB,IAAI;UACJT,UAAU;UACVc,iBAAiB,EAAET,aAAa,GAAGrB,aAAa,GAAG+B;QACpD,CAAC,CAAC;MACH,CAAC,CAAC,CAAC,CAAC;IACL;EACD,CAAC,EAAE,CAAClC,gBAAgB,EAAEF,OAAO,EAAEK,aAAa,CAAC,CAAC;EAE9C,MAAMgC,oBAAoB,GAAGvD,gBAAgB,CAAC,MAAM;IACnD,SAAS;;IACT,OAAOiB,SAAS,CAAC6B,KAAK,CAACU,YAAY,IAAItD,SAAS;EACjD,CAAC,CAAC;EAEF,MAAMuD,qBAAqB,GAAGzD,gBAAgB,CAAC,MAAM;IACpD,SAAS;;IACT,OACCiB,SAAS,CAAC6B,KAAK,CAACY,aAAa,IAAIzC,SAAS,CAAC6B,KAAK,CAACa,YAAY,IAAIzD,SAAS;EAE5E,CAAC,CAAC;EAEF,oBACCY,KAAA,CAAClB,IAAI;IAACgE,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAC3C,aAAa,EAAEA,aAAc;IAAAH,QAAA,gBAC3DJ,IAAA,CAAClB,SAAS;MACTkE,KAAK,EAAEjE,UAAU,CAACoE,kBAAmB;MACrC5C,aAAa,EAAEG,gBAAgB,GAAG,MAAM,GAAG,MAAO;MAClD0C,OAAO,EAAE1C,gBAAgB,GAAGW,mBAAmB,GAAGqB,SAAU;MAAAtC,QAAA,eAE5DJ,IAAA,CAACd,QAAQ,CAACF,IAAI;QACbgE,KAAK,EAAE,CAACjE,UAAU,CAACoE,kBAAkB,EAAEN,qBAAqB;MAAE,CAC9D;IAAC,CACQ,CAAC,eACZ7C,IAAA,CAACf,eAAe;MAACoE,OAAO,EAAE5C,cAAc,CAAE6C,UAAW;MAAAlD,QAAA,eACpDJ,IAAA,CAACd,QAAQ,CAACF,IAAI;QACbgE,KAAK,EAAE,CAACC,MAAM,CAACM,OAAO,EAAEZ,oBAAoB,CAAE;QAC9CpC,aAAa,EAAEG,gBAAgB,GAAG,UAAU,GAAGH,aAAc;QAAAH,QAAA,EAE5DA;MAAQ,CACK;IAAC,CACA,CAAC;EAAA,CACb,CAAC;AAET,CAAC,CAAC;AAEF,MAAM6C,MAAM,GAAGlE,UAAU,CAACyE,MAAM,CAAC;EAChCN,SAAS,EAAE;IACVO,IAAI,EAAE;EACP,CAAC;EACDF,OAAO,EAAE;IACRE,IAAI,EAAE;EACP;AACD,CAAC,CAAC","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
|