react-native-screen-transitions 3.0.0-rc.2 → 3.0.0-rc.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.
Files changed (152) hide show
  1. package/README.md +421 -371
  2. package/lib/commonjs/blank-stack/components/{Overlay.js → overlay.js} +7 -5
  3. package/lib/commonjs/blank-stack/components/overlay.js.map +1 -0
  4. package/lib/commonjs/blank-stack/components/{Screens.js → screens.js} +8 -10
  5. package/lib/commonjs/blank-stack/components/screens.js.map +1 -0
  6. package/lib/commonjs/blank-stack/components/stack-view.js +95 -0
  7. package/lib/commonjs/blank-stack/components/stack-view.js.map +1 -0
  8. package/lib/commonjs/blank-stack/index.js +1 -8
  9. package/lib/commonjs/blank-stack/index.js.map +1 -1
  10. package/lib/commonjs/blank-stack/navigators/{createBlankStackNavigator.js → create-blank-stack-navigator.js} +3 -3
  11. package/lib/commonjs/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -0
  12. package/lib/commonjs/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.js +1 -11
  13. package/lib/commonjs/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.js.map +1 -1
  14. package/lib/commonjs/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.js +1 -12
  15. package/lib/commonjs/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.js.map +1 -1
  16. package/lib/commonjs/blank-stack/utils/with-stack-navigation/hooks/use-stack-navigation-state.js.map +1 -1
  17. package/lib/commonjs/blank-stack/utils/with-stack-navigation/index.js +49 -55
  18. package/lib/commonjs/blank-stack/utils/with-stack-navigation/index.js.map +1 -1
  19. package/lib/commonjs/blank-stack/utils/with-stack-navigation/{_types.js → types.js} +1 -1
  20. package/lib/commonjs/blank-stack/utils/with-stack-navigation/types.js.map +1 -0
  21. package/lib/commonjs/shared/hooks/animation/use-screen-animation.js +38 -22
  22. package/lib/commonjs/shared/hooks/animation/use-screen-animation.js.map +1 -1
  23. package/lib/commonjs/shared/hooks/gestures/use-build-gestures.js.map +1 -1
  24. package/lib/commonjs/shared/providers/flags.provider.js +25 -0
  25. package/lib/commonjs/shared/providers/flags.provider.js.map +1 -0
  26. package/lib/commonjs/shared/providers/register-bounds.provider.js +71 -45
  27. package/lib/commonjs/shared/providers/register-bounds.provider.js.map +1 -1
  28. package/lib/commonjs/shared/stores/bounds.store.js +91 -47
  29. package/lib/commonjs/shared/stores/bounds.store.js.map +1 -1
  30. package/lib/commonjs/shared/utils/bounds/helpers/is-bounds-equal.js +1 -1
  31. package/lib/commonjs/shared/utils/bounds/helpers/is-bounds-equal.js.map +1 -1
  32. package/lib/commonjs/shared/utils/bounds/index.js +4 -5
  33. package/lib/commonjs/shared/utils/bounds/index.js.map +1 -1
  34. package/lib/commonjs/shared/utils/create-provider.js +20 -1
  35. package/lib/commonjs/shared/utils/create-provider.js.map +1 -1
  36. package/lib/commonjs/shared/utils/reset-stores-for-screen.js +2 -0
  37. package/lib/commonjs/shared/utils/reset-stores-for-screen.js.map +1 -1
  38. package/lib/module/blank-stack/components/{Overlay.js → overlay.js} +7 -5
  39. package/lib/module/blank-stack/components/overlay.js.map +1 -0
  40. package/lib/module/blank-stack/components/{Screens.js → screens.js} +8 -10
  41. package/lib/module/blank-stack/components/screens.js.map +1 -0
  42. package/lib/module/blank-stack/components/stack-view.js +90 -0
  43. package/lib/module/blank-stack/components/stack-view.js.map +1 -0
  44. package/lib/module/blank-stack/index.js +1 -2
  45. package/lib/module/blank-stack/index.js.map +1 -1
  46. package/lib/module/blank-stack/navigators/{createBlankStackNavigator.js → create-blank-stack-navigator.js} +2 -2
  47. package/lib/module/blank-stack/navigators/create-blank-stack-navigator.js.map +1 -0
  48. package/lib/module/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.js +1 -11
  49. package/lib/module/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.js.map +1 -1
  50. package/lib/module/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.js +1 -12
  51. package/lib/module/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.js.map +1 -1
  52. package/lib/module/blank-stack/utils/with-stack-navigation/hooks/use-stack-navigation-state.js.map +1 -1
  53. package/lib/module/blank-stack/utils/with-stack-navigation/index.js +48 -54
  54. package/lib/module/blank-stack/utils/with-stack-navigation/index.js.map +1 -1
  55. package/lib/module/blank-stack/utils/with-stack-navigation/types.js +4 -0
  56. package/lib/module/blank-stack/utils/with-stack-navigation/types.js.map +1 -0
  57. package/lib/module/shared/hooks/animation/use-screen-animation.js +38 -22
  58. package/lib/module/shared/hooks/animation/use-screen-animation.js.map +1 -1
  59. package/lib/module/shared/hooks/gestures/use-build-gestures.js.map +1 -1
  60. package/lib/module/shared/providers/flags.provider.js +19 -0
  61. package/lib/module/shared/providers/flags.provider.js.map +1 -0
  62. package/lib/module/shared/providers/register-bounds.provider.js +71 -45
  63. package/lib/module/shared/providers/register-bounds.provider.js.map +1 -1
  64. package/lib/module/shared/stores/bounds.store.js +91 -47
  65. package/lib/module/shared/stores/bounds.store.js.map +1 -1
  66. package/lib/module/shared/utils/bounds/helpers/is-bounds-equal.js +1 -1
  67. package/lib/module/shared/utils/bounds/helpers/is-bounds-equal.js.map +1 -1
  68. package/lib/module/shared/utils/bounds/index.js +4 -5
  69. package/lib/module/shared/utils/bounds/index.js.map +1 -1
  70. package/lib/module/shared/utils/create-provider.js +20 -1
  71. package/lib/module/shared/utils/create-provider.js.map +1 -1
  72. package/lib/module/shared/utils/reset-stores-for-screen.js +2 -0
  73. package/lib/module/shared/utils/reset-stores-for-screen.js.map +1 -1
  74. package/lib/typescript/blank-stack/components/{Overlay.d.ts → overlay.d.ts} +1 -1
  75. package/lib/typescript/blank-stack/components/overlay.d.ts.map +1 -0
  76. package/lib/typescript/blank-stack/components/{Screens.d.ts → screens.d.ts} +1 -1
  77. package/lib/typescript/blank-stack/components/{Screens.d.ts.map → screens.d.ts.map} +1 -1
  78. package/lib/typescript/blank-stack/components/stack-view.d.ts +3 -0
  79. package/lib/typescript/blank-stack/components/stack-view.d.ts.map +1 -0
  80. package/lib/typescript/blank-stack/index.d.ts +1 -2
  81. package/lib/typescript/blank-stack/index.d.ts.map +1 -1
  82. package/lib/typescript/blank-stack/navigators/{createBlankStackNavigator.d.ts → create-blank-stack-navigator.d.ts} +1 -1
  83. package/lib/typescript/blank-stack/navigators/create-blank-stack-navigator.d.ts.map +1 -0
  84. package/lib/typescript/blank-stack/types.d.ts +4 -0
  85. package/lib/typescript/blank-stack/types.d.ts.map +1 -1
  86. package/lib/typescript/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.d.ts.map +1 -1
  87. package/lib/typescript/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.d.ts.map +1 -1
  88. package/lib/typescript/blank-stack/utils/with-stack-navigation/hooks/use-stack-navigation-state.d.ts +1 -1
  89. package/lib/typescript/blank-stack/utils/with-stack-navigation/hooks/use-stack-navigation-state.d.ts.map +1 -1
  90. package/lib/typescript/blank-stack/utils/with-stack-navigation/index.d.ts +3 -5
  91. package/lib/typescript/blank-stack/utils/with-stack-navigation/index.d.ts.map +1 -1
  92. package/lib/typescript/blank-stack/utils/with-stack-navigation/{_types.d.ts → types.d.ts} +1 -1
  93. package/lib/typescript/blank-stack/utils/with-stack-navigation/types.d.ts.map +1 -0
  94. package/lib/typescript/shared/hooks/animation/use-screen-animation.d.ts.map +1 -1
  95. package/lib/typescript/shared/hooks/gestures/use-build-gestures.d.ts.map +1 -1
  96. package/lib/typescript/shared/index.d.ts +20 -20
  97. package/lib/typescript/shared/providers/flags.provider.d.ts +10 -0
  98. package/lib/typescript/shared/providers/flags.provider.d.ts.map +1 -0
  99. package/lib/typescript/shared/providers/register-bounds.provider.d.ts.map +1 -1
  100. package/lib/typescript/shared/stores/bounds.store.d.ts +23 -11
  101. package/lib/typescript/shared/stores/bounds.store.d.ts.map +1 -1
  102. package/lib/typescript/shared/types/bounds.types.d.ts +2 -2
  103. package/lib/typescript/shared/types/bounds.types.d.ts.map +1 -1
  104. package/lib/typescript/shared/utils/bounds/index.d.ts.map +1 -1
  105. package/lib/typescript/shared/utils/create-provider.d.ts +2 -2
  106. package/lib/typescript/shared/utils/create-provider.d.ts.map +1 -1
  107. package/lib/typescript/shared/utils/reset-stores-for-screen.d.ts.map +1 -1
  108. package/package.json +2 -1
  109. package/src/blank-stack/components/{Overlay.tsx → overlay.tsx} +4 -3
  110. package/src/blank-stack/components/{Screens.tsx → screens.tsx} +7 -9
  111. package/src/blank-stack/components/stack-view.tsx +104 -0
  112. package/src/blank-stack/index.ts +1 -2
  113. package/src/blank-stack/navigators/{createBlankStackNavigator.tsx → create-blank-stack-navigator.tsx} +1 -1
  114. package/src/blank-stack/types.ts +5 -7
  115. package/src/blank-stack/utils/with-stack-navigation/helpers/compose-descriptors.ts +1 -8
  116. package/src/blank-stack/utils/with-stack-navigation/hooks/use-closing-route-keys.tsx +1 -12
  117. package/src/blank-stack/utils/with-stack-navigation/hooks/use-stack-navigation-state.tsx +1 -1
  118. package/src/blank-stack/utils/with-stack-navigation/index.tsx +42 -62
  119. package/src/shared/__tests__/bounds.store.test.ts +398 -167
  120. package/src/shared/__tests__/determine-dismissal.test.ts +2 -12
  121. package/src/shared/__tests__/geometry.test.ts +1 -1
  122. package/src/shared/__tests__/gesture.velocity.test.ts +2 -10
  123. package/src/shared/hooks/animation/use-screen-animation.tsx +55 -29
  124. package/src/shared/hooks/gestures/use-build-gestures.tsx +4 -1
  125. package/src/shared/providers/flags.provider.tsx +21 -0
  126. package/src/shared/providers/register-bounds.provider.tsx +85 -54
  127. package/src/shared/stores/bounds.store.ts +90 -54
  128. package/src/shared/types/bounds.types.ts +2 -2
  129. package/src/shared/utils/bounds/helpers/is-bounds-equal.ts +1 -1
  130. package/src/shared/utils/bounds/index.ts +7 -10
  131. package/src/shared/utils/create-provider.tsx +35 -1
  132. package/src/shared/utils/reset-stores-for-screen.ts +2 -0
  133. package/lib/commonjs/blank-stack/components/Overlay.js.map +0 -1
  134. package/lib/commonjs/blank-stack/components/Screens.js.map +0 -1
  135. package/lib/commonjs/blank-stack/components/StackView.js +0 -93
  136. package/lib/commonjs/blank-stack/components/StackView.js.map +0 -1
  137. package/lib/commonjs/blank-stack/navigators/createBlankStackNavigator.js.map +0 -1
  138. package/lib/commonjs/blank-stack/utils/with-stack-navigation/_types.js.map +0 -1
  139. package/lib/module/blank-stack/components/Overlay.js.map +0 -1
  140. package/lib/module/blank-stack/components/Screens.js.map +0 -1
  141. package/lib/module/blank-stack/components/StackView.js +0 -88
  142. package/lib/module/blank-stack/components/StackView.js.map +0 -1
  143. package/lib/module/blank-stack/navigators/createBlankStackNavigator.js.map +0 -1
  144. package/lib/module/blank-stack/utils/with-stack-navigation/_types.js +0 -4
  145. package/lib/module/blank-stack/utils/with-stack-navigation/_types.js.map +0 -1
  146. package/lib/typescript/blank-stack/components/Overlay.d.ts.map +0 -1
  147. package/lib/typescript/blank-stack/components/StackView.d.ts +0 -2
  148. package/lib/typescript/blank-stack/components/StackView.d.ts.map +0 -1
  149. package/lib/typescript/blank-stack/navigators/createBlankStackNavigator.d.ts.map +0 -1
  150. package/lib/typescript/blank-stack/utils/with-stack-navigation/_types.d.ts.map +0 -1
  151. package/src/blank-stack/components/StackView.tsx +0 -108
  152. /package/src/blank-stack/utils/with-stack-navigation/{_types.ts → types.ts} +0 -0
@@ -0,0 +1,104 @@
1
+ import { SafeAreaProviderCompat } from "@react-navigation/elements";
2
+ import {
3
+ NavigationContext,
4
+ NavigationRouteContext,
5
+ } from "@react-navigation/native";
6
+ import * as React from "react";
7
+ import { StyleSheet } from "react-native";
8
+ import { GestureHandlerRootView } from "react-native-gesture-handler";
9
+ import { ScreenContainer } from "react-native-screens";
10
+ import { BlankStackScreenLifecycleController } from "../../shared/components/controllers/screen-lifecycle";
11
+ import { FlagsProvider } from "../../shared/providers/flags.provider";
12
+ import { ScreenTransitionProvider } from "../../shared/providers/screen-transition.provider";
13
+ import type { BlankStackDescriptor } from "../types";
14
+ import { withStackNavigationProvider } from "../utils/with-stack-navigation";
15
+ import { Overlay } from "./overlay";
16
+ import { Screen } from "./screens";
17
+
18
+ function isFabric() {
19
+ return "nativeFabricUIManager" in global;
20
+ }
21
+
22
+ type SceneViewProps = {
23
+ descriptor: BlankStackDescriptor;
24
+ };
25
+
26
+ const SceneView = React.memo(({ descriptor }: SceneViewProps) => {
27
+ const { route, navigation, render } = descriptor;
28
+
29
+ return (
30
+ <NavigationContext.Provider value={navigation}>
31
+ <NavigationRouteContext.Provider value={route}>
32
+ {descriptor.options.overlayMode === "screen" && <Overlay.Screen />}
33
+ {render()}
34
+ </NavigationRouteContext.Provider>
35
+ </NavigationContext.Provider>
36
+ );
37
+ });
38
+
39
+ export const StackView = withStackNavigationProvider(
40
+ ({
41
+ activeScreensLimit,
42
+ descriptors,
43
+ focusedIndex,
44
+ routes,
45
+ scenes,
46
+ shouldShowFloatOverlay,
47
+ }) => {
48
+ return (
49
+ <FlagsProvider TRANSITIONS_ALWAYS_ON>
50
+ <GestureHandlerRootView>
51
+ <SafeAreaProviderCompat>
52
+ {shouldShowFloatOverlay ? <Overlay.Float /> : null}
53
+ <ScreenContainer style={styles.container}>
54
+ {scenes.map((scene, sceneIndex) => {
55
+ const descriptor = scene.descriptor;
56
+ const route = scene.route;
57
+ const isFocused = focusedIndex === sceneIndex;
58
+ const isBelowFocused = focusedIndex - 1 === sceneIndex;
59
+
60
+ const previousDescriptor =
61
+ scenes[sceneIndex - 1]?.descriptor ?? undefined;
62
+ const nextDescriptor =
63
+ scenes[sceneIndex + 1]?.descriptor ?? undefined;
64
+
65
+ const isPreloaded = descriptors[route.key] === undefined;
66
+
67
+ // On Fabric, when screen is frozen, animated and reanimated values are not updated
68
+ // due to component being unmounted. To avoid this, we don't freeze the previous screen there
69
+ const shouldFreeze = isFabric()
70
+ ? !isPreloaded && !isFocused && !isBelowFocused
71
+ : !isPreloaded && !isFocused;
72
+ return (
73
+ <Screen
74
+ key={route.key}
75
+ isPreloaded={isPreloaded}
76
+ index={sceneIndex}
77
+ activeScreensLimit={activeScreensLimit}
78
+ routeKey={route.key}
79
+ routesLength={routes.length}
80
+ shouldFreeze={shouldFreeze}
81
+ freezeOnBlur={descriptor.options.freezeOnBlur}
82
+ >
83
+ <ScreenTransitionProvider
84
+ previous={previousDescriptor}
85
+ current={descriptor}
86
+ next={nextDescriptor}
87
+ LifecycleController={BlankStackScreenLifecycleController}
88
+ >
89
+ <SceneView key={route.key} descriptor={descriptor} />
90
+ </ScreenTransitionProvider>
91
+ </Screen>
92
+ );
93
+ })}
94
+ </ScreenContainer>
95
+ </SafeAreaProviderCompat>
96
+ </GestureHandlerRootView>
97
+ </FlagsProvider>
98
+ );
99
+ },
100
+ );
101
+
102
+ const styles = StyleSheet.create({
103
+ container: { flex: 1 },
104
+ });
@@ -1,5 +1,4 @@
1
- export { useOverlayAnimation } from "../blank-stack/hooks/use-overlay-animation";
2
- export { createBlankStackNavigator } from "../blank-stack/navigators/createBlankStackNavigator";
1
+ export { createBlankStackNavigator } from "../blank-stack/navigators/create-blank-stack-navigator";
3
2
  export type {
4
3
  BlankStackNavigationEventMap,
5
4
  BlankStackNavigationOptions,
@@ -13,7 +13,7 @@ import {
13
13
  useNavigationBuilder,
14
14
  } from "@react-navigation/native";
15
15
  import * as React from "react";
16
- import { StackView } from "../components/StackView";
16
+ import { StackView } from "../components/stack-view";
17
17
  import type {
18
18
  BlankStackNavigationEventMap,
19
19
  BlankStackNavigationOptions,
@@ -12,18 +12,11 @@ import type {
12
12
  Theme,
13
13
  } from "@react-navigation/native";
14
14
  import type { DerivedValue } from "react-native-reanimated";
15
- import type { ScreenProps } from "react-native-screens";
16
15
  import type { ScreenTransitionConfig } from "../shared";
17
16
  import type {
18
17
  OverlayInterpolationProps,
19
18
  ScreenInterpolationProps,
20
- ScreenStyleInterpolator,
21
- TransitionSpec,
22
19
  } from "../shared/types/animation.types";
23
- import type {
24
- GestureActivationArea,
25
- GestureDirection,
26
- } from "../shared/types/gesture.types";
27
20
 
28
21
  export type BlankStackNavigationEventMap = {
29
22
  /**
@@ -104,6 +97,11 @@ export type BlankStackOverlayProps = {
104
97
  */
105
98
  focusedIndex: number;
106
99
 
100
+ /**
101
+ * All routes currently in the stack.
102
+ */
103
+ routes: Route<string>[];
104
+
107
105
  /**
108
106
  * Options passed to the overlay component.
109
107
  */
@@ -9,15 +9,8 @@ export const composeDescriptors = (
9
9
  const composed: BlankStackDescriptorMap = {};
10
10
 
11
11
  for (const route of routes) {
12
- const adjusted =
12
+ composed[route.key] =
13
13
  nextDescriptors[route.key] ?? currentDescriptors[route.key];
14
-
15
- // useScreenAnimation depends on this, however with blank-stack, this should be enabled by default
16
- const withEnableTransitions = {
17
- ...adjusted,
18
- options: { ...adjusted.options, enableTransitions: true },
19
- };
20
- composed[route.key] = withEnableTransitions;
21
14
  }
22
15
 
23
16
  return composed;
@@ -4,7 +4,6 @@ import useStableCallback from "../../../../shared/hooks/use-stable-callback";
4
4
 
5
5
  export const useClosingRouteKeys = () => {
6
6
  const keysRef = useRef<Set<string>>(new Set());
7
- const finishedRef = useRef<Set<string>>(new Set());
8
7
  const shared = useSharedValue<string[]>([]);
9
8
 
10
9
  const add = useStableCallback((key: string) => {
@@ -13,7 +12,6 @@ export const useClosingRouteKeys = () => {
13
12
  return;
14
13
  }
15
14
 
16
- finishedRef.current.delete(key);
17
15
  keys.add(key);
18
16
  shared.modify((prev) => {
19
17
  "worklet";
@@ -26,12 +24,8 @@ export const useClosingRouteKeys = () => {
26
24
 
27
25
  const remove = useStableCallback((key: string) => {
28
26
  const keys = keysRef.current;
29
- if (!keys.delete(key)) {
30
- finishedRef.current.delete(key);
31
- return;
32
- }
27
+ keys.delete(key);
33
28
 
34
- finishedRef.current.delete(key);
35
29
  shared.modify((prev) => {
36
30
  "worklet";
37
31
  const index = prev.indexOf(key);
@@ -44,13 +38,8 @@ export const useClosingRouteKeys = () => {
44
38
 
45
39
  const clear = useStableCallback(() => {
46
40
  const keys = keysRef.current;
47
- if (!keys.size) {
48
- finishedRef.current.clear();
49
- return;
50
- }
51
41
 
52
42
  keys.clear();
53
- finishedRef.current.clear();
54
43
  shared.modify((prev) => {
55
44
  "worklet";
56
45
  prev.length = 0;
@@ -2,11 +2,11 @@ import { type Route, StackActions } from "@react-navigation/native";
2
2
  import { useLayoutEffect, useState } from "react";
3
3
  import useStableCallback from "../../../../shared/hooks/use-stable-callback";
4
4
  import type { BlankStackDescriptorMap } from "../../../types";
5
- import type { StackNavigationContextProps } from "../_types";
6
5
  import { areDescriptorsEqual } from "../helpers/are-descriptors-equal";
7
6
  import { composeDescriptors } from "../helpers/compose-descriptors";
8
7
  import { haveSameRouteKeys } from "../helpers/have-same-route-keys";
9
8
  import { routesAreIdentical } from "../helpers/routes-are-identical";
9
+ import type { StackNavigationContextProps } from "../types";
10
10
  import { useClosingRouteKeys } from "./use-closing-route-keys";
11
11
  import { usePrevious } from "./use-previous";
12
12
 
@@ -1,45 +1,50 @@
1
- import { type ComponentType, createContext, useContext, useMemo } from "react";
1
+ import { useMemo } from "react";
2
+ import createProvider from "../../../shared/utils/create-provider";
2
3
  import type { BlankStackScene } from "../../types";
4
+ import { calculateActiveScreensLimit } from "./helpers/calculate-active-screens-limit";
3
5
  import { useStackNavigationState } from "./hooks/use-stack-navigation-state";
4
6
  import type {
5
7
  StackNavigationContextProps,
6
8
  StackNavigationContextValue,
7
- } from "./_types";
8
- import { calculateActiveScreensLimit } from "./helpers/calculate-active-screens-limit";
9
-
10
- export const StackNavigationContext =
11
- createContext<StackNavigationContextValue | null>(null);
9
+ } from "./types";
12
10
 
13
- export function withStackNavigationProvider(
14
- Component: ComponentType<StackNavigationContextValue>,
15
- ) {
16
- return function StackNavigationWrapper(props: StackNavigationContextProps) {
11
+ const { withStackNavigationProvider, useStackNavigationContext } =
12
+ createProvider("StackNavigation")<
13
+ StackNavigationContextProps,
14
+ StackNavigationContextValue
15
+ >((props) => {
17
16
  const { state, handleCloseRoute, closingRouteKeys } =
18
17
  useStackNavigationState(props);
19
18
 
20
- const scenes = useMemo(() => {
21
- return state.routes.reduce((acc, route) => {
22
- acc.push({
23
- route,
24
- descriptor: state.descriptors[route.key],
25
- });
26
- return acc;
27
- }, [] as BlankStackScene[]);
28
- }, [state.routes, state.descriptors]);
29
-
30
- const activeScreensLimit = useMemo(() => {
31
- return calculateActiveScreensLimit(state.routes, state.descriptors);
32
- }, [state.routes, state.descriptors]);
33
-
34
- const shouldShowFloatOverlay = useMemo(() => {
35
- return state.routes.some((route) => {
36
- const options = state.descriptors[route.key]?.options;
37
- return options?.overlayMode === "float" && options?.overlayShown;
38
- });
39
- }, [state.routes, state.descriptors]);
40
-
41
- const contextValue = useMemo<StackNavigationContextValue>(() => {
42
- return {
19
+ const { scenes, activeScreensLimit, shouldShowFloatOverlay } =
20
+ useMemo(() => {
21
+ const scenes: BlankStackScene[] = [];
22
+ let shouldShowFloatOverlay = false;
23
+
24
+ for (const route of state.routes) {
25
+ const descriptor = state.descriptors[route.key];
26
+ scenes.push({ route, descriptor });
27
+
28
+ if (!shouldShowFloatOverlay) {
29
+ const options = descriptor?.options;
30
+ shouldShowFloatOverlay =
31
+ options?.overlayMode === "float" &&
32
+ options?.overlayShown === true;
33
+ }
34
+ }
35
+
36
+ return {
37
+ scenes,
38
+ activeScreensLimit: calculateActiveScreensLimit(
39
+ state.routes,
40
+ state.descriptors,
41
+ ),
42
+ shouldShowFloatOverlay,
43
+ };
44
+ }, [state.routes, state.descriptors]);
45
+
46
+ return {
47
+ value: {
43
48
  routes: state.routes,
44
49
  focusedIndex: props.state.index,
45
50
  descriptors: state.descriptors,
@@ -48,33 +53,8 @@ export function withStackNavigationProvider(
48
53
  handleCloseRoute,
49
54
  scenes,
50
55
  shouldShowFloatOverlay,
51
- };
52
- }, [
53
- state,
54
- scenes,
55
- activeScreensLimit,
56
- closingRouteKeys,
57
- handleCloseRoute,
58
- props.state.index,
59
- shouldShowFloatOverlay,
60
- ]);
61
-
62
- return (
63
- <StackNavigationContext.Provider value={contextValue}>
64
- <Component {...contextValue} />
65
- </StackNavigationContext.Provider>
66
- );
67
- };
68
- }
69
-
70
- export const useStackNavigationContext = () => {
71
- const context = useContext(StackNavigationContext);
72
-
73
- if (!context) {
74
- throw new Error(
75
- "StackNavigationContext.Provider is missing in the component tree.",
76
- );
77
- }
56
+ },
57
+ };
58
+ });
78
59
 
79
- return context;
80
- };
60
+ export { useStackNavigationContext, withStackNavigationProvider };