react-native-screen-transitions 1.0.1 → 1.0.3
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 +4 -4
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +205 -216
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +192 -203
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/dist/index.js
CHANGED
|
@@ -221,89 +221,18 @@ var ElasticCard = (config = { elasticFactor: 0.5 }) => {
|
|
|
221
221
|
};
|
|
222
222
|
|
|
223
223
|
// src/hooks/use-screen-animation.tsx
|
|
224
|
-
var
|
|
225
|
-
var
|
|
224
|
+
var import_native3 = require("@react-navigation/native");
|
|
225
|
+
var import_react2 = require("react");
|
|
226
226
|
var import_react_native = require("react-native");
|
|
227
227
|
var import_react_native_reanimated5 = require("react-native-reanimated");
|
|
228
228
|
var import_react_native_safe_area_context = require("react-native-safe-area-context");
|
|
229
229
|
|
|
230
|
-
// src/store/utils/use-shallow.tsx
|
|
231
|
-
var import_react = __toESM(require("react"));
|
|
232
|
-
|
|
233
|
-
// src/store/utils/shallow.ts
|
|
234
|
-
var isIterable = (obj) => Symbol.iterator in obj;
|
|
235
|
-
var hasIterableEntries = (value) => (
|
|
236
|
-
// HACK: avoid checking entries type
|
|
237
|
-
"entries" in value
|
|
238
|
-
);
|
|
239
|
-
var compareEntries = (valueA, valueB) => {
|
|
240
|
-
const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());
|
|
241
|
-
const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());
|
|
242
|
-
if (mapA.size !== mapB.size) {
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
for (const [key, value] of mapA) {
|
|
246
|
-
if (!Object.is(value, mapB.get(key))) {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return true;
|
|
251
|
-
};
|
|
252
|
-
var compareIterables = (valueA, valueB) => {
|
|
253
|
-
const iteratorA = valueA[Symbol.iterator]();
|
|
254
|
-
const iteratorB = valueB[Symbol.iterator]();
|
|
255
|
-
let nextA = iteratorA.next();
|
|
256
|
-
let nextB = iteratorB.next();
|
|
257
|
-
while (!nextA.done && !nextB.done) {
|
|
258
|
-
if (!Object.is(nextA.value, nextB.value)) {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
nextA = iteratorA.next();
|
|
262
|
-
nextB = iteratorB.next();
|
|
263
|
-
}
|
|
264
|
-
return !!nextA.done && !!nextB.done;
|
|
265
|
-
};
|
|
266
|
-
function shallow(valueA, valueB) {
|
|
267
|
-
if (Object.is(valueA, valueB)) {
|
|
268
|
-
return true;
|
|
269
|
-
}
|
|
270
|
-
if (typeof valueA !== "object" || valueA === null || typeof valueB !== "object" || valueB === null) {
|
|
271
|
-
return false;
|
|
272
|
-
}
|
|
273
|
-
if (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
if (isIterable(valueA) && isIterable(valueB)) {
|
|
277
|
-
if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {
|
|
278
|
-
return compareEntries(valueA, valueB);
|
|
279
|
-
}
|
|
280
|
-
return compareIterables(valueA, valueB);
|
|
281
|
-
}
|
|
282
|
-
return compareEntries(
|
|
283
|
-
{ entries: () => Object.entries(valueA) },
|
|
284
|
-
{ entries: () => Object.entries(valueB) }
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// src/store/utils/use-shallow.tsx
|
|
289
|
-
function useShallow(selector) {
|
|
290
|
-
const prev = import_react.default.useRef(void 0);
|
|
291
|
-
return (state) => {
|
|
292
|
-
const next = selector(state);
|
|
293
|
-
if (shallow(prev.current, next)) {
|
|
294
|
-
return prev.current;
|
|
295
|
-
}
|
|
296
|
-
prev.current = next;
|
|
297
|
-
return next;
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
|
|
301
230
|
// src/animation-engine.ts
|
|
302
231
|
var import_react_native_reanimated3 = require("react-native-reanimated");
|
|
303
232
|
|
|
304
233
|
// src/store/utils/create-vanilla-store.ts
|
|
305
234
|
var import_immer = require("immer");
|
|
306
|
-
var
|
|
235
|
+
var import_react = require("react");
|
|
307
236
|
function createVanillaStore(initialState) {
|
|
308
237
|
let state = initialState;
|
|
309
238
|
const listeners = /* @__PURE__ */ new Set();
|
|
@@ -333,7 +262,7 @@ function createVanillaStore(initialState) {
|
|
|
333
262
|
return unsubscribe;
|
|
334
263
|
};
|
|
335
264
|
function useStore(selector) {
|
|
336
|
-
return (0,
|
|
265
|
+
return (0, import_react.useSyncExternalStore)(subscribe, () => selector(getState()));
|
|
337
266
|
}
|
|
338
267
|
Object.assign(useStore, {
|
|
339
268
|
setState,
|
|
@@ -344,49 +273,93 @@ function createVanillaStore(initialState) {
|
|
|
344
273
|
return useStore;
|
|
345
274
|
}
|
|
346
275
|
|
|
347
|
-
// src/store/
|
|
348
|
-
var
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
};
|
|
363
|
-
} else {
|
|
364
|
-
const { name = "", status = 0, closing = false, ...rest } = value;
|
|
365
|
-
const newIndex = routeKeys.length;
|
|
366
|
-
routes[key] = {
|
|
367
|
-
id: key,
|
|
368
|
-
index: newIndex,
|
|
369
|
-
name,
|
|
370
|
-
status,
|
|
371
|
-
closing,
|
|
372
|
-
...rest
|
|
373
|
-
};
|
|
374
|
-
routeKeys.push(key);
|
|
375
|
-
}
|
|
376
|
-
});
|
|
377
|
-
},
|
|
378
|
-
removeRoute: (key) => {
|
|
379
|
-
if (!key) return;
|
|
380
|
-
useRouteStore.setState(({ routes, routeKeys }) => {
|
|
381
|
-
delete routes[key];
|
|
382
|
-
const indexToRemove = routeKeys.indexOf(key);
|
|
383
|
-
if (indexToRemove > -1) {
|
|
384
|
-
routeKeys.splice(indexToRemove, 1);
|
|
385
|
-
}
|
|
276
|
+
// src/store/utils/handle-screen-dismiss.tsx
|
|
277
|
+
var import_native = require("@react-navigation/native");
|
|
278
|
+
var handleScreenDismiss = (screenBeingDismissed, navigation) => {
|
|
279
|
+
const { screens } = ScreenStore.use.getState();
|
|
280
|
+
const dismissedScreen = screens[screenBeingDismissed];
|
|
281
|
+
if (!dismissedScreen) {
|
|
282
|
+
navigation.goBack();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const childScreens = Object.values(screens).filter(
|
|
286
|
+
(screen) => screen.parentNavigatorKey === dismissedScreen.navigatorKey
|
|
287
|
+
);
|
|
288
|
+
if (childScreens.length > 0) {
|
|
289
|
+
ScreenStore.updateScreen(dismissedScreen.id, {
|
|
290
|
+
closing: true
|
|
386
291
|
});
|
|
292
|
+
navigation.dispatch(import_native.StackActions.pop(childScreens.length));
|
|
293
|
+
} else {
|
|
294
|
+
navigation.goBack();
|
|
387
295
|
}
|
|
388
296
|
};
|
|
389
297
|
|
|
298
|
+
// src/store/utils/remove-screen.tsx
|
|
299
|
+
var removeScreen = (key) => {
|
|
300
|
+
if (!key) return;
|
|
301
|
+
ScreenStore.use.setState(({ screens, screenKeys }) => {
|
|
302
|
+
delete screens[key];
|
|
303
|
+
const indexToRemove = screenKeys.indexOf(key);
|
|
304
|
+
if (indexToRemove > -1) {
|
|
305
|
+
screenKeys.splice(indexToRemove, 1);
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// src/store/utils/should-skip-prevent-default.tsx
|
|
311
|
+
var shouldSkipPreventDefault = (key, navigatorState) => {
|
|
312
|
+
if (!key) return false;
|
|
313
|
+
const { screens } = ScreenStore.use.getState();
|
|
314
|
+
const currentScreen = screens[key];
|
|
315
|
+
const isLastScreenInStack = navigatorState.routes.length === 1 && navigatorState.routes[0].key === key;
|
|
316
|
+
const isParentNavigatorExiting = Boolean(
|
|
317
|
+
currentScreen?.parentNavigatorKey && Object.values(screens).some(
|
|
318
|
+
(screen) => screen.navigatorKey === currentScreen.parentNavigatorKey && screen.closing
|
|
319
|
+
)
|
|
320
|
+
);
|
|
321
|
+
return isLastScreenInStack || isParentNavigatorExiting;
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
// src/store/utils/update-screen.tsx
|
|
325
|
+
var updateScreen = (key, value) => {
|
|
326
|
+
if (!key) return;
|
|
327
|
+
ScreenStore.use.setState(({ screenKeys, screens }) => {
|
|
328
|
+
const currentScreen = screens[key];
|
|
329
|
+
if (currentScreen) {
|
|
330
|
+
screens[key] = {
|
|
331
|
+
...currentScreen,
|
|
332
|
+
...value
|
|
333
|
+
};
|
|
334
|
+
} else {
|
|
335
|
+
const { name = "", status = 0, closing = false, ...rest } = value;
|
|
336
|
+
const newIndex = screenKeys.length;
|
|
337
|
+
screens[key] = {
|
|
338
|
+
id: key,
|
|
339
|
+
index: newIndex,
|
|
340
|
+
name,
|
|
341
|
+
status,
|
|
342
|
+
closing,
|
|
343
|
+
...rest
|
|
344
|
+
};
|
|
345
|
+
screenKeys.push(key);
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
// src/store/index.ts
|
|
351
|
+
var useScreenStore = createVanillaStore({
|
|
352
|
+
screens: {},
|
|
353
|
+
screenKeys: []
|
|
354
|
+
});
|
|
355
|
+
var ScreenStore = {
|
|
356
|
+
use: useScreenStore,
|
|
357
|
+
updateScreen,
|
|
358
|
+
removeScreen,
|
|
359
|
+
handleScreenDismiss,
|
|
360
|
+
shouldSkipPreventDefault
|
|
361
|
+
};
|
|
362
|
+
|
|
390
363
|
// src/utils/animate.ts
|
|
391
364
|
var import_react_native_reanimated2 = require("react-native-reanimated");
|
|
392
365
|
var animate = (toValue, config, callback) => {
|
|
@@ -407,12 +380,12 @@ var animationValues = {
|
|
|
407
380
|
normalizedGestureY: {},
|
|
408
381
|
gestureDragging: {}
|
|
409
382
|
};
|
|
410
|
-
var triggerAnimation = (
|
|
383
|
+
var triggerAnimation = (screen) => {
|
|
411
384
|
"worklet";
|
|
412
|
-
const { id, closing, status, transitionSpec, onAnimationFinish } =
|
|
385
|
+
const { id, closing, status, transitionSpec, onAnimationFinish } = screen;
|
|
413
386
|
const progressValue = animationValues.screenProgress[id];
|
|
414
387
|
if (!progressValue && __DEV__) {
|
|
415
|
-
console.warn(`Animation values not found for
|
|
388
|
+
console.warn(`Animation values not found for screen: ${id}`);
|
|
416
389
|
return;
|
|
417
390
|
}
|
|
418
391
|
const animationConfig = closing ? transitionSpec?.close : transitionSpec?.open;
|
|
@@ -424,14 +397,16 @@ var triggerAnimation = (route) => {
|
|
|
424
397
|
}
|
|
425
398
|
});
|
|
426
399
|
};
|
|
427
|
-
|
|
428
|
-
(state) => state.
|
|
429
|
-
(
|
|
430
|
-
const currKeys = Object.keys(
|
|
431
|
-
const prevKeys = Object.keys(
|
|
400
|
+
ScreenStore.use.subscribeWithSelector(
|
|
401
|
+
(state) => state.screens,
|
|
402
|
+
(currScreens, prevScreens) => {
|
|
403
|
+
const currKeys = Object.keys(currScreens);
|
|
404
|
+
const prevKeys = Object.keys(prevScreens);
|
|
432
405
|
const incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));
|
|
433
406
|
const removedKeys = prevKeys.filter((k) => !currKeys.includes(k));
|
|
434
|
-
const changedKeys = currKeys.filter(
|
|
407
|
+
const changedKeys = currKeys.filter(
|
|
408
|
+
(k) => currScreens[k] !== prevScreens[k]
|
|
409
|
+
);
|
|
435
410
|
const animatableValues = Object.values(animationValues);
|
|
436
411
|
for (const incomingKey of incomingKeys) {
|
|
437
412
|
for (const value of animatableValues) {
|
|
@@ -445,9 +420,9 @@ RouteStore.use.subscribeWithSelector(
|
|
|
445
420
|
}
|
|
446
421
|
}
|
|
447
422
|
for (const changedKey of changedKeys) {
|
|
448
|
-
const
|
|
449
|
-
if (
|
|
450
|
-
triggerAnimation(
|
|
423
|
+
const currentScreen = currScreens[changedKey];
|
|
424
|
+
if (currentScreen) {
|
|
425
|
+
triggerAnimation(currentScreen);
|
|
451
426
|
}
|
|
452
427
|
}
|
|
453
428
|
}
|
|
@@ -457,10 +432,11 @@ RouteStore.use.subscribeWithSelector(
|
|
|
457
432
|
var import_react_native_gesture_handler = require("react-native-gesture-handler");
|
|
458
433
|
var import_react_native_reanimated4 = require("react-native-reanimated");
|
|
459
434
|
|
|
460
|
-
// src/utils/gesture/
|
|
461
|
-
var
|
|
435
|
+
// src/utils/gesture/apply-gesture-activation-criteria.ts
|
|
436
|
+
var applyGestureActivationCriteria = ({
|
|
462
437
|
gestureDirection,
|
|
463
|
-
gestureResponseDistance
|
|
438
|
+
gestureResponseDistance,
|
|
439
|
+
panGesture
|
|
464
440
|
}) => {
|
|
465
441
|
const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
|
|
466
442
|
if (directions.includes("bidirectional")) {
|
|
@@ -517,7 +493,20 @@ var createGestureActivationCriteria = ({
|
|
|
517
493
|
} else {
|
|
518
494
|
result.failOffsetY = [-toleranceY, toleranceY];
|
|
519
495
|
}
|
|
520
|
-
|
|
496
|
+
if (result?.activeOffsetX) {
|
|
497
|
+
panGesture.activeOffsetX(result.activeOffsetX);
|
|
498
|
+
}
|
|
499
|
+
if (result?.activeOffsetY) {
|
|
500
|
+
panGesture.activeOffsetY(result.activeOffsetY);
|
|
501
|
+
}
|
|
502
|
+
if (result?.failOffsetX) {
|
|
503
|
+
panGesture.failOffsetX(result.failOffsetX);
|
|
504
|
+
}
|
|
505
|
+
if (result?.failOffsetY) {
|
|
506
|
+
panGesture.failOffsetY(result.failOffsetY);
|
|
507
|
+
}
|
|
508
|
+
panGesture.enableTrackpadTwoFingerGesture(true);
|
|
509
|
+
return panGesture;
|
|
521
510
|
};
|
|
522
511
|
|
|
523
512
|
// src/utils/gesture/map-gesture-to-progress.ts
|
|
@@ -533,10 +522,10 @@ var DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;
|
|
|
533
522
|
var buildGestureDetector = ({
|
|
534
523
|
key,
|
|
535
524
|
progress,
|
|
536
|
-
|
|
525
|
+
screenState,
|
|
537
526
|
width,
|
|
538
527
|
height,
|
|
539
|
-
|
|
528
|
+
handleDismiss
|
|
540
529
|
}) => {
|
|
541
530
|
const _translateX = animationValues.gestureX[key];
|
|
542
531
|
const _translateY = animationValues.gestureY[key];
|
|
@@ -549,7 +538,7 @@ var buildGestureDetector = ({
|
|
|
549
538
|
transitionSpec,
|
|
550
539
|
gestureVelocityImpact = GESTURE_VELOCITY_IMPACT,
|
|
551
540
|
gestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE
|
|
552
|
-
} =
|
|
541
|
+
} = screenState;
|
|
553
542
|
const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
|
|
554
543
|
const panGesture = import_react_native_gesture_handler.Gesture.Pan().enabled(gestureEnabled).onStart(() => {
|
|
555
544
|
"worklet";
|
|
@@ -628,7 +617,7 @@ var buildGestureDetector = ({
|
|
|
628
617
|
const spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;
|
|
629
618
|
const onFinish = shouldDismiss ? (isFinished) => {
|
|
630
619
|
"worklet";
|
|
631
|
-
if (isFinished) (0, import_react_native_reanimated4.runOnJS)(
|
|
620
|
+
if (isFinished) (0, import_react_native_reanimated4.runOnJS)(handleDismiss)(screenState.id);
|
|
632
621
|
} : void 0;
|
|
633
622
|
progress.value = animate(finalProgress, spec, onFinish);
|
|
634
623
|
_translateX.value = animate(0, spec);
|
|
@@ -636,25 +625,12 @@ var buildGestureDetector = ({
|
|
|
636
625
|
_normalizedGestureX.value = animate(0, spec);
|
|
637
626
|
_normalizedGestureY.value = animate(0, spec);
|
|
638
627
|
});
|
|
639
|
-
|
|
628
|
+
applyGestureActivationCriteria({
|
|
640
629
|
gestureDirection,
|
|
641
|
-
gestureResponseDistance
|
|
630
|
+
gestureResponseDistance,
|
|
631
|
+
panGesture
|
|
642
632
|
});
|
|
643
|
-
|
|
644
|
-
panGesture.activeOffsetX(criteria.activeOffsetX);
|
|
645
|
-
}
|
|
646
|
-
if (criteria?.activeOffsetY) {
|
|
647
|
-
panGesture.activeOffsetY(criteria.activeOffsetY);
|
|
648
|
-
}
|
|
649
|
-
if (criteria?.failOffsetX) {
|
|
650
|
-
panGesture.failOffsetX(criteria.failOffsetX);
|
|
651
|
-
}
|
|
652
|
-
if (criteria?.failOffsetY) {
|
|
653
|
-
panGesture.failOffsetY(criteria.failOffsetY);
|
|
654
|
-
}
|
|
655
|
-
panGesture.enableTrackpadTwoFingerGesture(true);
|
|
656
|
-
const nativeGesture = import_react_native_gesture_handler.Gesture.Native().shouldCancelWhenOutside(false);
|
|
657
|
-
return import_react_native_gesture_handler.Gesture.Race(panGesture, nativeGesture);
|
|
633
|
+
return panGesture;
|
|
658
634
|
};
|
|
659
635
|
|
|
660
636
|
// src/utils/noop-interpolator.ts
|
|
@@ -667,34 +643,42 @@ var noopinterpolator = () => {
|
|
|
667
643
|
};
|
|
668
644
|
|
|
669
645
|
// src/hooks/use-key.tsx
|
|
670
|
-
var
|
|
671
|
-
var useKey = () => (0,
|
|
646
|
+
var import_native2 = require("@react-navigation/native");
|
|
647
|
+
var useKey = () => (0, import_native2.useRoute)().key;
|
|
672
648
|
|
|
673
649
|
// src/hooks/use-screen-animation.tsx
|
|
674
650
|
var useAnimationBuilder = () => {
|
|
675
651
|
const key = useKey();
|
|
676
652
|
const dimensions = (0, import_react_native.useWindowDimensions)();
|
|
677
653
|
const insets = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
|
|
678
|
-
const navigation = (0,
|
|
679
|
-
const
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
654
|
+
const navigation = (0, import_native3.useNavigation)();
|
|
655
|
+
const progressFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
656
|
+
const gestureDraggingFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
657
|
+
const gestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
658
|
+
const gestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
659
|
+
const normalizedGestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
660
|
+
const normalizedGestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
|
|
661
|
+
const currentScreen = ScreenStore.use(
|
|
662
|
+
(0, import_react2.useCallback)((state) => state.screens[key], [key])
|
|
663
|
+
);
|
|
664
|
+
const actualNextScreen = ScreenStore.use(
|
|
665
|
+
(0, import_react2.useCallback)(
|
|
666
|
+
(state) => {
|
|
667
|
+
const current = state.screens[key];
|
|
668
|
+
if (!current) return void 0;
|
|
669
|
+
const nextKey = state.screenKeys[current.index + 1];
|
|
670
|
+
const nextScreen = nextKey ? state.screens[nextKey] : void 0;
|
|
671
|
+
const shouldUseNext = nextScreen?.navigatorKey === current?.navigatorKey;
|
|
672
|
+
return shouldUseNext ? nextScreen : void 0;
|
|
673
|
+
},
|
|
674
|
+
[key]
|
|
675
|
+
)
|
|
692
676
|
);
|
|
693
|
-
const panGesture = (0,
|
|
677
|
+
const panGesture = (0, import_react2.useMemo)(
|
|
694
678
|
() => buildGestureDetector({
|
|
695
679
|
key,
|
|
696
680
|
progress: animationValues.screenProgress[key],
|
|
697
|
-
|
|
681
|
+
screenState: currentScreen || {
|
|
698
682
|
id: key,
|
|
699
683
|
name: key,
|
|
700
684
|
index: 0,
|
|
@@ -703,57 +687,50 @@ var useAnimationBuilder = () => {
|
|
|
703
687
|
},
|
|
704
688
|
width: dimensions.width,
|
|
705
689
|
height: dimensions.height,
|
|
706
|
-
|
|
690
|
+
handleDismiss: (screenBeingDismissed) => {
|
|
691
|
+
ScreenStore.handleScreenDismiss(screenBeingDismissed, navigation);
|
|
692
|
+
}
|
|
707
693
|
}),
|
|
708
|
-
[key,
|
|
694
|
+
[key, currentScreen, dimensions, navigation]
|
|
709
695
|
);
|
|
710
|
-
const
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
696
|
+
const getAnimationValuesForScreen = (0, import_react2.useCallback)(
|
|
697
|
+
(screenId) => ({
|
|
698
|
+
progress: animationValues.screenProgress[screenId] || progressFallback,
|
|
699
|
+
gesture: {
|
|
700
|
+
isDragging: animationValues.gestureDragging[screenId] || gestureDraggingFallback,
|
|
701
|
+
x: animationValues.gestureX[screenId] || gestureXFallback,
|
|
702
|
+
y: animationValues.gestureY[screenId] || gestureYFallback,
|
|
703
|
+
normalizedX: animationValues.normalizedGestureX[screenId] || normalizedGestureXFallback,
|
|
704
|
+
normalizedY: animationValues.normalizedGestureY[screenId] || normalizedGestureYFallback
|
|
705
|
+
}
|
|
706
|
+
}),
|
|
707
|
+
[
|
|
708
|
+
progressFallback,
|
|
709
|
+
gestureDraggingFallback,
|
|
710
|
+
gestureXFallback,
|
|
711
|
+
gestureYFallback,
|
|
712
|
+
normalizedGestureXFallback,
|
|
713
|
+
normalizedGestureYFallback
|
|
714
|
+
]
|
|
715
|
+
);
|
|
716
|
+
return (0, import_react2.useMemo)(() => {
|
|
717
717
|
return {
|
|
718
|
-
current:
|
|
719
|
-
|
|
720
|
-
gesture: {
|
|
721
|
-
isDragging: animationValues.gestureDragging[key] || gestureDraggingFallback,
|
|
722
|
-
x: animationValues.gestureX[key] || gestureXFallback,
|
|
723
|
-
y: animationValues.gestureY[key] || gestureYFallback,
|
|
724
|
-
normalizedX: animationValues.normalizedGestureX[key] || normalizedGestureXFallback,
|
|
725
|
-
normalizedY: animationValues.normalizedGestureY[key] || normalizedGestureYFallback
|
|
726
|
-
}
|
|
727
|
-
},
|
|
728
|
-
next: nextRoute && animationValues.screenProgress[nextRoute.id] ? {
|
|
729
|
-
progress: animationValues.screenProgress[nextRoute.id],
|
|
730
|
-
gesture: {
|
|
731
|
-
isDragging: animationValues.gestureDragging[nextRoute.id] || gestureDraggingFallback,
|
|
732
|
-
x: animationValues.gestureX[nextRoute.id] || gestureXFallback,
|
|
733
|
-
y: animationValues.gestureY[nextRoute.id] || gestureYFallback,
|
|
734
|
-
normalizedX: animationValues.normalizedGestureX[nextRoute.id] || normalizedGestureXFallback,
|
|
735
|
-
normalizedY: animationValues.normalizedGestureY[nextRoute.id] || normalizedGestureYFallback
|
|
736
|
-
}
|
|
737
|
-
} : void 0,
|
|
718
|
+
current: getAnimationValuesForScreen(key),
|
|
719
|
+
next: actualNextScreen ? getAnimationValuesForScreen(actualNextScreen.id) : void 0,
|
|
738
720
|
layouts: { screen: dimensions },
|
|
739
721
|
insets,
|
|
740
|
-
closing:
|
|
741
|
-
screenStyleInterpolator:
|
|
722
|
+
closing: currentScreen?.closing || false,
|
|
723
|
+
screenStyleInterpolator: actualNextScreen?.screenStyleInterpolator || currentScreen?.screenStyleInterpolator || noopinterpolator,
|
|
742
724
|
gestureDetector: panGesture
|
|
743
725
|
};
|
|
744
726
|
}, [
|
|
745
727
|
key,
|
|
746
|
-
|
|
747
|
-
|
|
728
|
+
currentScreen,
|
|
729
|
+
actualNextScreen,
|
|
748
730
|
dimensions,
|
|
749
731
|
insets,
|
|
750
732
|
panGesture,
|
|
751
|
-
|
|
752
|
-
gestureDraggingFallback,
|
|
753
|
-
gestureXFallback,
|
|
754
|
-
gestureYFallback,
|
|
755
|
-
normalizedGestureXFallback,
|
|
756
|
-
normalizedGestureYFallback
|
|
733
|
+
getAnimationValuesForScreen
|
|
757
734
|
]);
|
|
758
735
|
};
|
|
759
736
|
var _useScreenAnimation = () => {
|
|
@@ -776,24 +753,36 @@ var createConfig = ({
|
|
|
776
753
|
}) => {
|
|
777
754
|
return {
|
|
778
755
|
focus: (e) => {
|
|
779
|
-
|
|
756
|
+
const parentNavigatorKey = reactNavigation.getParent()?.getState?.()?.key;
|
|
757
|
+
const navigatorKey = reactNavigation.getState().key;
|
|
758
|
+
ScreenStore.updateScreen(e.target, {
|
|
780
759
|
id: e.target,
|
|
781
760
|
name: route.name,
|
|
782
761
|
status: 1,
|
|
783
762
|
closing: false,
|
|
763
|
+
navigatorKey,
|
|
764
|
+
parentNavigatorKey,
|
|
784
765
|
...config
|
|
785
766
|
});
|
|
786
767
|
},
|
|
787
768
|
beforeRemove: (e) => {
|
|
769
|
+
const shouldSkipPreventDefault2 = ScreenStore.shouldSkipPreventDefault(
|
|
770
|
+
e.target,
|
|
771
|
+
reactNavigation.getState()
|
|
772
|
+
);
|
|
773
|
+
if (shouldSkipPreventDefault2) {
|
|
774
|
+
ScreenStore.removeScreen(e.target);
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
788
777
|
e.preventDefault();
|
|
789
778
|
const handleFinish = (finished) => {
|
|
790
779
|
if (!finished) return;
|
|
791
780
|
if (reactNavigation.canGoBack()) {
|
|
792
781
|
reactNavigation.dispatch(e.data?.action);
|
|
793
|
-
|
|
782
|
+
ScreenStore.removeScreen(e.target);
|
|
794
783
|
}
|
|
795
784
|
};
|
|
796
|
-
|
|
785
|
+
ScreenStore.updateScreen(e.target, {
|
|
797
786
|
status: 0,
|
|
798
787
|
closing: true,
|
|
799
788
|
onAnimationFinish: handleFinish
|
|
@@ -803,13 +792,13 @@ var createConfig = ({
|
|
|
803
792
|
};
|
|
804
793
|
|
|
805
794
|
// src/utils/create-transition-component.tsx
|
|
806
|
-
var
|
|
795
|
+
var import_react4 = require("react");
|
|
807
796
|
var import_react_native2 = require("react-native");
|
|
808
797
|
var import_react_native_gesture_handler2 = require("react-native-gesture-handler");
|
|
809
798
|
var import_react_native_reanimated7 = __toESM(require("react-native-reanimated"));
|
|
810
799
|
|
|
811
800
|
// src/hooks/use-skip-first-frame.tsx
|
|
812
|
-
var
|
|
801
|
+
var import_react3 = require("react");
|
|
813
802
|
var import_react_native_reanimated6 = require("react-native-reanimated");
|
|
814
803
|
var useSkipFirstFrame = () => {
|
|
815
804
|
const opacity = (0, import_react_native_reanimated6.useSharedValue)(0);
|
|
@@ -819,7 +808,7 @@ var useSkipFirstFrame = () => {
|
|
|
819
808
|
opacity: opacity.value
|
|
820
809
|
};
|
|
821
810
|
});
|
|
822
|
-
(0,
|
|
811
|
+
(0, import_react3.useEffect)(() => {
|
|
823
812
|
requestAnimationFrame(() => {
|
|
824
813
|
opacity.value = 1;
|
|
825
814
|
});
|
|
@@ -831,7 +820,7 @@ var useSkipFirstFrame = () => {
|
|
|
831
820
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
832
821
|
function createTransitionComponent(Wrapped) {
|
|
833
822
|
const AnimatedComponent = import_react_native_reanimated7.default.createAnimatedComponent(Wrapped);
|
|
834
|
-
const Inner = (0,
|
|
823
|
+
const Inner = (0, import_react4.forwardRef)(
|
|
835
824
|
(props, ref) => {
|
|
836
825
|
const { children, style, ...rest } = props;
|
|
837
826
|
const {
|
|
@@ -877,7 +866,7 @@ function createTransitionComponent(Wrapped) {
|
|
|
877
866
|
}
|
|
878
867
|
);
|
|
879
868
|
Inner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || "Component"})`;
|
|
880
|
-
return (0,
|
|
869
|
+
return (0, import_react4.memo)(Inner);
|
|
881
870
|
}
|
|
882
871
|
|
|
883
872
|
// src/utils/default-screen-options.ts
|