@react-navigation/native-stack 7.0.0-rc.3 → 7.0.0-rc.30

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 (142) hide show
  1. package/lib/commonjs/index.js +2 -2
  2. package/lib/commonjs/navigators/createNativeStackNavigator.js +11 -6
  3. package/lib/commonjs/navigators/createNativeStackNavigator.js.map +1 -1
  4. package/lib/commonjs/package.json +1 -0
  5. package/lib/commonjs/utils/debounce.js.map +1 -1
  6. package/lib/commonjs/views/FooterComponent.js +19 -0
  7. package/lib/commonjs/views/FooterComponent.js.map +1 -0
  8. package/lib/commonjs/views/NativeStackView.js +106 -106
  9. package/lib/commonjs/views/NativeStackView.js.map +1 -1
  10. package/lib/commonjs/views/NativeStackView.native.js +221 -219
  11. package/lib/commonjs/views/NativeStackView.native.js.map +1 -1
  12. package/lib/commonjs/views/{HeaderConfig.js → useHeaderConfigProps.js} +84 -43
  13. package/lib/commonjs/views/useHeaderConfigProps.js.map +1 -0
  14. package/lib/module/index.js +4 -2
  15. package/lib/module/index.js.map +1 -1
  16. package/lib/module/navigators/createNativeStackNavigator.js +13 -6
  17. package/lib/module/navigators/createNativeStackNavigator.js.map +1 -1
  18. package/lib/module/package.json +1 -0
  19. package/lib/module/types.js +2 -0
  20. package/lib/module/utils/debounce.js +2 -0
  21. package/lib/module/utils/debounce.js.map +1 -1
  22. package/lib/module/utils/getModalRoutesKeys.js +2 -0
  23. package/lib/module/utils/getModalRoutesKeys.js.map +1 -1
  24. package/lib/module/utils/useAnimatedHeaderHeight.js +2 -0
  25. package/lib/module/utils/useAnimatedHeaderHeight.js.map +1 -1
  26. package/lib/module/utils/useDismissedRouteError.js +2 -0
  27. package/lib/module/utils/useDismissedRouteError.js.map +1 -1
  28. package/lib/module/utils/useInvalidPreventRemoveError.js +2 -0
  29. package/lib/module/utils/useInvalidPreventRemoveError.js.map +1 -1
  30. package/lib/module/views/FontProcessor.js +2 -0
  31. package/lib/module/views/FontProcessor.js.map +1 -1
  32. package/lib/module/views/FontProcessor.native.js +2 -0
  33. package/lib/module/views/FontProcessor.native.js.map +1 -1
  34. package/lib/module/views/FooterComponent.js +14 -0
  35. package/lib/module/views/FooterComponent.js.map +1 -0
  36. package/lib/module/views/NativeStackView.js +110 -108
  37. package/lib/module/views/NativeStackView.js.map +1 -1
  38. package/lib/module/views/NativeStackView.native.js +224 -219
  39. package/lib/module/views/NativeStackView.native.js.map +1 -1
  40. package/lib/module/views/{HeaderConfig.js → useHeaderConfigProps.js} +86 -41
  41. package/lib/module/views/useHeaderConfigProps.js.map +1 -0
  42. package/lib/typescript/commonjs/package.json +1 -0
  43. package/lib/typescript/{src → commonjs/src}/index.d.ts +1 -1
  44. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  45. package/lib/typescript/{src → commonjs/src}/navigators/createNativeStackNavigator.d.ts +3 -4
  46. package/lib/typescript/commonjs/src/navigators/createNativeStackNavigator.d.ts.map +1 -0
  47. package/lib/typescript/{src → commonjs/src}/types.d.ts +112 -34
  48. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  49. package/lib/typescript/commonjs/src/utils/debounce.d.ts.map +1 -0
  50. package/lib/typescript/commonjs/src/utils/getModalRoutesKeys.d.ts.map +1 -0
  51. package/lib/typescript/commonjs/src/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
  52. package/lib/typescript/commonjs/src/utils/useDismissedRouteError.d.ts.map +1 -0
  53. package/lib/typescript/commonjs/src/utils/useInvalidPreventRemoveError.d.ts.map +1 -0
  54. package/lib/typescript/commonjs/src/views/FontProcessor.d.ts.map +1 -0
  55. package/lib/typescript/commonjs/src/views/FontProcessor.native.d.ts.map +1 -0
  56. package/lib/typescript/commonjs/src/views/FooterComponent.d.ts +7 -0
  57. package/lib/typescript/commonjs/src/views/FooterComponent.d.ts.map +1 -0
  58. package/lib/typescript/commonjs/src/views/NativeStackView.d.ts +11 -0
  59. package/lib/typescript/commonjs/src/views/NativeStackView.d.ts.map +1 -0
  60. package/lib/typescript/commonjs/src/views/NativeStackView.native.d.ts +11 -0
  61. package/lib/typescript/commonjs/src/views/NativeStackView.native.d.ts.map +1 -0
  62. package/lib/typescript/commonjs/src/views/useHeaderConfigProps.d.ts +41 -0
  63. package/lib/typescript/commonjs/src/views/useHeaderConfigProps.d.ts.map +1 -0
  64. package/lib/typescript/commonjs/tsconfig.build.tsbuildinfo +1 -0
  65. package/lib/typescript/module/package.json +1 -0
  66. package/lib/typescript/module/src/index.d.ts +17 -0
  67. package/lib/typescript/module/src/index.d.ts.map +1 -0
  68. package/lib/typescript/module/src/navigators/createNativeStackNavigator.d.ts +16 -0
  69. package/lib/typescript/module/src/navigators/createNativeStackNavigator.d.ts.map +1 -0
  70. package/lib/typescript/module/src/types.d.ts +623 -0
  71. package/lib/typescript/module/src/types.d.ts.map +1 -0
  72. package/lib/typescript/module/src/utils/debounce.d.ts +2 -0
  73. package/lib/typescript/module/src/utils/debounce.d.ts.map +1 -0
  74. package/lib/typescript/module/src/utils/getModalRoutesKeys.d.ts +4 -0
  75. package/lib/typescript/module/src/utils/getModalRoutesKeys.d.ts.map +1 -0
  76. package/lib/typescript/module/src/utils/useAnimatedHeaderHeight.d.ts +5 -0
  77. package/lib/typescript/module/src/utils/useAnimatedHeaderHeight.d.ts.map +1 -0
  78. package/lib/typescript/module/src/utils/useDismissedRouteError.d.ts +6 -0
  79. package/lib/typescript/module/src/utils/useDismissedRouteError.d.ts.map +1 -0
  80. package/lib/typescript/module/src/utils/useInvalidPreventRemoveError.d.ts +3 -0
  81. package/lib/typescript/module/src/utils/useInvalidPreventRemoveError.d.ts.map +1 -0
  82. package/lib/typescript/module/src/views/FontProcessor.d.ts +2 -0
  83. package/lib/typescript/module/src/views/FontProcessor.d.ts.map +1 -0
  84. package/lib/typescript/module/src/views/FontProcessor.native.d.ts +2 -0
  85. package/lib/typescript/module/src/views/FontProcessor.native.d.ts.map +1 -0
  86. package/lib/typescript/module/src/views/FooterComponent.d.ts +7 -0
  87. package/lib/typescript/module/src/views/FooterComponent.d.ts.map +1 -0
  88. package/lib/typescript/module/src/views/NativeStackView.d.ts +11 -0
  89. package/lib/typescript/module/src/views/NativeStackView.d.ts.map +1 -0
  90. package/lib/typescript/module/src/views/NativeStackView.native.d.ts +11 -0
  91. package/lib/typescript/module/src/views/NativeStackView.native.d.ts.map +1 -0
  92. package/lib/typescript/module/src/views/useHeaderConfigProps.d.ts +41 -0
  93. package/lib/typescript/module/src/views/useHeaderConfigProps.d.ts.map +1 -0
  94. package/lib/typescript/module/tsconfig.build.tsbuildinfo +1 -0
  95. package/package.json +41 -18
  96. package/src/index.tsx +2 -0
  97. package/src/navigators/createNativeStackNavigator.tsx +6 -7
  98. package/src/types.tsx +106 -34
  99. package/src/utils/debounce.tsx +1 -1
  100. package/src/views/FooterComponent.tsx +10 -0
  101. package/src/views/NativeStackView.native.tsx +167 -202
  102. package/src/views/NativeStackView.tsx +62 -50
  103. package/src/views/{HeaderConfig.tsx → useHeaderConfigProps.tsx} +80 -68
  104. package/lib/commonjs/views/DebugContainer.js +0 -19
  105. package/lib/commonjs/views/DebugContainer.js.map +0 -1
  106. package/lib/commonjs/views/DebugContainer.native.js +0 -42
  107. package/lib/commonjs/views/DebugContainer.native.js.map +0 -1
  108. package/lib/commonjs/views/HeaderConfig.js.map +0 -1
  109. package/lib/module/views/DebugContainer.js +0 -11
  110. package/lib/module/views/DebugContainer.js.map +0 -1
  111. package/lib/module/views/DebugContainer.native.js +0 -33
  112. package/lib/module/views/DebugContainer.native.js.map +0 -1
  113. package/lib/module/views/HeaderConfig.js.map +0 -1
  114. package/lib/typescript/src/index.d.ts.map +0 -1
  115. package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts.map +0 -1
  116. package/lib/typescript/src/types.d.ts.map +0 -1
  117. package/lib/typescript/src/utils/debounce.d.ts.map +0 -1
  118. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts.map +0 -1
  119. package/lib/typescript/src/utils/useAnimatedHeaderHeight.d.ts.map +0 -1
  120. package/lib/typescript/src/utils/useDismissedRouteError.d.ts.map +0 -1
  121. package/lib/typescript/src/utils/useInvalidPreventRemoveError.d.ts.map +0 -1
  122. package/lib/typescript/src/views/DebugContainer.d.ts +0 -10
  123. package/lib/typescript/src/views/DebugContainer.d.ts.map +0 -1
  124. package/lib/typescript/src/views/DebugContainer.native.d.ts +0 -15
  125. package/lib/typescript/src/views/DebugContainer.native.d.ts.map +0 -1
  126. package/lib/typescript/src/views/FontProcessor.d.ts.map +0 -1
  127. package/lib/typescript/src/views/FontProcessor.native.d.ts.map +0 -1
  128. package/lib/typescript/src/views/HeaderConfig.d.ts +0 -11
  129. package/lib/typescript/src/views/HeaderConfig.d.ts.map +0 -1
  130. package/lib/typescript/src/views/NativeStackView.d.ts +0 -11
  131. package/lib/typescript/src/views/NativeStackView.d.ts.map +0 -1
  132. package/lib/typescript/src/views/NativeStackView.native.d.ts +0 -11
  133. package/lib/typescript/src/views/NativeStackView.native.d.ts.map +0 -1
  134. package/src/views/DebugContainer.native.tsx +0 -36
  135. package/src/views/DebugContainer.tsx +0 -14
  136. /package/lib/typescript/{src → commonjs/src}/utils/debounce.d.ts +0 -0
  137. /package/lib/typescript/{src → commonjs/src}/utils/getModalRoutesKeys.d.ts +0 -0
  138. /package/lib/typescript/{src → commonjs/src}/utils/useAnimatedHeaderHeight.d.ts +0 -0
  139. /package/lib/typescript/{src → commonjs/src}/utils/useDismissedRouteError.d.ts +0 -0
  140. /package/lib/typescript/{src → commonjs/src}/utils/useInvalidPreventRemoveError.d.ts +0 -0
  141. /package/lib/typescript/{src → commonjs/src}/views/FontProcessor.d.ts +0 -0
  142. /package/lib/typescript/{src → commonjs/src}/views/FontProcessor.native.d.ts +0 -0
@@ -10,64 +10,17 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _reactNative = require("react-native");
11
11
  var _reactNativeSafeAreaContext = require("react-native-safe-area-context");
12
12
  var _reactNativeScreens = require("react-native-screens");
13
- var _warnOnce = _interopRequireDefault(require("warn-once"));
14
- var _debounce = require("../utils/debounce");
15
- var _getModalRoutesKeys = require("../utils/getModalRoutesKeys");
16
- var _useAnimatedHeaderHeight = require("../utils/useAnimatedHeaderHeight");
17
- var _useDismissedRouteError = require("../utils/useDismissedRouteError");
18
- var _useInvalidPreventRemoveError = require("../utils/useInvalidPreventRemoveError");
19
- var _DebugContainer = require("./DebugContainer");
20
- var _HeaderConfig = require("./HeaderConfig");
21
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
+ var _debounce = require("../utils/debounce.js");
14
+ var _getModalRoutesKeys = require("../utils/getModalRoutesKeys.js");
15
+ var _useAnimatedHeaderHeight = require("../utils/useAnimatedHeaderHeight.js");
16
+ var _useDismissedRouteError = require("../utils/useDismissedRouteError.js");
17
+ var _useInvalidPreventRemoveError = require("../utils/useInvalidPreventRemoveError.js");
18
+ var _FooterComponent = require("./FooterComponent.js");
19
+ var _useHeaderConfigProps = require("./useHeaderConfigProps.js");
20
+ var _jsxRuntime = require("react/jsx-runtime");
22
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
23
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
24
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
25
- const isAndroid = _reactNative.Platform.OS === 'android';
26
- const MaybeNestedStack = ({
27
- options,
28
- route,
29
- presentation,
30
- headerHeight,
31
- headerTopInsetEnabled,
32
- children
33
- }) => {
34
- const {
35
- colors
36
- } = (0, _native.useTheme)();
37
- const {
38
- header,
39
- headerShown = true,
40
- contentStyle
41
- } = options;
42
- const isHeaderInModal = isAndroid ? false : presentation !== 'card' && headerShown === true && header === undefined;
43
- const headerShownPreviousRef = React.useRef(headerShown);
44
- React.useEffect(() => {
45
- (0, _warnOnce.default)(!isAndroid && presentation !== 'card' && headerShownPreviousRef.current !== headerShown, `Dynamically changing 'headerShown' in modals will result in remounting the screen and losing all local state. See options for the screen '${route.name}'.`);
46
- headerShownPreviousRef.current = headerShown;
47
- }, [headerShown, presentation, route.name]);
48
- const content = /*#__PURE__*/React.createElement(_DebugContainer.DebugContainer, {
49
- style: [styles.container, presentation !== 'transparentModal' && presentation !== 'containedTransparentModal' && {
50
- backgroundColor: colors.background
51
- }, contentStyle],
52
- stackPresentation: presentation === 'card' ? 'push' : presentation
53
- }, children);
54
- if (isHeaderInModal) {
55
- return /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStack, {
56
- style: styles.container
57
- }, /*#__PURE__*/React.createElement(_reactNativeScreens.Screen, {
58
- enabled: true,
59
- isNativeStack: true,
60
- hasLargeHeader: options.headerLargeTitle ?? false,
61
- style: _reactNative.StyleSheet.absoluteFill
62
- }, content, /*#__PURE__*/React.createElement(_HeaderConfig.HeaderConfig, _extends({}, options, {
63
- route: route,
64
- headerHeight: headerHeight,
65
- headerTopInsetEnabled: headerTopInsetEnabled,
66
- canGoBack: true
67
- }))));
68
- }
69
- return content;
70
- };
23
+ const ANDROID_DEFAULT_HEADER_HEIGHT = 56;
71
24
  const SceneView = ({
72
25
  index,
73
26
  focused,
@@ -75,6 +28,7 @@ const SceneView = ({
75
28
  previousDescriptor,
76
29
  nextDescriptor,
77
30
  isPresentationModal,
31
+ isPreloaded,
78
32
  onWillDisappear,
79
33
  onWillAppear,
80
34
  onAppear,
@@ -82,7 +36,8 @@ const SceneView = ({
82
36
  onDismissed,
83
37
  onHeaderBackButtonClicked,
84
38
  onNativeDismissCancelled,
85
- onGestureCancel
39
+ onGestureCancel,
40
+ onSheetDetentChanged
86
41
  }) => {
87
42
  const {
88
43
  route,
@@ -99,6 +54,7 @@ const SceneView = ({
99
54
  const {
100
55
  animationDuration,
101
56
  animationTypeForReplace = 'push',
57
+ fullScreenGestureShadowEnabled = false,
102
58
  gestureEnabled,
103
59
  gestureDirection = presentation === 'card' ? 'horizontal' : 'vertical',
104
60
  gestureResponseDistance,
@@ -113,17 +69,21 @@ const SceneView = ({
113
69
  navigationBarTranslucent,
114
70
  navigationBarHidden,
115
71
  orientation,
116
- sheetAllowedDetents = 'large',
117
- sheetLargestUndimmedDetent = 'all',
72
+ sheetAllowedDetents = [1.0],
73
+ sheetLargestUndimmedDetentIndex = -1,
118
74
  sheetGrabberVisible = false,
119
75
  sheetCornerRadius = -1.0,
76
+ sheetElevation = 24,
120
77
  sheetExpandsWhenScrolledToEdge = true,
78
+ sheetInitialDetentIndex = 0,
121
79
  statusBarAnimation,
122
80
  statusBarHidden,
123
81
  statusBarStyle,
124
82
  statusBarTranslucent,
125
83
  statusBarBackgroundColor,
126
- freezeOnBlur
84
+ unstable_sheetFooter = null,
85
+ freezeOnBlur,
86
+ contentStyle
127
87
  } = options;
128
88
  if (gestureDirection === 'vertical' && _reactNative.Platform.OS === 'ios') {
129
89
  // for `vertical` direction to work, we need to set `fullScreenGestureEnabled` to `true`
@@ -151,6 +111,9 @@ const SceneView = ({
151
111
  // for navigator with first screen as `modal` and the next as `card`
152
112
  presentation = 'card';
153
113
  }
114
+ const {
115
+ colors
116
+ } = (0, _native.useTheme)();
154
117
  const insets = (0, _reactNativeSafeAreaContext.useSafeAreaInsets)();
155
118
  const frame = (0, _reactNativeSafeAreaContext.useSafeAreaFrame)();
156
119
 
@@ -171,7 +134,7 @@ const SceneView = ({
171
134
  // FIXME: Currently screens isn't using Material 3
172
135
  // So our `getDefaultHeaderHeight` doesn't return the correct value
173
136
  // So we hardcode the value here for now until screens is updated
174
- android: 56 + topInset,
137
+ android: ANDROID_DEFAULT_HEADER_HEIGHT + topInset,
175
138
  default: (0, _elements.getDefaultHeaderHeight)(frame, isModal, topInset)
176
139
  });
177
140
  const [headerHeight, setHeaderHeight] = React.useState(defaultHeaderHeight);
@@ -182,7 +145,7 @@ const SceneView = ({
182
145
  (0, _debounce.debounce)(setHeaderHeight, 100), []);
183
146
  const hasCustomHeader = header !== undefined;
184
147
  let headerHeightCorrectionOffset = 0;
185
- if (isAndroid && !hasCustomHeader) {
148
+ if (_reactNative.Platform.OS === 'android' && !hasCustomHeader) {
186
149
  const statusBarHeight = _reactNative.StatusBar.currentHeight ?? 0;
187
150
 
188
151
  // FIXME: On Android, the native header height is not correctly calculated
@@ -201,30 +164,45 @@ const SceneView = ({
201
164
  // we apply additional padding in header only if its true.
202
165
  // For more details see: https://github.com/react-navigation/react-navigation/pull/12014
203
166
  const headerTopInsetEnabled = typeof statusBarTranslucent === 'boolean' ? statusBarTranslucent : topInset !== 0;
167
+ const canGoBack = previousDescriptor != null || parentHeaderBack != null;
204
168
  const backTitle = previousDescriptor ? (0, _elements.getHeaderTitle)(previousDescriptor.options, previousDescriptor.route.name) : parentHeaderBack?.title;
205
- const headerBack = React.useMemo(() => ({
206
- // No href needed for native
207
- href: undefined,
208
- title: backTitle
209
- }), [backTitle]);
169
+ const headerBack = React.useMemo(() => {
170
+ if (canGoBack) {
171
+ return {
172
+ href: undefined,
173
+ // No href needed for native
174
+ title: backTitle
175
+ };
176
+ }
177
+ return undefined;
178
+ }, [canGoBack, backTitle]);
210
179
  const isRemovePrevented = preventedRoutes[route.key]?.preventRemove;
211
- return /*#__PURE__*/React.createElement(_reactNativeScreens.Screen, {
212
- key: route.key,
213
- enabled: true,
214
- isNativeStack: true,
180
+ const headerConfig = (0, _useHeaderConfigProps.useHeaderConfigProps)({
181
+ ...options,
182
+ route,
183
+ canGoBack,
184
+ headerBackButtonMenuEnabled: isRemovePrevented !== undefined ? !isRemovePrevented : headerBackButtonMenuEnabled,
185
+ headerBackTitle: options.headerBackTitle !== undefined ? options.headerBackTitle : undefined,
186
+ headerHeight,
187
+ headerShown: header !== undefined ? false : headerShown,
188
+ headerTopInsetEnabled
189
+ });
190
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeScreens.ScreenStackItem, {
191
+ activityState: isPreloaded ? 0 : 2,
215
192
  style: _reactNative.StyleSheet.absoluteFill,
216
- hasLargeHeader: options.headerLargeTitle ?? false,
193
+ accessibilityElementsHidden: !focused,
194
+ importantForAccessibility: focused ? 'auto' : 'no-hide-descendants',
217
195
  customAnimationOnSwipe: animationMatchesGesture,
218
196
  fullScreenSwipeEnabled: fullScreenGestureEnabled,
219
- gestureEnabled: isAndroid ?
197
+ fullScreenSwipeShadowEnabled: fullScreenGestureShadowEnabled,
198
+ freezeOnBlur: freezeOnBlur,
199
+ gestureEnabled: _reactNative.Platform.OS === 'android' ?
220
200
  // This prop enables handling of system back gestures on Android
221
201
  // Since we handle them in JS side, we disable this
222
202
  false : gestureEnabled,
223
203
  homeIndicatorHidden: autoHideHomeIndicator,
224
204
  hideKeyboardOnSwipe: keyboardHandlingEnabled,
225
- navigationBarColor: navigationBarColor
226
- // @ts-expect-error prop supported from react-native-screens 3.32.0 onwards
227
- ,
205
+ navigationBarColor: navigationBarColor,
228
206
  navigationBarTranslucent: navigationBarTranslucent,
229
207
  navigationBarHidden: navigationBarHidden,
230
208
  replaceAnimation: animationTypeForReplace,
@@ -232,9 +210,11 @@ const SceneView = ({
232
210
  stackAnimation: animation,
233
211
  screenOrientation: orientation,
234
212
  sheetAllowedDetents: sheetAllowedDetents,
235
- sheetLargestUndimmedDetent: sheetLargestUndimmedDetent,
213
+ sheetLargestUndimmedDetentIndex: sheetLargestUndimmedDetentIndex,
236
214
  sheetGrabberVisible: sheetGrabberVisible,
215
+ sheetInitialDetentIndex: sheetInitialDetentIndex,
237
216
  sheetCornerRadius: sheetCornerRadius,
217
+ sheetElevation: sheetElevation,
238
218
  sheetExpandsWhenScrolledToEdge: sheetExpandsWhenScrolledToEdge,
239
219
  statusBarAnimation: statusBarAnimation,
240
220
  statusBarHidden: statusBarHidden,
@@ -249,6 +229,7 @@ const SceneView = ({
249
229
  onDisappear: onDisappear,
250
230
  onDismissed: onDismissed,
251
231
  onGestureCancel: onGestureCancel,
232
+ onSheetDetentChanged: onSheetDetentChanged,
252
233
  gestureResponseDistance: gestureResponseDistance,
253
234
  nativeBackButtonDismissalEnabled: false // on Android
254
235
  ,
@@ -268,6 +249,12 @@ const SceneView = ({
268
249
  }], {
269
250
  useNativeDriver: true,
270
251
  listener: e => {
252
+ if (_reactNative.Platform.OS === 'android' && (options.headerBackground != null || options.headerTransparent)) {
253
+ // FIXME: On Android, we get 0 if the header is translucent
254
+ // So we set a default height in that case
255
+ setHeaderHeight(ANDROID_DEFAULT_HEADER_HEIGHT + topInset);
256
+ return;
257
+ }
271
258
  if (e.nativeEvent && typeof e.nativeEvent === 'object' && 'headerHeight' in e.nativeEvent && typeof e.nativeEvent.headerHeight === 'number') {
272
259
  const headerHeight = e.nativeEvent.headerHeight + headerHeightCorrectionOffset;
273
260
 
@@ -281,68 +268,67 @@ const SceneView = ({
281
268
  }
282
269
  }
283
270
  }
284
- })
285
- // this prop is available since rn-screens 3.16
271
+ }),
272
+ contentStyle: [presentation !== 'transparentModal' && presentation !== 'containedTransparentModal' && {
273
+ backgroundColor: colors.background
274
+ }, contentStyle],
275
+ headerConfig: headerConfig
276
+ // When ts-expect-error is added, it affects all the props below it
277
+ // So we keep any props that need it at the end
278
+ // Otherwise invalid props may not be caught by TypeScript
286
279
  ,
287
- freezeOnBlur: freezeOnBlur
288
- }, /*#__PURE__*/React.createElement(_native.NavigationContext.Provider, {
289
- value: navigation
290
- }, /*#__PURE__*/React.createElement(_native.NavigationRouteContext.Provider, {
291
- value: route
292
- }, /*#__PURE__*/React.createElement(_elements.HeaderShownContext.Provider, {
293
- value: isParentHeaderShown || headerShown !== false
294
- }, /*#__PURE__*/React.createElement(_useAnimatedHeaderHeight.AnimatedHeaderHeightContext.Provider, {
295
- value: animatedHeaderHeight
296
- }, /*#__PURE__*/React.createElement(_elements.HeaderHeightContext.Provider, {
297
- value: headerShown !== false ? headerHeight : parentHeaderHeight ?? 0
298
- }, headerBackground != null ?
299
- /*#__PURE__*/
300
- /**
301
- * To show a custom header background, we render it at the top of the screen below the header
302
- * The header also needs to be positioned absolutely (with `translucent` style)
303
- */
304
- React.createElement(_reactNative.View, {
305
- style: [styles.background, headerTransparent ? styles.translucent : null, {
306
- height: headerHeight
307
- }]
308
- }, headerBackground()) : null, /*#__PURE__*/React.createElement(_reactNative.View, {
309
- accessibilityElementsHidden: !focused,
310
- importantForAccessibility: focused ? 'auto' : 'no-hide-descendants',
311
- style: styles.scene
312
- }, /*#__PURE__*/React.createElement(MaybeNestedStack, {
313
- options: options,
314
- route: route,
315
- presentation: presentation,
316
- headerHeight: headerHeight,
317
- headerTopInsetEnabled: headerTopInsetEnabled
318
- }, /*#__PURE__*/React.createElement(_elements.HeaderBackContext.Provider, {
319
- value: headerBack
320
- }, render())), header !== undefined && headerShown !== false ? /*#__PURE__*/React.createElement(_reactNative.View, {
321
- onLayout: e => {
322
- const headerHeight = e.nativeEvent.layout.height;
323
- setHeaderHeight(headerHeight);
324
- rawAnimatedHeaderHeight.setValue(headerHeight);
325
- },
326
- style: headerTransparent ? styles.absolute : null
327
- }, header({
328
- back: headerBack,
329
- options,
330
- route,
331
- navigation
332
- })) : null), /*#__PURE__*/React.createElement(_HeaderConfig.HeaderConfig, _extends({}, options, {
333
- route: route,
334
- headerBackButtonMenuEnabled: isRemovePrevented !== undefined ? !isRemovePrevented : headerBackButtonMenuEnabled,
335
- headerShown: header !== undefined ? false : headerShown,
336
- headerHeight: headerHeight,
337
- headerBackTitle: options.headerBackTitle !== undefined ? options.headerBackTitle : undefined,
338
- headerTopInsetEnabled: headerTopInsetEnabled,
339
- canGoBack: headerBack !== undefined
340
- }))))))));
280
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_native.NavigationContext.Provider, {
281
+ value: navigation,
282
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_native.NavigationRouteContext.Provider, {
283
+ value: route,
284
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_useAnimatedHeaderHeight.AnimatedHeaderHeightContext.Provider, {
285
+ value: animatedHeaderHeight,
286
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_elements.HeaderHeightContext.Provider, {
287
+ value: headerShown !== false ? headerHeight : parentHeaderHeight ?? 0,
288
+ children: [headerBackground != null ?
289
+ /*#__PURE__*/
290
+ /**
291
+ * To show a custom header background, we render it at the top of the screen below the header
292
+ * The header also needs to be positioned absolutely (with `translucent` style)
293
+ */
294
+ (0, _jsxRuntime.jsx)(_reactNative.View, {
295
+ style: [styles.background, headerTransparent ? styles.translucent : null, {
296
+ height: headerHeight
297
+ }],
298
+ children: headerBackground()
299
+ }) : null, header !== undefined && headerShown !== false ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
300
+ onLayout: e => {
301
+ const headerHeight = e.nativeEvent.layout.height;
302
+ setHeaderHeight(headerHeight);
303
+ rawAnimatedHeaderHeight.setValue(headerHeight);
304
+ },
305
+ style: [styles.header, headerTransparent ? styles.absolute : null],
306
+ children: header({
307
+ back: headerBack,
308
+ options,
309
+ route,
310
+ navigation
311
+ })
312
+ }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_elements.HeaderShownContext.Provider, {
313
+ value: isParentHeaderShown || headerShown !== false,
314
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_elements.HeaderBackContext.Provider, {
315
+ value: headerBack,
316
+ children: render()
317
+ })
318
+ }), presentation === 'formSheet' && unstable_sheetFooter && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FooterComponent.FooterComponent, {
319
+ children: unstable_sheetFooter()
320
+ })]
321
+ })
322
+ })
323
+ })
324
+ })
325
+ }, route.key);
341
326
  };
342
327
  function NativeStackView({
343
328
  state,
344
329
  navigation,
345
- descriptors
330
+ descriptors,
331
+ describe
346
332
  }) {
347
333
  const {
348
334
  setNextDismissedKey
@@ -352,102 +338,118 @@ function NativeStackView({
352
338
  } = (0, _native.useTheme)();
353
339
  (0, _useInvalidPreventRemoveError.useInvalidPreventRemoveError)(descriptors);
354
340
  const modalRouteKeys = (0, _getModalRoutesKeys.getModalRouteKeys)(state.routes, descriptors);
355
- return /*#__PURE__*/React.createElement(_elements.SafeAreaProviderCompat, {
341
+ const preloadedDescriptors = state.preloadedRoutes.reduce((acc, route) => {
342
+ acc[route.key] = acc[route.key] || describe(route, true);
343
+ return acc;
344
+ }, {});
345
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_elements.SafeAreaProviderCompat, {
356
346
  style: {
357
347
  backgroundColor: colors.background
358
- }
359
- }, /*#__PURE__*/React.createElement(_reactNativeScreens.ScreenStack, {
360
- style: styles.container
361
- }, state.routes.map((route, index) => {
362
- const descriptor = descriptors[route.key];
363
- const isFocused = state.index === index;
364
- const previousKey = state.routes[index - 1]?.key;
365
- const nextKey = state.routes[index + 1]?.key;
366
- const previousDescriptor = previousKey ? descriptors[previousKey] : undefined;
367
- const nextDescriptor = nextKey ? descriptors[nextKey] : undefined;
368
- const isModal = modalRouteKeys.includes(route.key);
369
- return /*#__PURE__*/React.createElement(SceneView, {
370
- key: route.key,
371
- index: index,
372
- focused: isFocused,
373
- descriptor: descriptor,
374
- previousDescriptor: previousDescriptor,
375
- nextDescriptor: nextDescriptor,
376
- isPresentationModal: isModal,
377
- onWillDisappear: () => {
378
- navigation.emit({
379
- type: 'transitionStart',
380
- data: {
381
- closing: true
348
+ },
349
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeScreens.ScreenStack, {
350
+ style: styles.container,
351
+ children: state.routes.concat(state.preloadedRoutes).map((route, index) => {
352
+ const descriptor = descriptors[route.key] ?? preloadedDescriptors[route.key];
353
+ const isFocused = state.index === index;
354
+ const previousKey = state.routes[index - 1]?.key;
355
+ const nextKey = state.routes[index + 1]?.key;
356
+ const previousDescriptor = previousKey ? descriptors[previousKey] : undefined;
357
+ const nextDescriptor = nextKey ? descriptors[nextKey] : undefined;
358
+ const isModal = modalRouteKeys.includes(route.key);
359
+ const isPreloaded = preloadedDescriptors[route.key] !== undefined && descriptors[route.key] === undefined;
360
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SceneView, {
361
+ index: index,
362
+ focused: isFocused,
363
+ descriptor: descriptor,
364
+ previousDescriptor: previousDescriptor,
365
+ nextDescriptor: nextDescriptor,
366
+ isPresentationModal: isModal,
367
+ isPreloaded: isPreloaded,
368
+ onWillDisappear: () => {
369
+ navigation.emit({
370
+ type: 'transitionStart',
371
+ data: {
372
+ closing: true
373
+ },
374
+ target: route.key
375
+ });
382
376
  },
383
- target: route.key
384
- });
385
- },
386
- onWillAppear: () => {
387
- navigation.emit({
388
- type: 'transitionStart',
389
- data: {
390
- closing: false
377
+ onWillAppear: () => {
378
+ navigation.emit({
379
+ type: 'transitionStart',
380
+ data: {
381
+ closing: false
382
+ },
383
+ target: route.key
384
+ });
391
385
  },
392
- target: route.key
393
- });
394
- },
395
- onAppear: () => {
396
- navigation.emit({
397
- type: 'transitionEnd',
398
- data: {
399
- closing: false
386
+ onAppear: () => {
387
+ navigation.emit({
388
+ type: 'transitionEnd',
389
+ data: {
390
+ closing: false
391
+ },
392
+ target: route.key
393
+ });
400
394
  },
401
- target: route.key
402
- });
403
- },
404
- onDisappear: () => {
405
- navigation.emit({
406
- type: 'transitionEnd',
407
- data: {
408
- closing: true
395
+ onDisappear: () => {
396
+ navigation.emit({
397
+ type: 'transitionEnd',
398
+ data: {
399
+ closing: true
400
+ },
401
+ target: route.key
402
+ });
409
403
  },
410
- target: route.key
411
- });
412
- },
413
- onDismissed: event => {
414
- navigation.dispatch({
415
- ..._native.StackActions.pop(event.nativeEvent.dismissCount),
416
- source: route.key,
417
- target: state.key
418
- });
419
- setNextDismissedKey(route.key);
420
- },
421
- onHeaderBackButtonClicked: () => {
422
- navigation.dispatch({
423
- ..._native.StackActions.pop(),
424
- source: route.key,
425
- target: state.key
426
- });
427
- },
428
- onNativeDismissCancelled: event => {
429
- navigation.dispatch({
430
- ..._native.StackActions.pop(event.nativeEvent.dismissCount),
431
- source: route.key,
432
- target: state.key
433
- });
434
- },
435
- onGestureCancel: () => {
436
- navigation.emit({
437
- type: 'gestureCancel',
438
- target: route.key
439
- });
440
- }
441
- });
442
- })));
404
+ onDismissed: event => {
405
+ navigation.dispatch({
406
+ ..._native.StackActions.pop(event.nativeEvent.dismissCount),
407
+ source: route.key,
408
+ target: state.key
409
+ });
410
+ setNextDismissedKey(route.key);
411
+ },
412
+ onHeaderBackButtonClicked: () => {
413
+ navigation.dispatch({
414
+ ..._native.StackActions.pop(),
415
+ source: route.key,
416
+ target: state.key
417
+ });
418
+ },
419
+ onNativeDismissCancelled: event => {
420
+ navigation.dispatch({
421
+ ..._native.StackActions.pop(event.nativeEvent.dismissCount),
422
+ source: route.key,
423
+ target: state.key
424
+ });
425
+ },
426
+ onGestureCancel: () => {
427
+ navigation.emit({
428
+ type: 'gestureCancel',
429
+ target: route.key
430
+ });
431
+ },
432
+ onSheetDetentChanged: event => {
433
+ navigation.emit({
434
+ type: 'sheetDetentChange',
435
+ target: route.key,
436
+ data: {
437
+ index: event.nativeEvent.index,
438
+ stable: event.nativeEvent.isStable
439
+ }
440
+ });
441
+ }
442
+ }, route.key);
443
+ })
444
+ })
445
+ });
443
446
  }
444
447
  const styles = _reactNative.StyleSheet.create({
445
448
  container: {
446
449
  flex: 1
447
450
  },
448
- scene: {
449
- flex: 1,
450
- flexDirection: 'column-reverse'
451
+ header: {
452
+ zIndex: 1
451
453
  },
452
454
  absolute: {
453
455
  position: 'absolute',