@react-navigation/native-stack 7.0.0-alpha.9 → 7.0.0-rc.1

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 (75) hide show
  1. package/lib/commonjs/index.js.map +1 -1
  2. package/lib/commonjs/navigators/createNativeStackNavigator.js +19 -16
  3. package/lib/commonjs/navigators/createNativeStackNavigator.js.map +1 -1
  4. package/lib/commonjs/types.js.map +1 -1
  5. package/lib/commonjs/utils/debounce.js +16 -0
  6. package/lib/commonjs/utils/debounce.js.map +1 -0
  7. package/lib/commonjs/utils/getModalRoutesKeys.js +17 -0
  8. package/lib/commonjs/utils/getModalRoutesKeys.js.map +1 -0
  9. package/lib/commonjs/utils/useAnimatedHeaderHeight.js +1 -1
  10. package/lib/commonjs/utils/useAnimatedHeaderHeight.js.map +1 -1
  11. package/lib/commonjs/utils/useDismissedRouteError.js +1 -1
  12. package/lib/commonjs/utils/useDismissedRouteError.js.map +1 -1
  13. package/lib/commonjs/utils/useInvalidPreventRemoveError.js +1 -1
  14. package/lib/commonjs/utils/useInvalidPreventRemoveError.js.map +1 -1
  15. package/lib/commonjs/views/DebugContainer.js +1 -1
  16. package/lib/commonjs/views/DebugContainer.js.map +1 -1
  17. package/lib/commonjs/views/DebugContainer.native.js +3 -3
  18. package/lib/commonjs/views/DebugContainer.native.js.map +1 -1
  19. package/lib/commonjs/views/FontProcessor.js.map +1 -1
  20. package/lib/commonjs/views/FontProcessor.native.js +1 -1
  21. package/lib/commonjs/views/FontProcessor.native.js.map +1 -1
  22. package/lib/commonjs/views/HeaderConfig.js +41 -39
  23. package/lib/commonjs/views/HeaderConfig.js.map +1 -1
  24. package/lib/commonjs/views/NativeStackView.js +47 -57
  25. package/lib/commonjs/views/NativeStackView.js.map +1 -1
  26. package/lib/commonjs/views/NativeStackView.native.js +110 -54
  27. package/lib/commonjs/views/NativeStackView.native.js.map +1 -1
  28. package/lib/module/index.js.map +1 -1
  29. package/lib/module/navigators/createNativeStackNavigator.js +17 -14
  30. package/lib/module/navigators/createNativeStackNavigator.js.map +1 -1
  31. package/lib/module/types.js.map +1 -1
  32. package/lib/module/utils/debounce.js +10 -0
  33. package/lib/module/utils/debounce.js.map +1 -0
  34. package/lib/module/utils/getModalRoutesKeys.js +10 -0
  35. package/lib/module/utils/getModalRoutesKeys.js.map +1 -0
  36. package/lib/module/utils/useAnimatedHeaderHeight.js.map +1 -1
  37. package/lib/module/utils/useDismissedRouteError.js.map +1 -1
  38. package/lib/module/utils/useInvalidPreventRemoveError.js.map +1 -1
  39. package/lib/module/views/DebugContainer.js.map +1 -1
  40. package/lib/module/views/DebugContainer.native.js +1 -1
  41. package/lib/module/views/DebugContainer.native.js.map +1 -1
  42. package/lib/module/views/FontProcessor.js.map +1 -1
  43. package/lib/module/views/FontProcessor.native.js.map +1 -1
  44. package/lib/module/views/HeaderConfig.js +40 -38
  45. package/lib/module/views/HeaderConfig.js.map +1 -1
  46. package/lib/module/views/NativeStackView.js +47 -57
  47. package/lib/module/views/NativeStackView.js.map +1 -1
  48. package/lib/module/views/NativeStackView.native.js +109 -53
  49. package/lib/module/views/NativeStackView.native.js.map +1 -1
  50. package/lib/typescript/src/index.d.ts +1 -1
  51. package/lib/typescript/src/index.d.ts.map +1 -1
  52. package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts +13 -8
  53. package/lib/typescript/src/navigators/createNativeStackNavigator.d.ts.map +1 -1
  54. package/lib/typescript/src/types.d.ts +16 -4
  55. package/lib/typescript/src/types.d.ts.map +1 -1
  56. package/lib/typescript/src/utils/debounce.d.ts +2 -0
  57. package/lib/typescript/src/utils/debounce.d.ts.map +1 -0
  58. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts +4 -0
  59. package/lib/typescript/src/utils/getModalRoutesKeys.d.ts.map +1 -0
  60. package/lib/typescript/src/utils/useAnimatedHeaderHeight.d.ts +2 -2
  61. package/lib/typescript/src/utils/useAnimatedHeaderHeight.d.ts.map +1 -1
  62. package/lib/typescript/src/views/HeaderConfig.d.ts.map +1 -1
  63. package/lib/typescript/src/views/NativeStackView.d.ts.map +1 -1
  64. package/lib/typescript/src/views/NativeStackView.native.d.ts +1 -1
  65. package/lib/typescript/src/views/NativeStackView.native.d.ts.map +1 -1
  66. package/package.json +13 -13
  67. package/src/index.tsx +1 -0
  68. package/src/navigators/createNativeStackNavigator.tsx +30 -6
  69. package/src/types.tsx +23 -2
  70. package/src/utils/debounce.tsx +14 -0
  71. package/src/utils/getModalRoutesKeys.ts +21 -0
  72. package/src/utils/useAnimatedHeaderHeight.tsx +1 -1
  73. package/src/views/HeaderConfig.tsx +12 -5
  74. package/src/views/NativeStackView.native.tsx +180 -101
  75. package/src/views/NativeStackView.tsx +141 -144
@@ -10,6 +10,7 @@ import {
10
10
  type ParamListBase,
11
11
  type StackNavigationState,
12
12
  useLinkBuilder,
13
+ useTheme,
13
14
  } from '@react-navigation/native';
14
15
  import * as React from 'react';
15
16
  import { Image, StyleSheet, View } from 'react-native';
@@ -35,6 +36,7 @@ const TRANSPARENT_PRESENTATIONS = [
35
36
  export function NativeStackView({ state, descriptors }: Props) {
36
37
  const parentHeaderBack = React.useContext(HeaderBackContext);
37
38
  const { buildHref } = useLinkBuilder();
39
+ const { colors } = useTheme();
38
40
 
39
41
  if (state.preloadedRoutes.length !== 0) {
40
42
  throw new Error(
@@ -43,160 +45,155 @@ export function NativeStackView({ state, descriptors }: Props) {
43
45
  }
44
46
 
45
47
  return (
46
- <SafeAreaProviderCompat>
47
- <View style={styles.container}>
48
- {state.routes.map((route, i) => {
49
- const isFocused = state.index === i;
50
- const previousKey = state.routes[i - 1]?.key;
51
- const nextKey = state.routes[i + 1]?.key;
52
- const previousDescriptor = previousKey
53
- ? descriptors[previousKey]
54
- : undefined;
55
- const nextDescriptor = nextKey ? descriptors[nextKey] : undefined;
56
- const { options, navigation, render } = descriptors[route.key];
48
+ <SafeAreaProviderCompat style={{ backgroundColor: colors.background }}>
49
+ {state.routes.map((route, i) => {
50
+ const isFocused = state.index === i;
51
+ const previousKey = state.routes[i - 1]?.key;
52
+ const nextKey = state.routes[i + 1]?.key;
53
+ const previousDescriptor = previousKey
54
+ ? descriptors[previousKey]
55
+ : undefined;
56
+ const nextDescriptor = nextKey ? descriptors[nextKey] : undefined;
57
+ const { options, navigation, render } = descriptors[route.key];
57
58
 
58
- const headerBack = previousDescriptor
59
- ? {
60
- title: getHeaderTitle(
61
- previousDescriptor.options,
62
- previousDescriptor.route.name
63
- ),
64
- href: buildHref(
65
- previousDescriptor.route.name,
66
- previousDescriptor.route.params
67
- ),
68
- }
69
- : parentHeaderBack;
59
+ const headerBack = previousDescriptor
60
+ ? {
61
+ title: getHeaderTitle(
62
+ previousDescriptor.options,
63
+ previousDescriptor.route.name
64
+ ),
65
+ href: buildHref(
66
+ previousDescriptor.route.name,
67
+ previousDescriptor.route.params
68
+ ),
69
+ }
70
+ : parentHeaderBack;
70
71
 
71
- const canGoBack = headerBack !== undefined;
72
+ const canGoBack = headerBack !== undefined;
72
73
 
73
- const {
74
- header,
75
- headerShown,
76
- headerTintColor,
77
- headerBackImageSource,
78
- headerLeft,
79
- headerRight,
80
- headerTitle,
81
- headerTitleAlign,
82
- headerTitleStyle,
83
- headerStyle,
84
- headerShadowVisible,
85
- headerTransparent,
86
- headerBackground,
87
- headerBackTitle,
88
- presentation,
89
- contentStyle,
90
- } = options;
74
+ const {
75
+ header,
76
+ headerShown,
77
+ headerTintColor,
78
+ headerBackImageSource,
79
+ headerLeft,
80
+ headerRight,
81
+ headerTitle,
82
+ headerTitleAlign,
83
+ headerTitleStyle,
84
+ headerStyle,
85
+ headerShadowVisible,
86
+ headerTransparent,
87
+ headerBackground,
88
+ headerBackTitle,
89
+ presentation,
90
+ contentStyle,
91
+ } = options;
91
92
 
92
- const nextPresentation = nextDescriptor?.options.presentation;
93
+ const nextPresentation = nextDescriptor?.options.presentation;
93
94
 
94
- return (
95
- <Screen
96
- key={route.key}
97
- focused={isFocused}
98
- route={route}
99
- navigation={navigation}
100
- headerShown={headerShown}
101
- headerTransparent={headerTransparent}
102
- header={
103
- header !== undefined ? (
104
- header({
105
- back: headerBack,
106
- options,
107
- route,
108
- navigation,
109
- })
110
- ) : (
111
- <Header
112
- title={getHeaderTitle(options, route.name)}
113
- headerTintColor={headerTintColor}
114
- headerLeft={
115
- typeof headerLeft === 'function'
116
- ? ({ tintColor }) =>
117
- headerLeft({
118
- tintColor,
119
- canGoBack,
120
- label: headerBackTitle,
121
- })
122
- : headerLeft === undefined && canGoBack
123
- ? ({ tintColor }) => (
124
- <HeaderBackButton
125
- tintColor={tintColor}
126
- backImage={
127
- headerBackImageSource !== undefined
128
- ? () => (
129
- <Image
130
- source={headerBackImageSource}
131
- resizeMode="contain"
132
- style={[
133
- styles.backImage,
134
- { tintColor },
135
- ]}
136
- />
137
- )
138
- : undefined
139
- }
140
- onPress={navigation.goBack}
141
- href={headerBack.href}
142
- />
143
- )
144
- : headerLeft
145
- }
146
- headerRight={
147
- typeof headerRight === 'function'
148
- ? ({ tintColor }) =>
149
- headerRight({ tintColor, canGoBack })
150
- : headerRight
151
- }
152
- headerTitle={
153
- typeof headerTitle === 'function'
154
- ? ({ children, tintColor }) =>
155
- headerTitle({ children, tintColor })
156
- : headerTitle
157
- }
158
- headerTitleAlign={headerTitleAlign}
159
- headerTitleStyle={headerTitleStyle}
160
- headerTransparent={headerTransparent}
161
- headerShadowVisible={headerShadowVisible}
162
- headerBackground={headerBackground}
163
- headerStyle={headerStyle}
164
- />
165
- )
166
- }
167
- style={[
168
- StyleSheet.absoluteFill,
169
- {
170
- display:
171
- isFocused ||
172
- (nextPresentation != null &&
173
- TRANSPARENT_PRESENTATIONS.includes(nextPresentation))
174
- ? 'flex'
175
- : 'none',
176
- },
177
- presentation != null &&
178
- TRANSPARENT_PRESENTATIONS.includes(presentation)
179
- ? { backgroundColor: 'transparent' }
180
- : null,
181
- ]}
182
- >
183
- <HeaderBackContext.Provider value={headerBack}>
184
- <View style={[styles.contentContainer, contentStyle]}>
185
- {render()}
186
- </View>
187
- </HeaderBackContext.Provider>
188
- </Screen>
189
- );
190
- })}
191
- </View>
95
+ return (
96
+ <Screen
97
+ key={route.key}
98
+ focused={isFocused}
99
+ route={route}
100
+ navigation={navigation}
101
+ headerShown={headerShown}
102
+ headerTransparent={headerTransparent}
103
+ header={
104
+ header !== undefined ? (
105
+ header({
106
+ back: headerBack,
107
+ options,
108
+ route,
109
+ navigation,
110
+ })
111
+ ) : (
112
+ <Header
113
+ title={getHeaderTitle(options, route.name)}
114
+ headerTintColor={headerTintColor}
115
+ headerLeft={
116
+ typeof headerLeft === 'function'
117
+ ? ({ tintColor }) =>
118
+ headerLeft({
119
+ tintColor,
120
+ canGoBack,
121
+ label: headerBackTitle,
122
+ href: headerBack?.href,
123
+ })
124
+ : headerLeft === undefined && canGoBack
125
+ ? ({ tintColor }) => (
126
+ <HeaderBackButton
127
+ tintColor={tintColor}
128
+ backImage={
129
+ headerBackImageSource !== undefined
130
+ ? () => (
131
+ <Image
132
+ source={headerBackImageSource}
133
+ resizeMode="contain"
134
+ style={[
135
+ styles.backImage,
136
+ { tintColor },
137
+ ]}
138
+ />
139
+ )
140
+ : undefined
141
+ }
142
+ onPress={navigation.goBack}
143
+ href={headerBack.href}
144
+ />
145
+ )
146
+ : headerLeft
147
+ }
148
+ headerRight={
149
+ typeof headerRight === 'function'
150
+ ? ({ tintColor }) => headerRight({ tintColor, canGoBack })
151
+ : headerRight
152
+ }
153
+ headerTitle={
154
+ typeof headerTitle === 'function'
155
+ ? ({ children, tintColor }) =>
156
+ headerTitle({ children, tintColor })
157
+ : headerTitle
158
+ }
159
+ headerTitleAlign={headerTitleAlign}
160
+ headerTitleStyle={headerTitleStyle}
161
+ headerTransparent={headerTransparent}
162
+ headerShadowVisible={headerShadowVisible}
163
+ headerBackground={headerBackground}
164
+ headerStyle={headerStyle}
165
+ />
166
+ )
167
+ }
168
+ style={[
169
+ StyleSheet.absoluteFill,
170
+ {
171
+ display:
172
+ isFocused ||
173
+ (nextPresentation != null &&
174
+ TRANSPARENT_PRESENTATIONS.includes(nextPresentation))
175
+ ? 'flex'
176
+ : 'none',
177
+ },
178
+ presentation != null &&
179
+ TRANSPARENT_PRESENTATIONS.includes(presentation)
180
+ ? { backgroundColor: 'transparent' }
181
+ : null,
182
+ ]}
183
+ >
184
+ <HeaderBackContext.Provider value={headerBack}>
185
+ <View style={[styles.contentContainer, contentStyle]}>
186
+ {render()}
187
+ </View>
188
+ </HeaderBackContext.Provider>
189
+ </Screen>
190
+ );
191
+ })}
192
192
  </SafeAreaProviderCompat>
193
193
  );
194
194
  }
195
195
 
196
196
  const styles = StyleSheet.create({
197
- container: {
198
- flex: 1,
199
- },
200
197
  contentContainer: {
201
198
  flex: 1,
202
199
  },