react-native-screen-transitions 1.0.2 → 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/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 import_native2 = require("@react-navigation/native");
225
- var import_react3 = require("react");
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 import_react2 = require("react");
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, import_react2.useSyncExternalStore)(subscribe, () => selector(getState()));
265
+ return (0, import_react.useSyncExternalStore)(subscribe, () => selector(getState()));
337
266
  }
338
267
  Object.assign(useStore, {
339
268
  setState,
@@ -344,54 +273,93 @@ function createVanillaStore(initialState) {
344
273
  return useStore;
345
274
  }
346
275
 
347
- // src/store/index.ts
348
- var useRouteStore = createVanillaStore({
349
- routes: {},
350
- routeKeys: []
351
- });
352
- var RouteStore = {
353
- use: useRouteStore,
354
- updateRoute: (key, value) => {
355
- if (!key) return;
356
- useRouteStore.setState(({ routeKeys, routes }) => {
357
- const currentRoute = routes[key];
358
- if (currentRoute) {
359
- routes[key] = {
360
- ...currentRoute,
361
- ...value
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
  });
387
- },
388
- getPreviousRoute: (key) => {
389
- if (!key) return null;
390
- const index = useRouteStore.getState().routeKeys.indexOf(key);
391
- return index > -1 ? useRouteStore.getState().routes[useRouteStore.getState().routeKeys[index - 1]] : null;
292
+ navigation.dispatch(import_native.StackActions.pop(childScreens.length));
293
+ } else {
294
+ navigation.goBack();
392
295
  }
393
296
  };
394
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
+
395
363
  // src/utils/animate.ts
396
364
  var import_react_native_reanimated2 = require("react-native-reanimated");
397
365
  var animate = (toValue, config, callback) => {
@@ -412,12 +380,12 @@ var animationValues = {
412
380
  normalizedGestureY: {},
413
381
  gestureDragging: {}
414
382
  };
415
- var triggerAnimation = (route) => {
383
+ var triggerAnimation = (screen) => {
416
384
  "worklet";
417
- const { id, closing, status, transitionSpec, onAnimationFinish } = route;
385
+ const { id, closing, status, transitionSpec, onAnimationFinish } = screen;
418
386
  const progressValue = animationValues.screenProgress[id];
419
387
  if (!progressValue && __DEV__) {
420
- console.warn(`Animation values not found for route: ${id}`);
388
+ console.warn(`Animation values not found for screen: ${id}`);
421
389
  return;
422
390
  }
423
391
  const animationConfig = closing ? transitionSpec?.close : transitionSpec?.open;
@@ -429,14 +397,16 @@ var triggerAnimation = (route) => {
429
397
  }
430
398
  });
431
399
  };
432
- RouteStore.use.subscribeWithSelector(
433
- (state) => state.routes,
434
- (currRoutes, prevRoutes) => {
435
- const currKeys = Object.keys(currRoutes);
436
- const prevKeys = Object.keys(prevRoutes);
400
+ ScreenStore.use.subscribeWithSelector(
401
+ (state) => state.screens,
402
+ (currScreens, prevScreens) => {
403
+ const currKeys = Object.keys(currScreens);
404
+ const prevKeys = Object.keys(prevScreens);
437
405
  const incomingKeys = currKeys.filter((k) => !prevKeys.includes(k));
438
406
  const removedKeys = prevKeys.filter((k) => !currKeys.includes(k));
439
- const changedKeys = currKeys.filter((k) => currRoutes[k] !== prevRoutes[k]);
407
+ const changedKeys = currKeys.filter(
408
+ (k) => currScreens[k] !== prevScreens[k]
409
+ );
440
410
  const animatableValues = Object.values(animationValues);
441
411
  for (const incomingKey of incomingKeys) {
442
412
  for (const value of animatableValues) {
@@ -450,9 +420,9 @@ RouteStore.use.subscribeWithSelector(
450
420
  }
451
421
  }
452
422
  for (const changedKey of changedKeys) {
453
- const currentRoute = currRoutes[changedKey];
454
- if (currentRoute) {
455
- triggerAnimation(currentRoute);
423
+ const currentScreen = currScreens[changedKey];
424
+ if (currentScreen) {
425
+ triggerAnimation(currentScreen);
456
426
  }
457
427
  }
458
428
  }
@@ -462,10 +432,11 @@ RouteStore.use.subscribeWithSelector(
462
432
  var import_react_native_gesture_handler = require("react-native-gesture-handler");
463
433
  var import_react_native_reanimated4 = require("react-native-reanimated");
464
434
 
465
- // src/utils/gesture/create-gesture-activation-criteria.ts
466
- var createGestureActivationCriteria = ({
435
+ // src/utils/gesture/apply-gesture-activation-criteria.ts
436
+ var applyGestureActivationCriteria = ({
467
437
  gestureDirection,
468
- gestureResponseDistance
438
+ gestureResponseDistance,
439
+ panGesture
469
440
  }) => {
470
441
  const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
471
442
  if (directions.includes("bidirectional")) {
@@ -522,7 +493,20 @@ var createGestureActivationCriteria = ({
522
493
  } else {
523
494
  result.failOffsetY = [-toleranceY, toleranceY];
524
495
  }
525
- return result;
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;
526
510
  };
527
511
 
528
512
  // src/utils/gesture/map-gesture-to-progress.ts
@@ -538,10 +522,10 @@ var DEFAULT_GESTURE_RESPONSE_DISTANCE = 50;
538
522
  var buildGestureDetector = ({
539
523
  key,
540
524
  progress,
541
- config,
525
+ screenState,
542
526
  width,
543
527
  height,
544
- goBack
528
+ handleDismiss
545
529
  }) => {
546
530
  const _translateX = animationValues.gestureX[key];
547
531
  const _translateY = animationValues.gestureY[key];
@@ -554,7 +538,7 @@ var buildGestureDetector = ({
554
538
  transitionSpec,
555
539
  gestureVelocityImpact = GESTURE_VELOCITY_IMPACT,
556
540
  gestureResponseDistance = DEFAULT_GESTURE_RESPONSE_DISTANCE
557
- } = config;
541
+ } = screenState;
558
542
  const directions = Array.isArray(gestureDirection) ? gestureDirection : [gestureDirection];
559
543
  const panGesture = import_react_native_gesture_handler.Gesture.Pan().enabled(gestureEnabled).onStart(() => {
560
544
  "worklet";
@@ -633,7 +617,7 @@ var buildGestureDetector = ({
633
617
  const spec = shouldDismiss ? transitionSpec?.close : transitionSpec?.open;
634
618
  const onFinish = shouldDismiss ? (isFinished) => {
635
619
  "worklet";
636
- if (isFinished) (0, import_react_native_reanimated4.runOnJS)(goBack)();
620
+ if (isFinished) (0, import_react_native_reanimated4.runOnJS)(handleDismiss)(screenState.id);
637
621
  } : void 0;
638
622
  progress.value = animate(finalProgress, spec, onFinish);
639
623
  _translateX.value = animate(0, spec);
@@ -641,25 +625,12 @@ var buildGestureDetector = ({
641
625
  _normalizedGestureX.value = animate(0, spec);
642
626
  _normalizedGestureY.value = animate(0, spec);
643
627
  });
644
- const criteria = createGestureActivationCriteria({
628
+ applyGestureActivationCriteria({
645
629
  gestureDirection,
646
- gestureResponseDistance
630
+ gestureResponseDistance,
631
+ panGesture
647
632
  });
648
- if (criteria?.activeOffsetX) {
649
- panGesture.activeOffsetX(criteria.activeOffsetX);
650
- }
651
- if (criteria?.activeOffsetY) {
652
- panGesture.activeOffsetY(criteria.activeOffsetY);
653
- }
654
- if (criteria?.failOffsetX) {
655
- panGesture.failOffsetX(criteria.failOffsetX);
656
- }
657
- if (criteria?.failOffsetY) {
658
- panGesture.failOffsetY(criteria.failOffsetY);
659
- }
660
- panGesture.enableTrackpadTwoFingerGesture(true);
661
- const nativeGesture = import_react_native_gesture_handler.Gesture.Native().shouldCancelWhenOutside(false);
662
- return import_react_native_gesture_handler.Gesture.Race(panGesture, nativeGesture);
633
+ return panGesture;
663
634
  };
664
635
 
665
636
  // src/utils/noop-interpolator.ts
@@ -672,42 +643,42 @@ var noopinterpolator = () => {
672
643
  };
673
644
 
674
645
  // src/hooks/use-key.tsx
675
- var import_native = require("@react-navigation/native");
676
- var useKey = () => (0, import_native.useRoute)().key;
646
+ var import_native2 = require("@react-navigation/native");
647
+ var useKey = () => (0, import_native2.useRoute)().key;
677
648
 
678
649
  // src/hooks/use-screen-animation.tsx
679
650
  var useAnimationBuilder = () => {
680
651
  const key = useKey();
681
652
  const dimensions = (0, import_react_native.useWindowDimensions)();
682
653
  const insets = (0, import_react_native_safe_area_context.useSafeAreaInsets)();
683
- const navigation = (0, import_native2.useNavigation)();
684
- const { currentRoute, nextRoute } = RouteStore.use(
685
- useShallow(({ routes, routeKeys }) => {
686
- const current = routes[key];
687
- if (!current) {
688
- return { currentRoute: void 0, nextRoute: void 0 };
689
- }
690
- const currentScreenIndex = current.index;
691
- const nextKey = routeKeys[currentScreenIndex + 1];
692
- const next = nextKey ? routes[nextKey] : void 0;
693
- const isSameNavigator = next?.navigatorKey === current.navigatorKey;
694
- if (!isSameNavigator) {
695
- return {
696
- currentRoute: current,
697
- nextRoute: void 0
698
- };
699
- }
700
- return {
701
- currentRoute: current,
702
- nextRoute: next
703
- };
704
- })
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
+ )
705
676
  );
706
- const panGesture = (0, import_react3.useMemo)(
677
+ const panGesture = (0, import_react2.useMemo)(
707
678
  () => buildGestureDetector({
708
679
  key,
709
680
  progress: animationValues.screenProgress[key],
710
- config: currentRoute || {
681
+ screenState: currentScreen || {
711
682
  id: key,
712
683
  name: key,
713
684
  index: 0,
@@ -716,57 +687,50 @@ var useAnimationBuilder = () => {
716
687
  },
717
688
  width: dimensions.width,
718
689
  height: dimensions.height,
719
- goBack: navigation.goBack
690
+ handleDismiss: (screenBeingDismissed) => {
691
+ ScreenStore.handleScreenDismiss(screenBeingDismissed, navigation);
692
+ }
720
693
  }),
721
- [key, currentRoute, dimensions.width, dimensions.height, navigation.goBack]
694
+ [key, currentScreen, dimensions, navigation]
722
695
  );
723
- const progressFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
724
- const gestureDraggingFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
725
- const gestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
726
- const gestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
727
- const normalizedGestureXFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
728
- const normalizedGestureYFallback = (0, import_react_native_reanimated5.useSharedValue)(0);
729
- return (0, import_react3.useMemo)(() => {
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)(() => {
730
717
  return {
731
- current: {
732
- progress: animationValues.screenProgress[key] || progressFallback,
733
- gesture: {
734
- isDragging: animationValues.gestureDragging[key] || gestureDraggingFallback,
735
- x: animationValues.gestureX[key] || gestureXFallback,
736
- y: animationValues.gestureY[key] || gestureYFallback,
737
- normalizedX: animationValues.normalizedGestureX[key] || normalizedGestureXFallback,
738
- normalizedY: animationValues.normalizedGestureY[key] || normalizedGestureYFallback
739
- }
740
- },
741
- next: nextRoute && animationValues.screenProgress[nextRoute.id] ? {
742
- progress: animationValues.screenProgress[nextRoute.id],
743
- gesture: {
744
- isDragging: animationValues.gestureDragging[nextRoute.id] || gestureDraggingFallback,
745
- x: animationValues.gestureX[nextRoute.id] || gestureXFallback,
746
- y: animationValues.gestureY[nextRoute.id] || gestureYFallback,
747
- normalizedX: animationValues.normalizedGestureX[nextRoute.id] || normalizedGestureXFallback,
748
- normalizedY: animationValues.normalizedGestureY[nextRoute.id] || normalizedGestureYFallback
749
- }
750
- } : void 0,
718
+ current: getAnimationValuesForScreen(key),
719
+ next: actualNextScreen ? getAnimationValuesForScreen(actualNextScreen.id) : void 0,
751
720
  layouts: { screen: dimensions },
752
721
  insets,
753
- closing: currentRoute?.closing || false,
754
- screenStyleInterpolator: nextRoute?.screenStyleInterpolator || currentRoute?.screenStyleInterpolator || noopinterpolator,
722
+ closing: currentScreen?.closing || false,
723
+ screenStyleInterpolator: actualNextScreen?.screenStyleInterpolator || currentScreen?.screenStyleInterpolator || noopinterpolator,
755
724
  gestureDetector: panGesture
756
725
  };
757
726
  }, [
758
727
  key,
759
- currentRoute,
760
- nextRoute,
728
+ currentScreen,
729
+ actualNextScreen,
761
730
  dimensions,
762
731
  insets,
763
732
  panGesture,
764
- progressFallback,
765
- gestureDraggingFallback,
766
- gestureXFallback,
767
- gestureYFallback,
768
- normalizedGestureXFallback,
769
- normalizedGestureYFallback
733
+ getAnimationValuesForScreen
770
734
  ]);
771
735
  };
772
736
  var _useScreenAnimation = () => {
@@ -789,21 +753,25 @@ var createConfig = ({
789
753
  }) => {
790
754
  return {
791
755
  focus: (e) => {
756
+ const parentNavigatorKey = reactNavigation.getParent()?.getState?.()?.key;
792
757
  const navigatorKey = reactNavigation.getState().key;
793
- RouteStore.updateRoute(e.target, {
758
+ ScreenStore.updateScreen(e.target, {
794
759
  id: e.target,
795
760
  name: route.name,
796
761
  status: 1,
797
762
  closing: false,
798
763
  navigatorKey,
764
+ parentNavigatorKey,
799
765
  ...config
800
766
  });
801
767
  },
802
768
  beforeRemove: (e) => {
803
- const navigatorState = reactNavigation.getState();
804
- const isLastScreenInStack = navigatorState.routes.length === 1 && navigatorState.routes[0].key === e.target;
805
- if (isLastScreenInStack) {
806
- RouteStore.removeRoute(e.target);
769
+ const shouldSkipPreventDefault2 = ScreenStore.shouldSkipPreventDefault(
770
+ e.target,
771
+ reactNavigation.getState()
772
+ );
773
+ if (shouldSkipPreventDefault2) {
774
+ ScreenStore.removeScreen(e.target);
807
775
  return;
808
776
  }
809
777
  e.preventDefault();
@@ -811,10 +779,10 @@ var createConfig = ({
811
779
  if (!finished) return;
812
780
  if (reactNavigation.canGoBack()) {
813
781
  reactNavigation.dispatch(e.data?.action);
814
- RouteStore.removeRoute(e.target);
782
+ ScreenStore.removeScreen(e.target);
815
783
  }
816
784
  };
817
- RouteStore.updateRoute(e.target, {
785
+ ScreenStore.updateScreen(e.target, {
818
786
  status: 0,
819
787
  closing: true,
820
788
  onAnimationFinish: handleFinish
@@ -824,13 +792,13 @@ var createConfig = ({
824
792
  };
825
793
 
826
794
  // src/utils/create-transition-component.tsx
827
- var import_react5 = require("react");
795
+ var import_react4 = require("react");
828
796
  var import_react_native2 = require("react-native");
829
797
  var import_react_native_gesture_handler2 = require("react-native-gesture-handler");
830
798
  var import_react_native_reanimated7 = __toESM(require("react-native-reanimated"));
831
799
 
832
800
  // src/hooks/use-skip-first-frame.tsx
833
- var import_react4 = require("react");
801
+ var import_react3 = require("react");
834
802
  var import_react_native_reanimated6 = require("react-native-reanimated");
835
803
  var useSkipFirstFrame = () => {
836
804
  const opacity = (0, import_react_native_reanimated6.useSharedValue)(0);
@@ -840,7 +808,7 @@ var useSkipFirstFrame = () => {
840
808
  opacity: opacity.value
841
809
  };
842
810
  });
843
- (0, import_react4.useEffect)(() => {
811
+ (0, import_react3.useEffect)(() => {
844
812
  requestAnimationFrame(() => {
845
813
  opacity.value = 1;
846
814
  });
@@ -852,7 +820,7 @@ var useSkipFirstFrame = () => {
852
820
  var import_jsx_runtime = require("react/jsx-runtime");
853
821
  function createTransitionComponent(Wrapped) {
854
822
  const AnimatedComponent = import_react_native_reanimated7.default.createAnimatedComponent(Wrapped);
855
- const Inner = (0, import_react5.forwardRef)(
823
+ const Inner = (0, import_react4.forwardRef)(
856
824
  (props, ref) => {
857
825
  const { children, style, ...rest } = props;
858
826
  const {
@@ -898,7 +866,7 @@ function createTransitionComponent(Wrapped) {
898
866
  }
899
867
  );
900
868
  Inner.displayName = `Transition(${Wrapped.displayName || Wrapped.name || "Component"})`;
901
- return (0, import_react5.memo)(Inner);
869
+ return (0, import_react4.memo)(Inner);
902
870
  }
903
871
 
904
872
  // src/utils/default-screen-options.ts