@react-navigation/stack 6.0.11 → 6.2.0

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 (81) hide show
  1. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js +72 -64
  2. package/lib/commonjs/TransitionConfigs/CardStyleInterpolators.js.map +1 -1
  3. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js +37 -32
  4. package/lib/commonjs/TransitionConfigs/HeaderStyleInterpolators.js.map +1 -1
  5. package/lib/commonjs/TransitionConfigs/TransitionPresets.js +1 -1
  6. package/lib/commonjs/TransitionConfigs/TransitionSpecs.js +1 -1
  7. package/lib/commonjs/index.js +13 -11
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/navigators/createStackNavigator.js +26 -21
  10. package/lib/commonjs/navigators/createStackNavigator.js.map +1 -1
  11. package/lib/commonjs/utils/debounce.js +5 -1
  12. package/lib/commonjs/utils/debounce.js.map +1 -1
  13. package/lib/commonjs/utils/memoize.js +5 -1
  14. package/lib/commonjs/utils/memoize.js.map +1 -1
  15. package/lib/commonjs/views/GestureHandler.js +7 -4
  16. package/lib/commonjs/views/GestureHandler.js.map +1 -1
  17. package/lib/commonjs/views/GestureHandlerNative.js +1 -1
  18. package/lib/commonjs/views/Header/Header.js +10 -9
  19. package/lib/commonjs/views/Header/Header.js.map +1 -1
  20. package/lib/commonjs/views/Header/HeaderContainer.js +10 -9
  21. package/lib/commonjs/views/Header/HeaderContainer.js.map +1 -1
  22. package/lib/commonjs/views/Header/HeaderSegment.js +5 -0
  23. package/lib/commonjs/views/Header/HeaderSegment.js.map +1 -1
  24. package/lib/commonjs/views/ModalStatusBarManager.js +11 -9
  25. package/lib/commonjs/views/ModalStatusBarManager.js.map +1 -1
  26. package/lib/commonjs/views/Screens.js +14 -10
  27. package/lib/commonjs/views/Screens.js.map +1 -1
  28. package/lib/commonjs/views/Stack/Card.js +32 -24
  29. package/lib/commonjs/views/Stack/Card.js.map +1 -1
  30. package/lib/commonjs/views/Stack/CardContainer.js +43 -40
  31. package/lib/commonjs/views/Stack/CardContainer.js.map +1 -1
  32. package/lib/commonjs/views/Stack/CardSheet.js +7 -6
  33. package/lib/commonjs/views/Stack/CardSheet.js.map +1 -1
  34. package/lib/commonjs/views/Stack/CardStack.js +26 -17
  35. package/lib/commonjs/views/Stack/CardStack.js.map +1 -1
  36. package/lib/commonjs/views/Stack/StackView.js +62 -46
  37. package/lib/commonjs/views/Stack/StackView.js.map +1 -1
  38. package/lib/module/TransitionConfigs/CardStyleInterpolators.js +67 -59
  39. package/lib/module/TransitionConfigs/CardStyleInterpolators.js.map +1 -1
  40. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js +35 -30
  41. package/lib/module/TransitionConfigs/HeaderStyleInterpolators.js.map +1 -1
  42. package/lib/module/index.js.map +1 -1
  43. package/lib/module/navigators/createStackNavigator.js +25 -20
  44. package/lib/module/navigators/createStackNavigator.js.map +1 -1
  45. package/lib/module/utils/debounce.js +5 -1
  46. package/lib/module/utils/debounce.js.map +1 -1
  47. package/lib/module/utils/memoize.js +5 -1
  48. package/lib/module/utils/memoize.js.map +1 -1
  49. package/lib/module/views/GestureHandler.js +6 -3
  50. package/lib/module/views/GestureHandler.js.map +1 -1
  51. package/lib/module/views/Header/Header.js +10 -9
  52. package/lib/module/views/Header/Header.js.map +1 -1
  53. package/lib/module/views/Header/HeaderContainer.js +10 -9
  54. package/lib/module/views/Header/HeaderContainer.js.map +1 -1
  55. package/lib/module/views/Header/HeaderSegment.js +5 -0
  56. package/lib/module/views/Header/HeaderSegment.js.map +1 -1
  57. package/lib/module/views/ModalStatusBarManager.js +11 -9
  58. package/lib/module/views/ModalStatusBarManager.js.map +1 -1
  59. package/lib/module/views/Screens.js +13 -9
  60. package/lib/module/views/Screens.js.map +1 -1
  61. package/lib/module/views/Stack/Card.js +32 -24
  62. package/lib/module/views/Stack/Card.js.map +1 -1
  63. package/lib/module/views/Stack/CardContainer.js +43 -40
  64. package/lib/module/views/Stack/CardContainer.js.map +1 -1
  65. package/lib/module/views/Stack/CardSheet.js +7 -6
  66. package/lib/module/views/Stack/CardSheet.js.map +1 -1
  67. package/lib/module/views/Stack/CardStack.js +26 -17
  68. package/lib/module/views/Stack/CardStack.js.map +1 -1
  69. package/lib/module/views/Stack/StackView.js +62 -46
  70. package/lib/module/views/Stack/StackView.js.map +1 -1
  71. package/lib/typescript/src/index.d.ts +1 -1
  72. package/lib/typescript/src/navigators/createStackNavigator.d.ts +1 -1
  73. package/lib/typescript/src/types.d.ts +9 -5
  74. package/package.json +9 -9
  75. package/src/index.tsx +1 -0
  76. package/src/navigators/createStackNavigator.tsx +4 -1
  77. package/src/types.tsx +12 -4
  78. package/src/views/Header/HeaderSegment.tsx +16 -4
  79. package/src/views/Stack/Card.tsx +1 -1
  80. package/src/views/Stack/CardContainer.tsx +3 -2
  81. package/src/views/Stack/CardStack.tsx +19 -7
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-navigation/stack",
3
3
  "description": "Stack navigator component for iOS and Android with animated transitions and gestures",
4
- "version": "6.0.11",
4
+ "version": "6.2.0",
5
5
  "keywords": [
6
6
  "react-native-component",
7
7
  "react-component",
@@ -40,23 +40,23 @@
40
40
  "clean": "del lib"
41
41
  },
42
42
  "dependencies": {
43
- "@react-navigation/elements": "^1.2.1",
43
+ "@react-navigation/elements": "^1.3.2",
44
44
  "color": "^3.1.3",
45
45
  "warn-once": "^0.1.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@react-navigation/native": "^6.0.6",
48
+ "@react-navigation/native": "^6.0.9",
49
49
  "@testing-library/react-native": "^7.2.0",
50
50
  "@types/color": "^3.0.1",
51
51
  "@types/react": "^17.0.9",
52
52
  "@types/react-native": "~0.64.9",
53
53
  "del-cli": "^3.0.1",
54
- "react": "~16.13.1",
55
- "react-native": "~0.63.4",
54
+ "react": "17.0.1",
55
+ "react-native": "~0.64.3",
56
56
  "react-native-builder-bob": "^0.18.1",
57
- "react-native-gesture-handler": "~1.10.2",
58
- "react-native-safe-area-context": "~3.2.0",
59
- "react-native-screens": "~3.8.0",
57
+ "react-native-gesture-handler": "~2.2.0",
58
+ "react-native-safe-area-context": "3.3.2",
59
+ "react-native-screens": "~3.10.1",
60
60
  "typescript": "^4.3.2"
61
61
  },
62
62
  "peerDependencies": {
@@ -81,5 +81,5 @@
81
81
  ]
82
82
  ]
83
83
  },
84
- "gitHead": "e77a5ab9d342a03cd8e20b54938700dfd4e23f42"
84
+ "gitHead": "c5ef6b5e88426e658123ea8590da583314b9001e"
85
85
  }
package/src/index.tsx CHANGED
@@ -43,6 +43,7 @@ export type {
43
43
  StackHeaderInterpolationProps,
44
44
  StackHeaderProps,
45
45
  StackHeaderStyleInterpolator,
46
+ StackNavigationEventMap,
46
47
  StackNavigationOptions,
47
48
  StackNavigationProp,
48
49
  StackScreenProps,
@@ -31,6 +31,7 @@ type Props = DefaultNavigatorOptions<
31
31
  StackNavigationConfig;
32
32
 
33
33
  function StackNavigator({
34
+ id,
34
35
  initialRouteName,
35
36
  children,
36
37
  screenListeners,
@@ -81,6 +82,7 @@ function StackNavigator({
81
82
  StackNavigationOptions,
82
83
  StackNavigationEventMap
83
84
  >(StackRouter, {
85
+ id,
84
86
  initialRouteName,
85
87
  children,
86
88
  screenListeners,
@@ -90,6 +92,7 @@ function StackNavigator({
90
92
 
91
93
  React.useEffect(
92
94
  () =>
95
+ // @ts-expect-error: there may not be a tab navigator in parent
93
96
  navigation.addListener?.('tabPress', (e) => {
94
97
  const isFocused = navigation.isFocused();
95
98
 
@@ -99,7 +102,7 @@ function StackNavigator({
99
102
  if (
100
103
  state.index > 0 &&
101
104
  isFocused &&
102
- !(e as EventArg<'tabPress', true>).defaultPrevented
105
+ !(e as unknown as EventArg<'tabPress', true>).defaultPrevented
103
106
  ) {
104
107
  // When user taps on already focused tab and we're inside the tab,
105
108
  // reset the stack to replicate native behaviour
package/src/types.tsx CHANGED
@@ -1,6 +1,7 @@
1
1
  import type {
2
2
  HeaderBackButton,
3
3
  HeaderBackButtonProps,
4
+ HeaderButtonProps,
4
5
  HeaderOptions,
5
6
  HeaderTitleProps,
6
7
  } from '@react-navigation/elements';
@@ -48,10 +49,12 @@ export type StackNavigationHelpers = NavigationHelpers<
48
49
 
49
50
  export type StackNavigationProp<
50
51
  ParamList extends ParamListBase,
51
- RouteName extends keyof ParamList = keyof ParamList
52
+ RouteName extends keyof ParamList = keyof ParamList,
53
+ NavigatorID extends string | undefined = undefined
52
54
  > = NavigationProp<
53
55
  ParamList,
54
56
  RouteName,
57
+ NavigatorID,
55
58
  StackNavigationState<ParamList>,
56
59
  StackNavigationOptions,
57
60
  StackNavigationEventMap
@@ -60,9 +63,10 @@ export type StackNavigationProp<
60
63
 
61
64
  export type StackScreenProps<
62
65
  ParamList extends ParamListBase,
63
- RouteName extends keyof ParamList = keyof ParamList
66
+ RouteName extends keyof ParamList = keyof ParamList,
67
+ NavigatorID extends string | undefined = undefined
64
68
  > = {
65
- navigation: StackNavigationProp<ParamList, RouteName>;
69
+ navigation: StackNavigationProp<ParamList, RouteName, NavigatorID>;
66
70
  route: RouteProp<ParamList, RouteName>;
67
71
  };
68
72
 
@@ -122,7 +126,7 @@ export type StackPresentationMode = 'card' | 'modal';
122
126
 
123
127
  export type StackHeaderOptions = Omit<
124
128
  HeaderOptions,
125
- 'headerLeft' | 'headerTitle'
129
+ 'headerLeft' | 'headerTitle' | 'headerRight'
126
130
  > & {
127
131
  /**
128
132
  * String or a function that returns a React Element to be used by the header.
@@ -136,6 +140,10 @@ export type StackHeaderOptions = Omit<
136
140
  * Function which returns a React Element to display on the left side of the header.
137
141
  */
138
142
  headerLeft?: (props: HeaderBackButtonProps) => React.ReactNode;
143
+ /**
144
+ * Function which returns a React Element to display on the right side of the header.
145
+ */
146
+ headerRight?: (props: HeaderButtonProps) => React.ReactNode;
139
147
  /**
140
148
  * Whether back button title font should scale to respect Text Size accessibility settings. Defaults to `false`.
141
149
  */
@@ -33,11 +33,13 @@ type Props = Omit<StackHeaderOptions, 'headerStatusBarHeight'> & {
33
33
  };
34
34
 
35
35
  export default function HeaderSegment(props: Props) {
36
- const [leftLabelLayout, setLeftLabelLayout] =
37
- React.useState<Layout | undefined>(undefined);
36
+ const [leftLabelLayout, setLeftLabelLayout] = React.useState<
37
+ Layout | undefined
38
+ >(undefined);
38
39
 
39
- const [titleLayout, setTitleLayout] =
40
- React.useState<Layout | undefined>(undefined);
40
+ const [titleLayout, setTitleLayout] = React.useState<Layout | undefined>(
41
+ undefined
42
+ );
41
43
 
42
44
  const handleTitleLayout = (e: LayoutChangeEvent) => {
43
45
  const { height, width } = e.nativeEvent.layout;
@@ -103,6 +105,7 @@ export default function HeaderSegment(props: Props) {
103
105
  headerLeft: left = onGoBack
104
106
  ? (props: HeaderBackButtonProps) => <HeaderBackButton {...props} />
105
107
  : undefined,
108
+ headerRight: right,
106
109
  headerBackImage,
107
110
  headerBackTitle,
108
111
  headerBackTitleVisible = Platform.OS === 'ios',
@@ -166,6 +169,14 @@ export default function HeaderSegment(props: Props) {
166
169
  })
167
170
  : undefined;
168
171
 
172
+ const headerRight: StackHeaderOptions['headerRight'] = right
173
+ ? (props) =>
174
+ right({
175
+ ...props,
176
+ canGoBack: Boolean(onGoBack),
177
+ })
178
+ : undefined;
179
+
169
180
  const headerTitle: StackHeaderOptions['headerTitle'] =
170
181
  typeof title !== 'function'
171
182
  ? (props) => <HeaderTitle {...props} onLayout={handleTitleLayout} />
@@ -178,6 +189,7 @@ export default function HeaderSegment(props: Props) {
178
189
  headerTitle={headerTitle}
179
190
  headerLeft={headerLeft}
180
191
  headerLeftLabelVisible={headerBackTitleVisible}
192
+ headerRight={headerRight}
181
193
  headerTitleContainerStyle={[titleStyle, headerTitleContainerStyle]}
182
194
  headerLeftContainerStyle={[leftButtonStyle, headerLeftContainerStyle]}
183
195
  headerRightContainerStyle={[rightButtonStyle, headerRightContainerStyle]}
@@ -272,7 +272,7 @@ export default class Card extends React.Component<Props> {
272
272
  } = this.props;
273
273
 
274
274
  switch (nativeEvent.state) {
275
- case GestureState.BEGAN:
275
+ case GestureState.ACTIVE:
276
276
  this.isSwiping.setValue(TRUE);
277
277
  this.handleStartInteraction();
278
278
  onGestureBegin?.();
@@ -165,8 +165,9 @@ function CardContainer({
165
165
 
166
166
  const { colors } = useTheme();
167
167
 
168
- const [pointerEvents, setPointerEvents] =
169
- React.useState<'box-none' | 'none'>('box-none');
168
+ const [pointerEvents, setPointerEvents] = React.useState<'box-none' | 'none'>(
169
+ 'box-none'
170
+ );
170
171
 
171
172
  React.useEffect(() => {
172
173
  const listener = scene.progress.next?.addListener?.(
@@ -142,7 +142,7 @@ const getHeaderHeights = (
142
142
  const style = StyleSheet.flatten(headerStyle || {});
143
143
 
144
144
  const height =
145
- typeof style.height === 'number'
145
+ 'height' in style && typeof style.height === 'number'
146
146
  ? style.height
147
147
  : previous[curr.route.key];
148
148
 
@@ -530,7 +530,12 @@ export default class CardStack extends React.Component<Props, State> {
530
530
  if (detachPreviousScreen === false) {
531
531
  activeScreensLimit++;
532
532
  } else {
533
- break;
533
+ // Check at least last 2 screens before stopping
534
+ // This will make sure that screen isn't detached when another screen is animating on top of the transparent one
535
+ // For example, (Opaque -> Transparent -> Opaque)
536
+ if (i <= scenes.length - 2) {
537
+ break;
538
+ }
534
539
  }
535
540
  }
536
541
 
@@ -609,16 +614,23 @@ export default class CardStack extends React.Component<Props, State> {
609
614
  const headerHeight =
610
615
  headerShown !== false ? headerHeights[route.key] : 0;
611
616
 
612
- const { backgroundColor: headerBackgroundColor } =
613
- StyleSheet.flatten(headerStyle) || {};
614
-
615
617
  let headerDarkContent: boolean | undefined;
616
618
 
617
619
  if (headerShown) {
618
620
  if (typeof headerTintColor === 'string') {
619
621
  headerDarkContent = Color(headerTintColor).isDark();
620
- } else if (typeof headerBackgroundColor === 'string') {
621
- headerDarkContent = !Color(headerBackgroundColor).isDark();
622
+ } else {
623
+ const flattenedHeaderStyle = StyleSheet.flatten(headerStyle);
624
+
625
+ if (
626
+ flattenedHeaderStyle &&
627
+ 'backgroundColor' in flattenedHeaderStyle &&
628
+ typeof flattenedHeaderStyle.backgroundColor === 'string'
629
+ ) {
630
+ headerDarkContent = !Color(
631
+ flattenedHeaderStyle.backgroundColor
632
+ ).isDark();
633
+ }
622
634
  }
623
635
  }
624
636