Compare commits

...

11 Commits

Author SHA1 Message Date
satyajit.happy
d75915d1f3 chore: publish
- @react-navigation/bottom-tabs@5.0.0-alpha.12
 - @react-navigation/compat@5.0.0-alpha.6
 - @react-navigation/core@5.0.0-alpha.13
 - @react-navigation/drawer@5.0.0-alpha.12
 - @react-navigation/example@5.0.0-alpha.10
 - @react-navigation/material-bottom-tabs@5.0.0-alpha.11
 - @react-navigation/material-top-tabs@5.0.0-alpha.10
 - @react-navigation/native@5.0.0-alpha.10
 - @react-navigation/stack@5.0.0-alpha.22
2019-10-03 21:33:06 +02:00
satyajit.happy
832ed882bc refactor: use react-native-safe-area-context 2019-10-03 21:31:09 +02:00
satyajit.happy
8318c49331 chore: publish
- @react-navigation/bottom-tabs@5.0.0-alpha.11
 - @react-navigation/compat@5.0.0-alpha.5
 - @react-navigation/core@5.0.0-alpha.12
 - @react-navigation/drawer@5.0.0-alpha.11
 - @react-navigation/example@5.0.0-alpha.9
 - @react-navigation/material-bottom-tabs@5.0.0-alpha.10
 - @react-navigation/material-top-tabs@5.0.0-alpha.9
 - @react-navigation/native@5.0.0-alpha.9
 - @react-navigation/routers@5.0.0-alpha.9
 - @react-navigation/stack@5.0.0-alpha.21
2019-10-03 19:47:41 +02:00
satyajit.happy
ece6e3899e fix: add missing React import 2019-10-03 19:07:56 +02:00
satyajit.happy
da944ccef9 fix: fix header buttons not clickable on Android. fixes #108 2019-10-03 19:07:21 +02:00
satyajit.happy
bc3586ae3e fix: keep the routes we are closing or replacing 2019-10-03 18:44:18 +02:00
satyajit.happy
19be2b4bbc fix: don't throw when switching navigator. fixes #91 2019-10-03 17:51:13 +02:00
satyajit.happy
a8851b730d chore: upgrade deps 2019-10-03 17:35:24 +02:00
Michał Osadnik
7a5bcb446b feat: add a getRootState method (#119) 2019-10-01 23:17:28 +02:00
satyajit.happy
1345a8fec6 chore: upgrade eslint config 2019-09-28 11:58:21 +02:00
satyajit.happy
7393464515 fix: don't merge state with existing state during reset. fixes #111 2019-09-28 11:49:45 +02:00
70 changed files with 2575 additions and 2058 deletions

View File

@@ -1,14 +0,0 @@
{
"git": {
"commitMessage": "chore: release %s",
"tagName": "v%s"
},
"github": {
"release": true
},
"plugins": {
"@release-it/conventional-changelog": {
"preset": "angular"
}
}
}

View File

@@ -1,5 +1,3 @@
/* eslint-disable import/no-commonjs */
module.exports = { module.exports = {
presets: [ presets: [
[ [

View File

@@ -1,5 +1,3 @@
/* eslint-disable import/no-commonjs */
module.exports = { module.exports = {
extends: ['@commitlint/config-conventional'], extends: ['@commitlint/config-conventional'],
}; };

View File

@@ -23,27 +23,26 @@
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-class-properties": "^7.5.5", "@babel/plugin-proposal-class-properties": "^7.5.5",
"@babel/preset-env": "^7.5.5", "@babel/preset-env": "^7.6.2",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
"@babel/preset-typescript": "^7.3.3", "@babel/preset-typescript": "^7.6.0",
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.6.2",
"@commitlint/config-conventional": "^8.0.0", "@commitlint/config-conventional": "^8.2.0",
"@types/jest": "^24.0.13", "@types/jest": "^24.0.13",
"codecov": "^3.5.0", "codecov": "^3.6.1",
"commitlint": "^8.0.0", "commitlint": "^8.2.0",
"core-js": "^3.2.1", "core-js": "^3.2.1",
"eslint": "^5.16.0", "eslint": "^6.5.1",
"eslint-config-satya164": "^2.4.1", "eslint-config-satya164": "^3.1.2",
"husky": "^2.4.0", "husky": "^3.0.8",
"jest": "^24.8.0", "jest": "^24.8.0",
"lerna": "^3.16.4", "lerna": "^3.16.4",
"prettier": "^1.18.2", "prettier": "^1.18.2",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"resolutions": { "resolutions": {
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10"
"react-native-safe-area-view": "0.14.7"
}, },
"husky": { "husky": {
"hooks": { "hooks": {

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.12](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.11...@react-navigation/bottom-tabs@5.0.0-alpha.12) (2019-10-03)
**Note:** Version bump only for package @react-navigation/bottom-tabs
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.10...@react-navigation/bottom-tabs@5.0.0-alpha.11) (2019-10-03)
**Note:** Version bump only for package @react-navigation/bottom-tabs
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.9...@react-navigation/bottom-tabs@5.0.0-alpha.10) (2019-09-27) # [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/bottom-tabs@5.0.0-alpha.9...@react-navigation/bottom-tabs@5.0.0-alpha.10) (2019-09-27)

View File

@@ -10,6 +10,30 @@ Open a Terminal in your project's folder and run,
yarn add @react-navigation/core @react-navigation/bottom-tabs yarn add @react-navigation/core @react-navigation/bottom-tabs
``` ```
Now we need to install [`react-native-safe-area-context`](https://github.com/th3rdwave/react-native-safe-area-context).
If you are using Expo, to ensure that you get the compatible versions of the libraries, run:
```sh
expo install react-native-safe-area-context
```
If you are not using Expo, run the following:
```sh
yarn add react-native-safe-area-context
```
If you are using Expo, you are done. Otherwise, continue to the next steps.
To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run:
```sh
cd ios
pod install
cd ..
```
## Usage ## Usage
```js ```js

View File

@@ -10,7 +10,7 @@
"android", "android",
"tab" "tab"
], ],
"version": "5.0.0-alpha.10", "version": "5.0.0-alpha.12",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -33,22 +33,23 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8", "@react-navigation/routers": "^5.0.0-alpha.9"
"react-native-safe-area-view": "^0.14.6"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10",
"typescript": "^3.5.3" "react-native-safe-area-context": "^0.3.6",
"typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",
"react": "*", "react": "*",
"react-native": "*" "react-native": "*",
"react-native-safe-area-context": "^0.3.6"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {
"source": "src", "source": "src",

View File

@@ -6,7 +6,6 @@ import {
TextStyle, TextStyle,
ViewStyle, ViewStyle,
} from 'react-native'; } from 'react-native';
import SafeAreaView from 'react-native-safe-area-view';
import { import {
NavigationHelpers, NavigationHelpers,
NavigationProp, NavigationProp,
@@ -234,5 +233,4 @@ export type BottomTabBarProps = BottomTabBarOptions & {
}) => React.ReactNode; }) => React.ReactNode;
activeTintColor: string; activeTintColor: string;
inactiveTintColor: string; inactiveTintColor: string;
safeAreaInset?: React.ComponentProps<typeof SafeAreaView>['forceInset'];
}; };

View File

@@ -8,8 +8,8 @@ import {
ScaledSize, ScaledSize,
Dimensions, Dimensions,
} from 'react-native'; } from 'react-native';
import SafeAreaView from 'react-native-safe-area-view';
import { Route, NavigationContext } from '@react-navigation/core'; import { Route, NavigationContext } from '@react-navigation/core';
import { SafeAreaConsumer } from 'react-native-safe-area-context';
import TabBarIcon from './TabBarIcon'; import TabBarIcon from './TabBarIcon';
import TouchableWithoutFeedbackWrapper from './TouchableWithoutFeedbackWrapper'; import TouchableWithoutFeedbackWrapper from './TouchableWithoutFeedbackWrapper';
@@ -22,9 +22,7 @@ type State = {
visible: Animated.Value; visible: Animated.Value;
}; };
type Props = BottomTabBarProps & { type Props = BottomTabBarProps;
safeAreaInset: React.ComponentProps<typeof SafeAreaView>['forceInset'];
};
const majorVersion = parseInt(Platform.Version as string, 10); const majorVersion = parseInt(Platform.Version as string, 10);
const isIos = Platform.OS === 'ios'; const isIos = Platform.OS === 'ios';
@@ -43,9 +41,6 @@ export default class TabBarBottom extends React.Component<Props, State> {
showIcon: true, showIcon: true,
allowFontScaling: true, allowFontScaling: true,
adaptive: isIOS11, adaptive: isIOS11,
safeAreaInset: { bottom: 'always', top: 'never' } as React.ComponentProps<
typeof SafeAreaView
>['forceInset'],
}; };
state = { state = {
@@ -270,100 +265,101 @@ export default class TabBarBottom extends React.Component<Props, State> {
getAccessibilityStates, getAccessibilityStates,
getButtonComponent, getButtonComponent,
getTestID, getTestID,
safeAreaInset,
style, style,
tabStyle, tabStyle,
} = this.props; } = this.props;
const { routes } = state; const { routes } = state;
const tabBarStyle = [
styles.tabBar,
// @ts-ignore
this.shouldUseHorizontalLabels() && !Platform.isPad
? styles.tabBarCompact
: styles.tabBarRegular,
style,
];
return ( return (
<Animated.View <SafeAreaConsumer>
style={[ {insets => (
styles.container, <Animated.View
keyboardHidesTabBar style={[
? // eslint-disable-next-line react-native/no-inline-styles styles.tabBar,
keyboardHidesTabBar
? {
// When the keyboard is shown, slide down the tab bar
transform: [
{
translateY: this.state.visible.interpolate({
inputRange: [0, 1],
outputRange: [this.state.layout.height, 0],
}),
},
],
// Absolutely position the tab bar so that the content is below it
// This is needed to avoid gap at bottom when the tab bar is hidden
position: this.state.keyboard ? 'absolute' : null,
}
: null,
{ {
// When the keyboard is shown, slide down the tab bar height:
transform: [ // @ts-ignore
{ (this.shouldUseHorizontalLabels() && !Platform.isPad
translateY: this.state.visible.interpolate({ ? COMPACT_HEIGHT
inputRange: [0, 1], : DEFAULT_HEIGHT) + (insets ? insets.bottom : 0),
outputRange: [this.state.layout.height, 0], paddingBottom: insets ? insets.bottom : 0,
}), },
}, style,
], ]}
// Absolutely position the tab bar so that the content is below it pointerEvents={
// This is needed to avoid gap at bottom when the tab bar is hidden keyboardHidesTabBar && this.state.keyboard ? 'none' : 'auto'
position: this.state.keyboard ? 'absolute' : null, }
} onLayout={this.handleLayout}
: null, >
]} {routes.map((route, index) => {
pointerEvents={ const focused = index === state.index;
keyboardHidesTabBar && this.state.keyboard ? 'none' : 'auto' const scene = { route, focused };
} const accessibilityLabel = getAccessibilityLabel({
onLayout={this.handleLayout} route,
> });
<SafeAreaView style={tabBarStyle} forceInset={safeAreaInset}>
{routes.map((route, index) => {
const focused = index === state.index;
const scene = { route, focused };
const accessibilityLabel = getAccessibilityLabel({
route,
});
const accessibilityRole = getAccessibilityRole({ const accessibilityRole = getAccessibilityRole({
route, route,
}); });
const accessibilityStates = getAccessibilityStates(scene); const accessibilityStates = getAccessibilityStates(scene);
const testID = getTestID({ route }); const testID = getTestID({ route });
const backgroundColor = focused const backgroundColor = focused
? activeBackgroundColor ? activeBackgroundColor
: inactiveBackgroundColor; : inactiveBackgroundColor;
const ButtonComponent = const ButtonComponent =
getButtonComponent({ route }) || TouchableWithoutFeedbackWrapper; getButtonComponent({ route }) ||
TouchableWithoutFeedbackWrapper;
return ( return (
<NavigationContext.Provider <NavigationContext.Provider
key={route.key} key={route.key}
value={descriptors[route.key].navigation} value={descriptors[route.key].navigation}
>
<ButtonComponent
onPress={() => onTabPress({ route })}
onLongPress={() => onTabLongPress({ route })}
testID={testID}
accessibilityLabel={accessibilityLabel}
accessibilityRole={accessibilityRole}
accessibilityStates={accessibilityStates}
style={[
styles.tab,
{ backgroundColor },
this.shouldUseHorizontalLabels()
? styles.tabLandscape
: styles.tabPortrait,
tabStyle,
]}
> >
{this.renderIcon(scene)} <ButtonComponent
{this.renderLabel(scene)} onPress={() => onTabPress({ route })}
</ButtonComponent> onLongPress={() => onTabLongPress({ route })}
</NavigationContext.Provider> testID={testID}
); accessibilityLabel={accessibilityLabel}
})} accessibilityRole={accessibilityRole}
</SafeAreaView> accessibilityStates={accessibilityStates}
</Animated.View> style={[
styles.tab,
{ backgroundColor },
this.shouldUseHorizontalLabels()
? styles.tabLandscape
: styles.tabPortrait,
tabStyle,
]}
>
{this.renderIcon(scene)}
{this.renderLabel(scene)}
</ButtonComponent>
</NavigationContext.Provider>
);
})}
</Animated.View>
)}
</SafeAreaConsumer>
); );
} }
} }
@@ -373,23 +369,15 @@ const COMPACT_HEIGHT = 29;
const styles = StyleSheet.create({ const styles = StyleSheet.create({
tabBar: { tabBar: {
left: 0,
right: 0,
bottom: 0,
backgroundColor: '#fff', backgroundColor: '#fff',
borderTopWidth: StyleSheet.hairlineWidth, borderTopWidth: StyleSheet.hairlineWidth,
borderTopColor: 'rgba(0, 0, 0, .3)', borderTopColor: 'rgba(0, 0, 0, .3)',
flexDirection: 'row', flexDirection: 'row',
},
container: {
left: 0,
right: 0,
bottom: 0,
elevation: 8, elevation: 8,
}, },
tabBarCompact: {
height: COMPACT_HEIGHT,
},
tabBarRegular: {
height: DEFAULT_HEIGHT,
},
tab: { tab: {
flex: 1, flex: 1,
alignItems: isIos ? 'center' : 'stretch', alignItems: isIos ? 'center' : 'stretch',

View File

@@ -9,6 +9,7 @@ import { Route, CommonActions } from '@react-navigation/core';
import { TabNavigationState } from '@react-navigation/routers'; import { TabNavigationState } from '@react-navigation/routers';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import { ScreenContainer } from 'react-native-screens'; import { ScreenContainer } from 'react-native-screens';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import BottomTabBar from './BottomTabBar'; import BottomTabBar from './BottomTabBar';
import { import {
@@ -198,29 +199,31 @@ export default class BottomTabView extends React.Component<Props, State> {
const { loaded } = this.state; const { loaded } = this.state;
return ( return (
<View style={styles.container}> <SafeAreaProvider>
<ScreenContainer style={styles.pages}> <View style={styles.container}>
{routes.map((route, index) => { <ScreenContainer style={styles.pages}>
if (lazy && !loaded.includes(index)) { {routes.map((route, index) => {
// Don't render a screen if we've never navigated to it if (lazy && !loaded.includes(index)) {
return null; // Don't render a screen if we've never navigated to it
} return null;
}
const isFocused = state.index === index; const isFocused = state.index === index;
return ( return (
<ResourceSavingScene <ResourceSavingScene
key={route.key} key={route.key}
style={StyleSheet.absoluteFill} style={StyleSheet.absoluteFill}
isVisible={isFocused} isVisible={isFocused}
> >
{descriptors[route.key].render()} {descriptors[route.key].render()}
</ResourceSavingScene> </ResourceSavingScene>
); );
})} })}
</ScreenContainer> </ScreenContainer>
{this.renderTabBar()} {this.renderTabBar()}
</View> </View>
</SafeAreaProvider>
); );
} }
} }

View File

@@ -24,12 +24,7 @@ export default class ResourceSavingScene extends React.Component<Props> {
return ( return (
<View <View
style={[ style={[styles.container, style, { opacity: isVisible ? 1 : 0 }]}
styles.container,
style,
// eslint-disable-next-line react-native/no-inline-styles
{ opacity: isVisible ? 1 : 0 },
]}
collapsable={false} collapsable={false}
removeClippedSubviews={ removeClippedSubviews={
// On iOS, set removeClippedSubviews to true only when not focused // On iOS, set removeClippedSubviews to true only when not focused

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.6](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.5...@react-navigation/compat@5.0.0-alpha.6) (2019-10-03)
**Note:** Version bump only for package @react-navigation/compat
# [5.0.0-alpha.5](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.4...@react-navigation/compat@5.0.0-alpha.5) (2019-10-03)
**Note:** Version bump only for package @react-navigation/compat
# [5.0.0-alpha.4](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.3...@react-navigation/compat@5.0.0-alpha.4) (2019-09-27) # [5.0.0-alpha.4](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/compat@5.0.0-alpha.3...@react-navigation/compat@5.0.0-alpha.4) (2019-09-27)
**Note:** Version bump only for package @react-navigation/compat **Note:** Version bump only for package @react-navigation/compat

View File

@@ -1,7 +1,7 @@
{ {
"name": "@react-navigation/compat", "name": "@react-navigation/compat",
"description": "Compatibility layer to write navigator definitions in static configuration format", "description": "Compatibility layer to write navigator definitions in static configuration format",
"version": "5.0.0-alpha.4", "version": "5.0.0-alpha.6",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -24,16 +24,16 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8" "@react-navigation/routers": "^5.0.0-alpha.9"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^16.8.19", "@types/react": "^16.9.4",
"react": "^16.8.3", "react": "^16.10.1",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",
"react": "^16.8.3" "react": "^16.10.1"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {
"source": "src", "source": "src",

View File

@@ -3,6 +3,31 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.13](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.12...@react-navigation/core@5.0.0-alpha.13) (2019-10-03)
**Note:** Version bump only for package @react-navigation/core
# [5.0.0-alpha.12](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.11...@react-navigation/core@5.0.0-alpha.12) (2019-10-03)
### Bug Fixes
* don't merge state with existing state during reset. fixes [#111](https://github.com/react-navigation/navigation-ex/issues/111) ([7393464](https://github.com/react-navigation/navigation-ex/commit/7393464))
* don't throw when switching navigator. fixes [#91](https://github.com/react-navigation/navigation-ex/issues/91) ([19be2b4](https://github.com/react-navigation/navigation-ex/commit/19be2b4))
### Features
* add a getRootState method ([#119](https://github.com/react-navigation/navigation-ex/issues/119)) ([7a5bcb4](https://github.com/react-navigation/navigation-ex/commit/7a5bcb4))
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.10...@react-navigation/core@5.0.0-alpha.11) (2019-09-27) # [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/core@5.0.0-alpha.10...@react-navigation/core@5.0.0-alpha.11) (2019-09-27)

View File

@@ -6,7 +6,7 @@
"react-native", "react-native",
"react-navigation" "react-navigation"
], ],
"version": "5.0.0-alpha.11", "version": "5.0.0-alpha.13",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -31,22 +31,22 @@
"dependencies": { "dependencies": {
"escape-string-regexp": "^2.0.0", "escape-string-regexp": "^2.0.0",
"query-string": "^6.8.3", "query-string": "^6.8.3",
"shortid": "^2.2.14", "shortid": "^2.2.15",
"use-subscription": "^1.0.0" "use-subscription": "^1.1.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.4.5", "@babel/core": "^7.6.2",
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.19", "@types/react": "^16.9.4",
"@types/shortid": "^0.0.29", "@types/shortid": "^0.0.29",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "^16.8.3", "react": "^16.10.1",
"react-native-testing-library": "^1.9.1", "react-native-testing-library": "^1.9.1",
"react-test-renderer": "16.8.3", "react-test-renderer": "16.10.1",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^16.8.3" "react": "^16.10.1"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {
"source": "src", "source": "src",

View File

@@ -1,5 +1,5 @@
import shortid from 'shortid'; import shortid from 'shortid';
import { CommonAction, NavigationState } from './types'; import { CommonAction, NavigationState, PartialState } from './types';
/** /**
* Base router object that can be used when writing custom routers. * Base router object that can be used when writing custom routers.
@@ -9,7 +9,7 @@ const BaseRouter = {
getStateForAction<State extends NavigationState>( getStateForAction<State extends NavigationState>(
state: State, state: State,
action: CommonAction action: CommonAction
): State | null { ): State | PartialState<State> | null {
switch (action.type) { switch (action.type) {
case 'REPLACE': { case 'REPLACE': {
const index = action.source const index = action.source
@@ -56,12 +56,7 @@ const BaseRouter = {
} }
case 'RESET': case 'RESET':
return { return action.payload as PartialState<State>;
...state,
...action.payload,
key: state.key,
routeNames: state.routeNames,
};
default: default:
return null; return null;

View File

@@ -1,3 +1,4 @@
// eslint-disable-next-line import/no-cycle
import { NavigationState, PartialState } from './types'; import { NavigationState, PartialState } from './types';
export type Action = export type Action =

View File

@@ -18,25 +18,30 @@ export const SingleNavigatorContext = React.createContext<
* Component which ensures that there's only one navigator nested under it. * Component which ensures that there's only one navigator nested under it.
*/ */
export default function EnsureSingleNavigator({ children }: Props) { export default function EnsureSingleNavigator({ children }: Props) {
const [currentKey, setCurrentKey] = React.useState<string | undefined>(); const navigatorKeyRef = React.useRef<string | undefined>();
const value = React.useMemo( const value = React.useMemo(
() => ({ () => ({
register(key: string) { register(key: string) {
const currentKey = navigatorKeyRef.current;
if (currentKey !== undefined && key !== currentKey) { if (currentKey !== undefined && key !== currentKey) {
throw new Error(MULTIPLE_NAVIGATOR_ERROR); throw new Error(MULTIPLE_NAVIGATOR_ERROR);
} }
setCurrentKey(key); navigatorKeyRef.current = key;
}, },
unregister(key: string) { unregister(key: string) {
if (currentKey !== undefined && key !== currentKey) { const currentKey = navigatorKeyRef.current;
throw new Error(MULTIPLE_NAVIGATOR_ERROR);
if (key !== currentKey) {
return;
} }
setCurrentKey(undefined); navigatorKeyRef.current = undefined;
}, },
}), }),
[currentKey] []
); );
return ( return (

View File

@@ -1,5 +1,10 @@
import * as React from 'react'; import * as React from 'react';
import { NavigationAction, NavigationHelpers, ParamListBase } from './types'; import {
NavigationAction,
NavigationHelpers,
NavigationState,
ParamListBase,
} from './types';
export type ChildActionListener = ( export type ChildActionListener = (
action: NavigationAction, action: NavigationAction,
@@ -14,6 +19,8 @@ export type FocusedNavigationListener = <T>(
callback: FocusedNavigationCallback<T> callback: FocusedNavigationCallback<T>
) => { handled: boolean; result: T }; ) => { handled: boolean; result: T };
export type NavigatorStateGetter = () => NavigationState;
/** /**
* Context which holds the required helpers needed to build nested navigators. * Context which holds the required helpers needed to build nested navigators.
*/ */
@@ -25,6 +32,7 @@ const NavigationBuilderContext = React.createContext<{
addActionListener?: (listener: ChildActionListener) => void; addActionListener?: (listener: ChildActionListener) => void;
addFocusedListener?: (listener: FocusedNavigationListener) => void; addFocusedListener?: (listener: FocusedNavigationListener) => void;
onRouteFocus?: (key: string) => void; onRouteFocus?: (key: string) => void;
addStateGetter?: (key: string, getter: NavigatorStateGetter) => void;
trackAction: (action: NavigationAction) => void; trackAction: (action: NavigationAction) => void;
}>({ }>({
trackAction: () => undefined, trackAction: () => undefined,

View File

@@ -5,6 +5,7 @@ import NavigationBuilderContext from './NavigationBuilderContext';
import ResetRootContext from './ResetRootContext'; import ResetRootContext from './ResetRootContext';
import useFocusedListeners from './useFocusedListeners'; import useFocusedListeners from './useFocusedListeners';
import useDevTools from './useDevTools'; import useDevTools from './useDevTools';
import useStateGetters from './useStateGetters';
import { import {
Route, Route,
@@ -24,7 +25,9 @@ const MISSING_CONTEXT_ERROR =
export const NavigationStateContext = React.createContext<{ export const NavigationStateContext = React.createContext<{
state?: NavigationState | PartialState<NavigationState>; state?: NavigationState | PartialState<NavigationState>;
getState: () => NavigationState | PartialState<NavigationState> | undefined; getState: () => NavigationState | PartialState<NavigationState> | undefined;
setState: (state: NavigationState | undefined) => void; setState: (
state: NavigationState | PartialState<NavigationState> | undefined
) => void;
key?: string; key?: string;
performTransaction: (action: () => void) => void; performTransaction: (action: () => void) => void;
}>({ }>({
@@ -106,6 +109,8 @@ const Container = React.forwardRef(function NavigationContainer(
const { listeners, addListener: addFocusedListener } = useFocusedListeners(); const { listeners, addListener: addFocusedListener } = useFocusedListeners();
const { getStateForRoute, addStateGetter } = useStateGetters();
const dispatch = ( const dispatch = (
action: NavigationAction | ((state: NavigationState) => NavigationAction) action: NavigationAction | ((state: NavigationState) => NavigationAction)
) => { ) => {
@@ -132,13 +137,16 @@ const Container = React.forwardRef(function NavigationContainer(
[trackAction] [trackAction]
); );
const getRootState = () => {
return getStateForRoute('root');
};
React.useImperativeHandle(ref, () => ({ React.useImperativeHandle(ref, () => ({
...(Object.keys(CommonActions) as Array<keyof typeof CommonActions>).reduce< ...(Object.keys(CommonActions) as Array<keyof typeof CommonActions>).reduce<
any any
>((acc, name) => { >((acc, name) => {
acc[name] = (...args: any[]) => acc[name] = (...args: any[]) =>
dispatch( dispatch(
// eslint-disable-next-line import/namespace
CommonActions[name]( CommonActions[name](
// @ts-ignore // @ts-ignore
...args ...args
@@ -149,14 +157,16 @@ const Container = React.forwardRef(function NavigationContainer(
resetRoot, resetRoot,
dispatch, dispatch,
canGoBack, canGoBack,
getRootState,
})); }));
const builderContext = React.useMemo( const builderContext = React.useMemo(
() => ({ () => ({
addFocusedListener, addFocusedListener,
addStateGetter,
trackAction, trackAction,
}), }),
[addFocusedListener, trackAction] [addFocusedListener, trackAction, addStateGetter]
); );
const performTransaction = React.useCallback((callback: () => void) => { const performTransaction = React.useCallback((callback: () => void) => {

View File

@@ -47,7 +47,7 @@ export default function SceneView<
}, [getState, route.key]); }, [getState, route.key]);
const setCurrentState = React.useCallback( const setCurrentState = React.useCallback(
(child: NavigationState | undefined) => { (child: NavigationState | PartialState<NavigationState> | undefined) => {
const state = getState(); const state = getState();
setState({ setState({

View File

@@ -125,15 +125,5 @@ it('resets state to new state with RESET', () => {
}) })
); );
expect(result).toEqual({ ...STATE, index: 0, routes }); expect(result).toEqual({ index: 0, routes });
});
it('ignores key and routeNames when resetting with RESET', () => {
const result = BaseRouter.getStateForAction(
STATE,
// @ts-ignore
CommonActions.reset({ index: 2, key: 'foo', routeNames: ['test'] })
);
expect(result).toEqual({ ...STATE, index: 2 });
}); });

View File

@@ -321,3 +321,56 @@ it('handle resetting state with ref', () => {
expect(onStateChange).toBeCalledTimes(1); expect(onStateChange).toBeCalledTimes(1);
expect(onStateChange).lastCalledWith(state); expect(onStateChange).lastCalledWith(state);
}); });
it('handle getRootState', () => {
const TestNavigator = (props: any) => {
const { state, descriptors } = useNavigationBuilder(MockRouter, props);
return descriptors[state.routes[state.index].key].render();
};
const ref = React.createRef<NavigationContainerRef>();
const element = (
<NavigationContainer ref={ref}>
<TestNavigator initialRouteName="foo">
<Screen name="foo">
{() => (
<TestNavigator>
<Screen name="qux" component={() => null} />
<Screen name="lex" component={() => null} />
</TestNavigator>
)}
</Screen>
<Screen name="bar" component={() => null} />
</TestNavigator>
</NavigationContainer>
);
render(element);
let state;
if (ref.current) {
state = ref.current.getRootState();
}
expect(state).toEqual({
index: 0,
key: '7',
routeNames: ['foo', 'bar'],
routes: [
{
key: 'foo',
name: 'foo',
state: {
index: 0,
key: '8',
routeNames: ['qux', 'lex'],
routes: [{ key: 'qux', name: 'qux' }, { key: 'lex', name: 'lex' }],
stale: false,
},
},
{ key: 'bar', name: 'bar' },
],
stale: false,
});
});

View File

@@ -655,6 +655,7 @@ it('throws when a React Element is not the direct children', () => {
); );
}); });
// eslint-disable-next-line jest/expect-expect
it("doesn't throw when direct children is Screen or empty element", () => { it("doesn't throw when direct children is Screen or empty element", () => {
const TestNavigator = (props: any) => { const TestNavigator = (props: any) => {
useNavigationBuilder(MockRouter, props); useNavigationBuilder(MockRouter, props);
@@ -694,3 +695,30 @@ it('throws when multiple screens with same name are defined', () => {
"A navigator cannot contain multiple 'Screen' components with the same name (found duplicate screen named 'foo')" "A navigator cannot contain multiple 'Screen' components with the same name (found duplicate screen named 'foo')"
); );
}); });
it('switches rendered navigators', () => {
const TestNavigator = (props: any) => {
useNavigationBuilder(MockRouter, props);
return null;
};
const root = render(
<NavigationContainer>
<TestNavigator key="a">
<Screen name="foo" component={jest.fn()} />
</TestNavigator>
</NavigationContainer>
);
expect(() =>
root.update(
<NavigationContainer>
<TestNavigator key="b">
<Screen name="foo" component={jest.fn()} />
</TestNavigator>
</NavigationContainer>
)
).not.toThrowError(
'Another navigator is already registered for this container.'
);
});

View File

@@ -273,7 +273,11 @@ it('fires blur event when a route is removed with a delay', async () => {
const [previous, dispatch] = React.useReducer( const [previous, dispatch] = React.useReducer(
(state, action) => { (state, action) => {
return { ...state, ...action }; if (state.routes !== action.routes) {
return { ...state, ...action };
}
return state;
}, },
{ routes: state.routes, descriptors } { routes: state.routes, descriptors }
); );

View File

@@ -296,6 +296,7 @@ it("action doesn't bubble if target is specified", () => {
expect(onStateChange).not.toBeCalled(); expect(onStateChange).not.toBeCalled();
}); });
// eslint-disable-next-line jest/expect-expect
it("doesn't crash if no navigator handled the action", () => { it("doesn't crash if no navigator handled the action", () => {
const TestRouter = MockRouter; const TestRouter = MockRouter;

View File

@@ -1,3 +1,4 @@
// eslint-disable-next-line import/no-cycle
import * as CommonActions from './CommonActions'; import * as CommonActions from './CommonActions';
import * as React from 'react'; import * as React from 'react';
@@ -170,7 +171,10 @@ export type Router<
* @param state State object to apply the action on. * @param state State object to apply the action on.
* @param action Action object to apply. * @param action Action object to apply.
*/ */
getStateForAction(state: State, action: Action): State | null; getStateForAction(
state: State,
action: Action
): State | PartialState<State> | null;
/** /**
* Whether the action should also change focus in parent navigator * Whether the action should also change focus in parent navigator
@@ -534,6 +538,7 @@ export type NavigationContainerRef =
* @param state Navigation state object. * @param state Navigation state object.
*/ */
resetRoot(state: PartialState<NavigationState> | NavigationState): void; resetRoot(state: PartialState<NavigationState> | NavigationState): void;
getRootState(): NavigationState;
} }
| undefined | undefined
| null; | null;

View File

@@ -3,6 +3,7 @@ import SceneView from './SceneView';
import NavigationBuilderContext, { import NavigationBuilderContext, {
ChildActionListener, ChildActionListener,
FocusedNavigationListener, FocusedNavigationListener,
NavigatorStateGetter,
} from './NavigationBuilderContext'; } from './NavigationBuilderContext';
import { NavigationEventEmitter } from './useEventEmitter'; import { NavigationEventEmitter } from './useEventEmitter';
import useNavigationCache from './useNavigationCache'; import useNavigationCache from './useNavigationCache';
@@ -35,6 +36,7 @@ type Options<State extends NavigationState, ScreenOptions extends object> = {
setState: (state: State) => void; setState: (state: State) => void;
addActionListener: (listener: ChildActionListener) => void; addActionListener: (listener: ChildActionListener) => void;
addFocusedListener: (listener: FocusedNavigationListener) => void; addFocusedListener: (listener: FocusedNavigationListener) => void;
addStateGetter: (key: string, getter: NavigatorStateGetter) => void;
onRouteFocus: (key: string) => void; onRouteFocus: (key: string) => void;
router: Router<State, NavigationAction>; router: Router<State, NavigationAction>;
emitter: NavigationEventEmitter; emitter: NavigationEventEmitter;
@@ -61,6 +63,7 @@ export default function useDescriptors<
setState, setState,
addActionListener, addActionListener,
addFocusedListener, addFocusedListener,
addStateGetter,
onRouteFocus, onRouteFocus,
router, router,
emitter, emitter,
@@ -74,6 +77,7 @@ export default function useDescriptors<
onAction, onAction,
addActionListener, addActionListener,
addFocusedListener, addFocusedListener,
addStateGetter,
onRouteFocus, onRouteFocus,
trackAction, trackAction,
}), }),
@@ -83,6 +87,7 @@ export default function useDescriptors<
addActionListener, addActionListener,
addFocusedListener, addFocusedListener,
onRouteFocus, onRouteFocus,
addStateGetter,
trackAction, trackAction,
] ]
); );

View File

@@ -18,6 +18,7 @@ type DevTools = {
}; };
declare global { declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace NodeJS { namespace NodeJS {
interface Global { interface Global {
__REDUX_DEVTOOLS_EXTENSION__: __REDUX_DEVTOOLS_EXTENSION__:

View File

@@ -23,6 +23,8 @@ import {
PrivateValueStore, PrivateValueStore,
NavigationAction, NavigationAction,
} from './types'; } from './types';
import useStateGetters from './useStateGetters';
import useOnGetState from './useOnGetState';
// This is to make TypeScript compiler happy // This is to make TypeScript compiler happy
// eslint-disable-next-line babel/no-unused-expressions // eslint-disable-next-line babel/no-unused-expressions
@@ -227,6 +229,8 @@ export default function useNavigationBuilder<
addListener: addFocusedListener, addListener: addFocusedListener,
} = useFocusedListeners(); } = useFocusedListeners();
const { getStateForRoute, addStateGetter } = useStateGetters();
const onAction = useOnAction({ const onAction = useOnAction({
router, router,
getState, getState,
@@ -254,6 +258,11 @@ export default function useNavigationBuilder<
focusedListeners, focusedListeners,
}); });
useOnGetState({
getState,
getStateForRoute,
});
const descriptors = useDescriptors<State, ScreenOptions>({ const descriptors = useDescriptors<State, ScreenOptions>({
state, state,
screens, screens,
@@ -265,6 +274,7 @@ export default function useNavigationBuilder<
onRouteFocus, onRouteFocus,
addActionListener, addActionListener,
addFocusedListener, addFocusedListener,
addStateGetter,
router, router,
emitter, emitter,
}); });

View File

@@ -2,13 +2,18 @@ import * as React from 'react';
import NavigationBuilderContext, { import NavigationBuilderContext, {
ChildActionListener, ChildActionListener,
} from './NavigationBuilderContext'; } from './NavigationBuilderContext';
import { NavigationAction, NavigationState, Router } from './types'; import {
NavigationAction,
NavigationState,
PartialState,
Router,
} from './types';
type Options = { type Options = {
router: Router<NavigationState, NavigationAction>; router: Router<NavigationState, NavigationAction>;
key?: string; key?: string;
getState: () => NavigationState; getState: () => NavigationState;
setState: (state: NavigationState) => void; setState: (state: NavigationState | PartialState<NavigationState>) => void;
listeners: ChildActionListener[]; listeners: ChildActionListener[];
}; };

View File

@@ -0,0 +1,31 @@
import * as React from 'react';
import NavigationBuilderContext from './NavigationBuilderContext';
import { NavigationState } from './types';
import NavigationRouteContext from './NavigationRouteContext';
export default function useOnGetState({
getStateForRoute,
getState,
}: {
getStateForRoute: (routeName: string) => NavigationState | undefined;
getState: () => NavigationState;
}) {
const { addStateGetter } = React.useContext(NavigationBuilderContext);
const route = React.useContext(NavigationRouteContext);
const key = route ? route.key : 'root';
const getter = React.useCallback(() => {
const state = getState();
return {
...state,
routes: state.routes.map(route => ({
...route,
state: getStateForRoute(route.key),
})),
};
}, [getState, getStateForRoute]);
React.useEffect(() => {
return addStateGetter && addStateGetter(key, getter);
}, [addStateGetter, getter, key]);
}

View File

@@ -0,0 +1,35 @@
import * as React from 'react';
import { NavigatorStateGetter } from './NavigationBuilderContext';
/**
* Hook which lets child navigators add getters to be called for obtaining rehydrated state.
*/
export default function useStateGetters() {
const stateGetters = React.useRef<Record<string, NavigatorStateGetter>>({});
const getStateForRoute = React.useCallback(
routeKey =>
stateGetters.current[routeKey] === undefined
? undefined
: stateGetters.current[routeKey](),
[stateGetters]
);
const addStateGetter = React.useCallback(
(key: string, getter: NavigatorStateGetter) => {
stateGetters.current[key] = getter;
return () => {
// @ts-ignore
stateGetters.current[key] = undefined;
};
},
[]
);
return {
getStateForRoute,
addStateGetter,
};
}

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.12](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.11...@react-navigation/drawer@5.0.0-alpha.12) (2019-10-03)
**Note:** Version bump only for package @react-navigation/drawer
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.10...@react-navigation/drawer@5.0.0-alpha.11) (2019-10-03)
**Note:** Version bump only for package @react-navigation/drawer
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.9...@react-navigation/drawer@5.0.0-alpha.10) (2019-09-27) # [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/drawer@5.0.0-alpha.9...@react-navigation/drawer@5.0.0-alpha.10) (2019-09-27)

View File

@@ -10,44 +10,29 @@ Open a Terminal in your project's folder and run,
yarn add @react-navigation/core @react-navigation/drawer yarn add @react-navigation/core @react-navigation/drawer
``` ```
Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler) and [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated). Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler), [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated) and [`react-native-safe-area-context`](https://github.com/th3rdwave/react-native-safe-area-context).
If you are using Expo, to ensure that you get the compatible versions of the libraries, run: If you are using Expo, to ensure that you get the compatible versions of the libraries, run:
```sh ```sh
expo install react-native-gesture-handler react-native-reanimated expo install react-native-gesture-handler react-native-reanimated react-native-safe-area-context
``` ```
If you are not using Expo, run the following: If you are not using Expo, run the following:
```sh ```sh
yarn add react-native-reanimated react-native-gesture-handler yarn add react-native-reanimated react-native-gesture-handler react-native-safe-area-context
``` ```
If you are using Expo, you are done. Otherwise, continue to the next steps. If you are using Expo, you are done. Otherwise, continue to the next steps.
Next, we need to link these libraries. The steps depends on your React Native version: To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run:
- **React Native 0.60 and higher** ```sh
cd ios
On newer versions of React Native, [linking is automatic](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md). pod install
cd ..
To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run: ```
```sh
cd ios
pod install
cd ..
```
- **React Native 0.59**
If you're on an older React Native version, you need to manually link the dependencies. To do that, run:
```sh
react-native link react-native-reanimated
react-native link react-native-gesture-handler
```
**IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation. **IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation.

View File

@@ -11,7 +11,7 @@
"material", "material",
"drawer" "drawer"
], ],
"version": "5.0.0-alpha.10", "version": "5.0.0-alpha.12",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,20 +34,20 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8", "@react-navigation/routers": "^5.0.0-alpha.9"
"react-native-safe-area-view": "^0.14.6"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10",
"react-native-gesture-handler": "^1.3.0", "react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.1.0", "react-native-reanimated": "^1.3.0",
"react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^1.0.0-alpha.22", "react-native-screens": "^1.0.0-alpha.22",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",
@@ -55,6 +55,7 @@
"react-native": "*", "react-native": "*",
"react-native-gesture-handler": "^1.0.0", "react-native-gesture-handler": "^1.0.0",
"react-native-reanimated": "^1.0.0", "react-native-reanimated": "^1.0.0",
"react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^1.0.0-alpha.0" "react-native-screens": "^1.0.0-alpha.0"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {

View File

@@ -578,7 +578,6 @@ export default class DrawerView extends React.PureComponent<Props> {
style={[ style={[
styles.container, styles.container,
right ? { right: offset } : { left: offset }, right ? { right: offset } : { left: offset },
// eslint-disable-next-line react-native/no-inline-styles
{ {
transform: [{ translateX: drawerTranslateX }], transform: [{ translateX: drawerTranslateX }],
opacity: this.drawerOpacity, opacity: this.drawerOpacity,

View File

@@ -1,6 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import { View, Text, StyleSheet } from 'react-native'; import { View, Text, StyleSheet } from 'react-native';
import SafeAreaView from 'react-native-safe-area-view'; import { useSafeArea } from 'react-native-safe-area-context';
import TouchableItem from './TouchableItem'; import TouchableItem from './TouchableItem';
import { DrawerNavigationItemsProps } from '../types'; import { DrawerNavigationItemsProps } from '../types';
@@ -25,63 +25,72 @@ const DrawerNavigatorItems = ({
inactiveLabelStyle, inactiveLabelStyle,
iconContainerStyle, iconContainerStyle,
drawerPosition, drawerPosition,
}: DrawerNavigationItemsProps) => ( }: DrawerNavigationItemsProps) => {
<View style={[styles.container, itemsContainerStyle]}> const insets = useSafeArea();
{items.map((route, index: number) => {
const focused = activeItemKey === route.key; return (
const color = focused ? activeTintColor : inactiveTintColor; <View style={[styles.container, itemsContainerStyle]}>
const backgroundColor = focused {items.map((route, index: number) => {
? activeBackgroundColor const focused = activeItemKey === route.key;
: inactiveBackgroundColor; const color = focused ? activeTintColor : inactiveTintColor;
const scene = { route, index, focused, tintColor: color }; const backgroundColor = focused
const icon = renderIcon(scene); ? activeBackgroundColor
const label = getLabel(scene); : inactiveBackgroundColor;
const accessibilityLabel = typeof label === 'string' ? label : undefined; const scene = { route, index, focused, tintColor: color };
const extraLabelStyle = focused ? activeLabelStyle : inactiveLabelStyle; const icon = renderIcon(scene);
return ( const label = getLabel(scene);
<TouchableItem const accessibilityLabel =
key={route.key} typeof label === 'string' ? label : undefined;
accessible const extraLabelStyle = focused ? activeLabelStyle : inactiveLabelStyle;
accessibilityLabel={accessibilityLabel}
onPress={() => { return (
onItemPress({ route, focused }); <TouchableItem
}} key={route.key}
delayPressIn={0} accessible
> accessibilityLabel={accessibilityLabel}
<SafeAreaView onPress={() => {
style={[{ backgroundColor }, styles.item, itemStyle]} onItemPress({ route, focused });
forceInset={{
[drawerPosition]: 'always',
[drawerPosition === 'left' ? 'right' : 'left']: 'never',
vertical: 'never',
}} }}
delayPressIn={0}
> >
{icon ? ( <View
<View style={[
style={[ {
styles.icon, backgroundColor,
focused ? null : styles.inactiveIcon, marginLeft: drawerPosition === 'left' ? insets.left : 0,
iconContainerStyle, marginRight: drawerPosition === 'right' ? insets.right : 0,
]} },
> styles.item,
{icon} itemStyle,
</View> ]}
) : null} >
{typeof label === 'string' ? ( {icon ? (
<Text <View
style={[styles.label, { color }, labelStyle, extraLabelStyle]} style={[
> styles.icon,
{label} focused ? null : styles.inactiveIcon,
</Text> iconContainerStyle,
) : ( ]}
label >
)} {icon}
</SafeAreaView> </View>
</TouchableItem> ) : null}
); {typeof label === 'string' ? (
})} <Text
</View> style={[styles.label, { color }, labelStyle, extraLabelStyle]}
); >
{label}
</Text>
) : (
label
)}
</View>
</TouchableItem>
);
})}
</View>
);
};
/* Material design specs - https://material.io/guidelines/patterns/navigation-drawer.html#navigation-drawer-specs */ /* Material design specs - https://material.io/guidelines/patterns/navigation-drawer.html#navigation-drawer-specs */
DrawerNavigatorItems.defaultProps = { DrawerNavigatorItems.defaultProps = {

View File

@@ -1,8 +1,8 @@
import * as React from 'react'; import * as React from 'react';
import { Dimensions, StyleSheet, I18nManager, Platform } from 'react-native'; import { Dimensions, StyleSheet, I18nManager, Platform } from 'react-native';
import { SafeAreaProvider, useSafeArea } from 'react-native-safe-area-context';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import { ScreenContainer } from 'react-native-screens'; import { ScreenContainer } from 'react-native-screens';
import SafeAreaView from 'react-native-safe-area-view';
import { PanGestureHandler, ScrollView } from 'react-native-gesture-handler'; import { PanGestureHandler, ScrollView } from 'react-native-gesture-handler';
import { import {
DrawerNavigationState, DrawerNavigationState,
@@ -32,13 +32,18 @@ type State = {
drawerWidth: number; drawerWidth: number;
}; };
const DefaultContentComponent = (props: ContentComponentProps) => ( const DefaultContentComponent = (props: ContentComponentProps) => {
<ScrollView alwaysBounceVertical={false}> const insets = useSafeArea();
<SafeAreaView forceInset={{ top: 'always', horizontal: 'never' }}>
return (
<ScrollView
alwaysBounceVertical={false}
contentContainerStyle={{ marginTop: insets.top }}
>
<DrawerNavigatorItems {...props} /> <DrawerNavigatorItems {...props} />
</SafeAreaView> </ScrollView>
</ScrollView> );
); };
/** /**
* Component that renders the drawer. * Component that renders the drawer.
@@ -163,7 +168,6 @@ export default class DrawerView extends React.PureComponent<Props, State> {
key={route.key} key={route.key}
style={[ style={[
StyleSheet.absoluteFill, StyleSheet.absoluteFill,
// eslint-disable-next-line react-native/no-inline-styles
{ opacity: isFocused ? 1 : 0 }, { opacity: isFocused ? 1 : 0 },
]} ]}
isVisible={isFocused} isVisible={isFocused}
@@ -209,35 +213,37 @@ export default class DrawerView extends React.PureComponent<Props, State> {
: state.isDrawerOpen; : state.isDrawerOpen;
return ( return (
<DrawerGestureContext.Provider value={this.drawerGestureRef}> <SafeAreaProvider>
<Drawer <DrawerGestureContext.Provider value={this.drawerGestureRef}>
open={isOpen} <Drawer
locked={ open={isOpen}
drawerLockMode === 'locked-open' || locked={
drawerLockMode === 'locked-closed' drawerLockMode === 'locked-open' ||
} drawerLockMode === 'locked-closed'
onOpen={this.handleDrawerOpen} }
onClose={this.handleDrawerClose} onOpen={this.handleDrawerOpen}
onGestureRef={this.setDrawerGestureRef} onClose={this.handleDrawerClose}
gestureHandlerProps={gestureHandlerProps} onGestureRef={this.setDrawerGestureRef}
drawerType={drawerType} gestureHandlerProps={gestureHandlerProps}
drawerPosition={drawerPosition} drawerType={drawerType}
sceneContainerStyle={sceneContainerStyle} drawerPosition={drawerPosition}
drawerStyle={{ sceneContainerStyle={sceneContainerStyle}
backgroundColor: drawerBackgroundColor || 'white', drawerStyle={{
width: this.state.drawerWidth, backgroundColor: drawerBackgroundColor || 'white',
}} width: this.state.drawerWidth,
overlayStyle={{ }}
backgroundColor: overlayColor || 'rgba(0, 0, 0, 0.5)', overlayStyle={{
}} backgroundColor: overlayColor || 'rgba(0, 0, 0, 0.5)',
swipeEdgeWidth={edgeWidth} }}
swipeDistanceThreshold={minSwipeDistance} swipeEdgeWidth={edgeWidth}
hideStatusBar={hideStatusBar} swipeDistanceThreshold={minSwipeDistance}
statusBarAnimation={statusBarAnimation} hideStatusBar={hideStatusBar}
renderDrawerContent={this.renderNavigationView} statusBarAnimation={statusBarAnimation}
renderSceneContent={this.renderContent} renderDrawerContent={this.renderNavigationView}
/> renderSceneContent={this.renderContent}
</DrawerGestureContext.Provider> />
</DrawerGestureContext.Provider>
</SafeAreaProvider>
); );
} }
} }

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.10](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.9...@react-navigation/example@5.0.0-alpha.10) (2019-10-03)
**Note:** Version bump only for package @react-navigation/example
# [5.0.0-alpha.9](https://github.com/satya164/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.8...@react-navigation/example@5.0.0-alpha.9) (2019-10-03)
**Note:** Version bump only for package @react-navigation/example
# [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.7...@react-navigation/example@5.0.0-alpha.8) (2019-09-27) # [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/example@5.0.0-alpha.7...@react-navigation/example@5.0.0-alpha.8) (2019-09-27)

View File

@@ -3,14 +3,13 @@
"name": "@react-navigation/example", "name": "@react-navigation/example",
"slug": "react-navigation-example", "slug": "react-navigation-example",
"privacy": "public", "privacy": "public",
"sdkVersion": "34.0.0", "sdkVersion": "35.0.0",
"platforms": [ "platforms": [
"ios", "ios",
"android", "android",
"web" "web"
], ],
"version": "1.0.0", "version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png", "icon": "./assets/icon.png",
"splash": { "splash": {
"image": "./assets/splash.png", "image": "./assets/splash.png",
@@ -30,4 +29,4 @@
}, },
"displayName": "React Navigation Example", "displayName": "React Navigation Example",
"name": "ReactNavigationExample" "name": "ReactNavigationExample"
} }

View File

@@ -1,5 +1,3 @@
/* eslint-disable import/no-commonjs */
module.exports = function(api) { module.exports = function(api) {
api.cache(true); api.cache(true);
return { return {

View File

@@ -1,4 +1,4 @@
/* eslint-disable import/no-commonjs, import/no-extraneous-dependencies */ /* eslint-disable import/no-extraneous-dependencies */
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
@@ -36,7 +36,7 @@ module.exports = {
'react-native', 'react-native',
'react-native-gesture-handler', 'react-native-gesture-handler',
'react-native-reanimated', 'react-native-reanimated',
'react-native-safe-area-view', 'react-native-safe-area-context',
'react-native-screens', 'react-native-screens',
'react-native-paper', 'react-native-paper',
'react-native-tab-view', 'react-native-tab-view',

View File

@@ -1,7 +1,7 @@
{ {
"name": "@react-navigation/example", "name": "@react-navigation/example",
"description": "Demo app to showcase various functionality of React Navigation", "description": "Demo app to showcase various functionality of React Navigation",
"version": "5.0.0-alpha.8", "version": "5.0.0-alpha.10",
"private": true, "private": true,
"workspaces": { "workspaces": {
"nohoist": [ "nohoist": [
@@ -18,31 +18,29 @@
"dependencies": { "dependencies": {
"@expo/vector-icons": "^10.0.0", "@expo/vector-icons": "^10.0.0",
"@react-native-community/masked-view": "^0.1.1", "@react-native-community/masked-view": "^0.1.1",
"expo": "^34.0.1", "expo": "^35.0.0",
"expo-asset": "~6.0.0", "expo-asset": "~7.0.0",
"query-string": "^6.8.3", "query-string": "^6.8.3",
"react": "16.8.3", "react": "^16.10.1",
"react-dom": "^16.8.3", "react-dom": "^16.10.1",
"react-native": "0.59.10", "react-native": "^0.61.2",
"react-native-gesture-handler": "~1.3.0", "react-native-gesture-handler": "~1.3.0",
"react-native-paper": "^3.0.0-alpha.3", "react-native-paper": "^3.0.0-alpha.3",
"react-native-reanimated": "~1.1.0", "react-native-reanimated": "~1.2.0",
"react-native-screens": "1.0.0-alpha.22", "react-native-safe-area-context": "~0.3.6",
"react-native-tab-view": "2.7.1", "react-native-screens": "~1.0.0-alpha.23",
"react-native-unimodules": "~0.5.2", "react-native-tab-view": "2.10.0",
"scheduler": "^0.14.0", "react-native-unimodules": "^0.7.0-rc.1",
"shortid": "^2.2.14", "scheduler": "^0.16.1",
"use-subscription": "^1.0.0" "shortid": "^2.2.15",
"use-subscription": "^1.1.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.5.5", "@babel/core": "^7.6.2",
"@types/react": "^16.8.23", "@types/react": "^16.9.4",
"@types/react-native": "^0.57.65", "@types/react-native": "^0.60.17",
"babel-preset-expo": "^6.0.0", "babel-preset-expo": "^7.0.0",
"expo-cli": "^3.0.10", "expo-cli": "^3.1.2",
"typescript": "^3.5.3" "typescript": "^3.6.3"
},
"resolutions": {
"react-native-safe-area-view": "0.14.7"
} }
} }

View File

@@ -1,5 +1,3 @@
/* eslint-disable import/namespace, import/default */
import * as React from 'react'; import * as React from 'react';
import { MaterialIcons } from '@expo/vector-icons'; import { MaterialIcons } from '@expo/vector-icons';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

View File

@@ -25,6 +25,7 @@ export default function Albums() {
contentContainerStyle={styles.content} contentContainerStyle={styles.content}
> >
{COVERS.map((source, i) => ( {COVERS.map((source, i) => (
// eslint-disable-next-line react/no-array-index-key
<Image key={i} source={source} style={styles.cover} /> <Image key={i} source={source} style={styles.cover} />
))} ))}
</ScrollView> </ScrollView>

View File

@@ -32,6 +32,7 @@ export default function Chat() {
return ( return (
<View <View
// eslint-disable-next-line react/no-array-index-key
key={i} key={i}
style={[odd ? styles.odd : styles.even, styles.inverted]} style={[odd ? styles.odd : styles.even, styles.inverted]}
> >

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.11](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.10...@react-navigation/material-bottom-tabs@5.0.0-alpha.11) (2019-10-03)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.9...@react-navigation/material-bottom-tabs@5.0.0-alpha.10) (2019-10-03)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs
# [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.8...@react-navigation/material-bottom-tabs@5.0.0-alpha.9) (2019-09-27) # [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-bottom-tabs@5.0.0-alpha.8...@react-navigation/material-bottom-tabs@5.0.0-alpha.9) (2019-09-27)
**Note:** Version bump only for package @react-navigation/material-bottom-tabs **Note:** Version bump only for package @react-navigation/material-bottom-tabs

View File

@@ -11,7 +11,7 @@
"material", "material",
"tab" "tab"
], ],
"version": "5.0.0-alpha.9", "version": "5.0.0-alpha.11",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,19 +34,19 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8" "@react-navigation/routers": "^5.0.0-alpha.9"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"@types/react-native-vector-icons": "^6.4.1", "@types/react-native-vector-icons": "^6.4.4",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10",
"react-native-paper": "^3.0.0-alpha.3", "react-native-paper": "^3.0.0-alpha.3",
"react-native-vector-icons": "^6.6.0", "react-native-vector-icons": "^6.6.0",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.9...@react-navigation/material-top-tabs@5.0.0-alpha.10) (2019-10-03)
**Note:** Version bump only for package @react-navigation/material-top-tabs
# [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.8...@react-navigation/material-top-tabs@5.0.0-alpha.9) (2019-10-03)
**Note:** Version bump only for package @react-navigation/material-top-tabs
# [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.7...@react-navigation/material-top-tabs@5.0.0-alpha.8) (2019-09-27) # [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/material-top-tabs@5.0.0-alpha.7...@react-navigation/material-top-tabs@5.0.0-alpha.8) (2019-09-27)

View File

@@ -10,7 +10,7 @@ Open a Terminal in your project's folder and run,
yarn add @react-navigation/core @react-navigation/material-top-tabs react-native-tab-view yarn add @react-navigation/core @react-navigation/material-top-tabs react-native-tab-view
``` ```
Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler) and [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated). Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler) and [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated)..
If you are using Expo, to ensure that you get the compatible versions of the libraries, run: If you are using Expo, to ensure that you get the compatible versions of the libraries, run:
@@ -26,28 +26,13 @@ yarn add react-native-reanimated react-native-gesture-handler
If you are using Expo, you are done. Otherwise, continue to the next steps. If you are using Expo, you are done. Otherwise, continue to the next steps.
Next, we need to link these libraries. The steps depends on your React Native version: To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run:
- **React Native 0.60 and higher** ```sh
cd ios
On newer versions of React Native, [linking is automatic](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md). pod install
cd ..
To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run: ```
```sh
cd ios
pod install
cd ..
```
- **React Native 0.59**
If you're on an older React Native version, you need to manually link the dependencies. To do that, run:
```sh
react-native link react-native-reanimated
react-native link react-native-gesture-handler
```
**IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation. **IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation.

View File

@@ -11,7 +11,7 @@
"material", "material",
"tab" "tab"
], ],
"version": "5.0.0-alpha.8", "version": "5.0.0-alpha.10",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -34,19 +34,19 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8" "@react-navigation/routers": "^5.0.0-alpha.9"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "^0.59.8", "react-native": "^0.59.8",
"react-native-gesture-handler": "^1.3.0", "react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.1.0", "react-native-reanimated": "^1.3.0",
"react-native-tab-view": "^2.10.0", "react-native-tab-view": "^2.10.0",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",

View File

@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.10](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.9...@react-navigation/native@5.0.0-alpha.10) (2019-10-03)
**Note:** Version bump only for package @react-navigation/native
# [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.8...@react-navigation/native@5.0.0-alpha.9) (2019-10-03)
**Note:** Version bump only for package @react-navigation/native
# [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.7...@react-navigation/native@5.0.0-alpha.8) (2019-09-16) # [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/native@5.0.0-alpha.7...@react-navigation/native@5.0.0-alpha.8) (2019-09-16)

View File

@@ -7,7 +7,7 @@
"ios", "ios",
"android" "android"
], ],
"version": "5.0.0-alpha.8", "version": "5.0.0-alpha.10",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -31,12 +31,12 @@
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0", "@react-navigation/core": "^5.0.0-alpha.0",

View File

@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.9](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.8...@react-navigation/routers@5.0.0-alpha.9) (2019-10-03)
**Note:** Version bump only for package @react-navigation/routers
# [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.7...@react-navigation/routers@5.0.0-alpha.8) (2019-09-27) # [5.0.0-alpha.8](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/routers@5.0.0-alpha.7...@react-navigation/routers@5.0.0-alpha.8) (2019-09-27)

View File

@@ -6,7 +6,7 @@
"react-native", "react-native",
"react-navigation" "react-navigation"
], ],
"version": "5.0.0-alpha.8", "version": "5.0.0-alpha.9",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -29,12 +29,12 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"shortid": "^2.2.14" "shortid": "^2.2.15"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-navigation/core": "^5.0.0-alpha.0" "@react-navigation/core": "^5.0.0-alpha.0"

View File

@@ -3,6 +3,27 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [5.0.0-alpha.22](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.21...@react-navigation/stack@5.0.0-alpha.22) (2019-10-03)
**Note:** Version bump only for package @react-navigation/stack
# [5.0.0-alpha.21](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.20...@react-navigation/stack@5.0.0-alpha.21) (2019-10-03)
### Bug Fixes
* add missing React import ([ece6e38](https://github.com/react-navigation/navigation-ex/commit/ece6e38))
* fix header buttons not clickable on Android. fixes [#108](https://github.com/react-navigation/navigation-ex/issues/108) ([da944cc](https://github.com/react-navigation/navigation-ex/commit/da944cc))
* keep the routes we are closing or replacing ([bc3586a](https://github.com/react-navigation/navigation-ex/commit/bc3586a))
# [5.0.0-alpha.20](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.19...@react-navigation/stack@5.0.0-alpha.20) (2019-09-27) # [5.0.0-alpha.20](https://github.com/react-navigation/navigation-ex/compare/@react-navigation/stack@5.0.0-alpha.19...@react-navigation/stack@5.0.0-alpha.20) (2019-09-27)

View File

@@ -10,44 +10,36 @@ Open a Terminal in your project's folder and run,
yarn add @react-navigation/core @react-navigation/stack @react-native-community/masked-view yarn add @react-navigation/core @react-navigation/stack @react-native-community/masked-view
``` ```
Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler) and [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated). Now we need to install [`react-native-gesture-handler`](https://github.com/kmagiera/react-native-gesture-handler), [`react-native-reanimated`](https://github.com/kmagiera/react-native-reanimated), [`react-native-screens`](https://github.com/kmagiera/react-native-screens) and [`react-native-safe-area-context`](https://github.com/th3rdwave/react-native-safe-area-context).
If you are using Expo, to ensure that you get the compatible versions of the libraries, run: If you are using Expo, to ensure that you get the compatible versions of the libraries, run:
```sh ```sh
expo install react-native-gesture-handler react-native-reanimated expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context
``` ```
If you are not using Expo, run the following: If you are not using Expo, run the following:
```sh ```sh
yarn add react-native-reanimated react-native-gesture-handler yarn add react-native-reanimated react-native-gesture-handler react-native-screens react-native-safe-area-context
``` ```
If you are using Expo, you are done. Otherwise, continue to the next steps. If you are using Expo, you are done. Otherwise, continue to the next steps.
Next, we need to link these libraries. The steps depends on your React Native version: To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run:
- **React Native 0.60 and higher** ```sh
cd ios
pod install
cd ..
```
On newer versions of React Native, [linking is automatic](https://github.com/react-native-community/cli/blob/master/docs/autolinking.md). To finalize installation of `react-native-screens` for Android, add the following two lines to dependencies section in `android/app/build.gradle`:
To complete the linking on iOS, make sure you have [Cocoapods](https://cocoapods.org/) installed. Then run: ```gradle
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
```sh implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
cd ios ```
pod install
cd ..
```
- **React Native 0.59**
If you're on an older React Native version, you need to manually link the dependencies. To do that, run:
```sh
react-native link react-native-reanimated
react-native link react-native-gesture-handler
```
**IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation. **IMPORTANT:** There are additional steps required for `react-native-gesture-handler` on Android after linking (for all React Native versions). Check the [this guide](https://kmagiera.github.io/react-native-gesture-handler/docs/getting-started.html) to complete the installation.

View File

@@ -10,7 +10,7 @@
"android", "android",
"stack" "stack"
], ],
"version": "5.0.0-alpha.20", "version": "5.0.0-alpha.22",
"license": "MIT", "license": "MIT",
"repository": { "repository": {
"type": "git", "type": "git",
@@ -33,21 +33,21 @@
"clean": "del lib" "clean": "del lib"
}, },
"dependencies": { "dependencies": {
"@react-navigation/routers": "^5.0.0-alpha.8", "@react-navigation/routers": "^5.0.0-alpha.9"
"react-native-safe-area-view": "^0.14.6"
}, },
"devDependencies": { "devDependencies": {
"@react-native-community/bob": "^0.7.0", "@react-native-community/bob": "^0.7.0",
"@react-native-community/masked-view": "^0.1.1", "@react-native-community/masked-view": "^0.1.1",
"@types/react": "^16.8.24", "@types/react": "^16.9.4",
"@types/react-native": "^0.60.2", "@types/react-native": "^0.60.17",
"del-cli": "^2.0.0", "del-cli": "^3.0.0",
"react": "16.8.3", "react": "16.10.1",
"react-native": "0.59.10", "react-native": "0.59.10",
"react-native-gesture-handler": "^1.3.0", "react-native-gesture-handler": "^1.3.0",
"react-native-reanimated": "^1.1.0", "react-native-reanimated": "^1.3.0",
"react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^1.0.0-alpha.22", "react-native-screens": "^1.0.0-alpha.22",
"typescript": "^3.5.3" "typescript": "^3.6.3"
}, },
"peerDependencies": { "peerDependencies": {
"@react-native-community/masked-view": "^0.1.1", "@react-native-community/masked-view": "^0.1.1",
@@ -56,6 +56,7 @@
"react-native": "*", "react-native": "*",
"react-native-gesture-handler": "^1.0.0", "react-native-gesture-handler": "^1.0.0",
"react-native-reanimated": "^1.0.0", "react-native-reanimated": "^1.0.0",
"react-native-safe-area-context": "^0.3.6",
"react-native-screens": "^1.0.0-alpha.0" "react-native-screens": "^1.0.0-alpha.0"
}, },
"@react-native-community/bob": { "@react-native-community/bob": {

View File

@@ -1,6 +1,5 @@
import { I18nManager } from 'react-native'; import { I18nManager } from 'react-native';
import Animated from 'react-native-reanimated'; import Animated from 'react-native-reanimated';
import getStatusBarHeight from '../utils/getStatusBarHeight';
import { import {
StackCardInterpolationProps, StackCardInterpolationProps,
StackCardInterpolatedStyle, StackCardInterpolatedStyle,
@@ -84,9 +83,10 @@ export function forModalPresentationIOS({
current, current,
next, next,
layouts: { screen }, layouts: { screen },
insets,
}: StackCardInterpolationProps): StackCardInterpolatedStyle { }: StackCardInterpolationProps): StackCardInterpolatedStyle {
const topOffset = 10; const topOffset = 10;
const statusBarHeight = getStatusBarHeight(screen.width > screen.height); const statusBarHeight = insets.top;
const aspectRatio = screen.height / screen.width; const aspectRatio = screen.height / screen.width;
const progress = add(current.progress, next ? next.progress : 0); const progress = add(current.progress, next ? next.progress : 0);

View File

@@ -184,10 +184,6 @@ export type StackHeaderOptions = {
* Style object for the header. You can specify a custom background color here, for example. * Style object for the header. You can specify a custom background color here, for example.
*/ */
headerStyle?: StyleProp<ViewStyle>; headerStyle?: StyleProp<ViewStyle>;
/**
* Custom status bar height to set as the top padding in the header.
*/
headerStatusBarHeight?: number;
/** /**
* Defaults to `false`. If `true`, the header will not have a background unless you explicitly provide it with `headerBackground`. * Defaults to `false`. If `true`, the header will not have a background unless you explicitly provide it with `headerBackground`.
* The header will also float over the screen so that it overlaps the content underneath. * The header will also float over the screen so that it overlaps the content underneath.
@@ -445,6 +441,15 @@ export type StackCardInterpolationProps = {
*/ */
screen: Layout; screen: Layout;
}; };
/**
* Safe area insets
*/
insets: {
top: number;
right: number;
bottom: number;
left: number;
};
}; };
export type StackCardInterpolatedStyle = { export type StackCardInterpolatedStyle = {

View File

@@ -1,9 +0,0 @@
import { Platform } from 'react-native';
import { getStatusBarHeight as getStatusBarHeightNative } from 'react-native-safe-area-view';
const getStatusBarHeight = Platform.select({
default: getStatusBarHeightNative,
web: () => 0,
});
export default getStatusBarHeight;

View File

@@ -1,10 +1,14 @@
import * as React from 'react'; import * as React from 'react';
import { StackActions } from '@react-navigation/routers'; import { StackActions } from '@react-navigation/routers';
import { useSafeArea } from 'react-native-safe-area-context';
import HeaderSegment from './HeaderSegment'; import HeaderSegment from './HeaderSegment';
import { StackHeaderProps, StackHeaderTitleProps } from '../../types'; import { StackHeaderProps, StackHeaderTitleProps } from '../../types';
import HeaderTitle from './HeaderTitle'; import HeaderTitle from './HeaderTitle';
export default React.memo(function Header(props: StackHeaderProps) { export default React.memo(function Header(props: StackHeaderProps) {
const insets = useSafeArea();
const { scene, previous, layout, navigation, styleInterpolator } = props; const { scene, previous, layout, navigation, styleInterpolator } = props;
const { options } = scene.descriptor; const { options } = scene.descriptor;
const title = const title =
@@ -35,6 +39,7 @@ export default React.memo(function Header(props: StackHeaderProps) {
return ( return (
<HeaderSegment <HeaderSegment
{...options} {...options}
insets={insets}
layout={layout} layout={layout}
scene={scene} scene={scene}
title={title} title={title}

View File

@@ -7,10 +7,10 @@ import {
ViewStyle, ViewStyle,
} from 'react-native'; } from 'react-native';
import Animated from 'react-native-reanimated'; import Animated from 'react-native-reanimated';
import { EdgeInsets } from 'react-native-safe-area-context';
import { Route } from '@react-navigation/core'; import { Route } from '@react-navigation/core';
import HeaderBackButton from './HeaderBackButton'; import HeaderBackButton from './HeaderBackButton';
import HeaderBackground from './HeaderBackground'; import HeaderBackground from './HeaderBackground';
import getStatusBarHeight from '../../utils/getStatusBarHeight';
import memoize from '../../utils/memoize'; import memoize from '../../utils/memoize';
import { import {
Layout, Layout,
@@ -29,6 +29,7 @@ export type Scene<T> = {
type Props = StackHeaderOptions & { type Props = StackHeaderOptions & {
headerTitle: (props: StackHeaderTitleProps) => React.ReactNode; headerTitle: (props: StackHeaderTitleProps) => React.ReactNode;
layout: Layout; layout: Layout;
insets: EdgeInsets;
onGoBack?: () => void; onGoBack?: () => void;
title?: string; title?: string;
leftLabel?: string; leftLabel?: string;
@@ -57,7 +58,7 @@ const warnIfHeaderStylesDefined = (styles: { [key: string]: any }) => {
}); });
}; };
export const getDefaultHeaderHeight = (layout: Layout) => { export const getDefaultHeaderHeight = (layout: Layout, insets: EdgeInsets) => {
const isLandscape = layout.width > layout.height; const isLandscape = layout.width > layout.height;
let headerHeight; let headerHeight;
@@ -75,7 +76,7 @@ export const getDefaultHeaderHeight = (layout: Layout) => {
headerHeight = 64; headerHeight = 64;
} }
return headerHeight + getStatusBarHeight(isLandscape); return headerHeight + insets.top;
}; };
export default class HeaderSegment extends React.Component<Props, State> { export default class HeaderSegment extends React.Component<Props, State> {
@@ -135,6 +136,7 @@ export default class HeaderSegment extends React.Component<Props, State> {
const { const {
scene, scene,
layout, layout,
insets,
title: currentTitle, title: currentTitle,
leftLabel: previousTitle, leftLabel: previousTitle,
onGoBack, onGoBack,
@@ -142,8 +144,6 @@ export default class HeaderSegment extends React.Component<Props, State> {
headerLeft: left = onGoBack headerLeft: left = onGoBack
? (props: StackHeaderLeftButtonProps) => <HeaderBackButton {...props} /> ? (props: StackHeaderLeftButtonProps) => <HeaderBackButton {...props} />
: undefined, : undefined,
// @ts-ignore
headerStatusBarHeight = getStatusBarHeight(layout.width > layout.height),
headerTransparent, headerTransparent,
headerTintColor, headerTintColor,
headerBackground, headerBackground,
@@ -182,7 +182,7 @@ export default class HeaderSegment extends React.Component<Props, State> {
); );
const { const {
height = getDefaultHeaderHeight(layout), height = getDefaultHeaderHeight(layout, insets),
minHeight, minHeight,
maxHeight, maxHeight,
backgroundColor, backgroundColor,
@@ -306,15 +306,17 @@ export default class HeaderSegment extends React.Component<Props, State> {
pointerEvents="box-none" pointerEvents="box-none"
style={[{ height, minHeight, maxHeight, opacity }]} style={[{ height, minHeight, maxHeight, opacity }]}
> >
<View <View pointerEvents="none" style={{ height: insets.top }} />
pointerEvents="none"
style={{ height: headerStatusBarHeight }}
/>
<View pointerEvents="box-none" style={styles.content}> <View pointerEvents="box-none" style={styles.content}>
{leftButton ? ( {leftButton ? (
<Animated.View <Animated.View
pointerEvents="box-none" pointerEvents="box-none"
style={[styles.left, leftButtonStyle, leftContainerStyle]} style={[
styles.left,
{ left: insets.left },
leftButtonStyle,
leftContainerStyle,
]}
> >
{leftButton} {leftButton}
</Animated.View> </Animated.View>
@@ -341,7 +343,12 @@ export default class HeaderSegment extends React.Component<Props, State> {
{right ? ( {right ? (
<Animated.View <Animated.View
pointerEvents="box-none" pointerEvents="box-none"
style={[styles.right, rightButtonStyle, rightContainerStyle]} style={[
styles.right,
{ right: insets.right },
rightButtonStyle,
rightContainerStyle,
]}
> >
{right({ tintColor: headerTintColor })} {right({ tintColor: headerTintColor })}
</Animated.View> </Animated.View>

View File

@@ -1,3 +1,5 @@
import * as React from 'react';
type Props = { type Props = {
children: React.ReactElement; children: React.ReactElement;
}; };

View File

@@ -122,9 +122,8 @@ const {
// We need to be prepared for both version of reanimated. With and w/out proc // We need to be prepared for both version of reanimated. With and w/out proc
let memoizedSpring = spring; let memoizedSpring = spring;
// @ts-ignore
if (Animated.proc) { if (Animated.proc) {
// @ts-ignore
const springHelper = Animated.proc( const springHelper = Animated.proc(
( (
finished: Animated.Value<number>, finished: Animated.Value<number>,
@@ -136,7 +135,7 @@ if (Animated.proc) {
damping: Animated.Adaptable<number>, damping: Animated.Adaptable<number>,
mass: Animated.Adaptable<number>, mass: Animated.Adaptable<number>,
stiffness: Animated.Adaptable<number>, stiffness: Animated.Adaptable<number>,
overshootClamping: Animated.Adaptable<boolean>, overshootClamping: Animated.Adaptable<number>,
restSpeedThreshold: Animated.Adaptable<number>, restSpeedThreshold: Animated.Adaptable<number>,
restDisplacementThreshold: Animated.Adaptable<number>, restDisplacementThreshold: Animated.Adaptable<number>,
clock: Animated.Clock clock: Animated.Clock
@@ -177,7 +176,7 @@ if (Animated.proc) {
damping: Animated.Adaptable<number>; damping: Animated.Adaptable<number>;
mass: Animated.Adaptable<number>; mass: Animated.Adaptable<number>;
stiffness: Animated.Adaptable<number>; stiffness: Animated.Adaptable<number>;
overshootClamping: Animated.Adaptable<boolean>; overshootClamping: Animated.Adaptable<number>;
restSpeedThreshold: Animated.Adaptable<number>; restSpeedThreshold: Animated.Adaptable<number>;
restDisplacementThreshold: Animated.Adaptable<number>; restDisplacementThreshold: Animated.Adaptable<number>;
} }
@@ -672,6 +671,12 @@ export default class Card extends React.Component<Props> {
layouts: { layouts: {
screen: layout, screen: layout,
}, },
insets: {
top: 0,
right: 0,
bottom: 0,
left: 0,
},
}) })
); );

View File

@@ -8,6 +8,7 @@ import {
ViewProps, ViewProps,
} from 'react-native'; } from 'react-native';
import Animated from 'react-native-reanimated'; import Animated from 'react-native-reanimated';
import { EdgeInsets } from 'react-native-safe-area-context';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import * as Screens from 'react-native-screens'; // Import with * as to prevent getters being called import * as Screens from 'react-native-screens'; // Import with * as to prevent getters being called
import { Route } from '@react-navigation/core'; import { Route } from '@react-navigation/core';
@@ -36,6 +37,7 @@ type ProgressValues = {
type Props = { type Props = {
mode: 'card' | 'modal'; mode: 'card' | 'modal';
insets: EdgeInsets;
state: StackNavigationState; state: StackNavigationState;
navigation: StackNavigationHelpers; navigation: StackNavigationHelpers;
descriptors: StackDescriptorMap; descriptors: StackDescriptorMap;
@@ -114,10 +116,11 @@ const FALLBACK_DESCRIPTOR = Object.freeze({ options: {} });
const getFloatingHeaderHeights = ( const getFloatingHeaderHeights = (
routes: Route<string>[], routes: Route<string>[],
insets: EdgeInsets,
layout: Layout, layout: Layout,
previous: { [key: string]: number } previous: { [key: string]: number }
) => { ) => {
const defaultHeaderHeight = getDefaultHeaderHeight(layout); const defaultHeaderHeight = getDefaultHeaderHeight(layout, insets);
return routes.reduce( return routes.reduce(
(acc, curr) => { (acc, curr) => {
@@ -201,6 +204,7 @@ export default class Stack extends React.Component<Props, State> {
descriptors: props.descriptors, descriptors: props.descriptors,
floatingHeaderHeights: getFloatingHeaderHeights( floatingHeaderHeights: getFloatingHeaderHeights(
props.routes, props.routes,
props.insets,
state.layout, state.layout,
state.floatingHeaderHeights state.floatingHeaderHeights
), ),
@@ -237,6 +241,7 @@ export default class Stack extends React.Component<Props, State> {
layout, layout,
floatingHeaderHeights: getFloatingHeaderHeights( floatingHeaderHeights: getFloatingHeaderHeights(
this.props.routes, this.props.routes,
this.props.insets,
layout, layout,
{} {}
), ),

View File

@@ -1,5 +1,5 @@
import * as React from 'react'; import * as React from 'react';
import { View, StyleSheet, Platform, StyleProp, ViewStyle } from 'react-native'; import { View, StyleSheet, StyleProp, ViewStyle } from 'react-native';
import Animated from 'react-native-reanimated'; import Animated from 'react-native-reanimated';
import { StackNavigationState } from '@react-navigation/routers'; import { StackNavigationState } from '@react-navigation/routers';
import { Route } from '@react-navigation/core'; import { Route } from '@react-navigation/core';
@@ -165,7 +165,6 @@ export default class StackItem extends React.PureComponent<Props> {
state, state,
getPreviousRoute, getPreviousRoute,
styleInterpolator: headerStyleInterpolator, styleInterpolator: headerStyleInterpolator,
style: styles.header,
}) })
: null} : null}
</View> </View>
@@ -182,8 +181,4 @@ const styles = StyleSheet.create({
scene: { scene: {
flex: 1, flex: 1,
}, },
header: {
// This is needed to show elevation shadow
zIndex: Platform.OS === 'android' ? 1 : 0,
},
}); });

View File

@@ -1,5 +1,10 @@
import * as React from 'react'; import * as React from 'react';
import { Platform } from 'react-native'; import { Platform } from 'react-native';
import {
SafeAreaProvider,
SafeAreaConsumer,
EdgeInsets,
} from 'react-native-safe-area-context';
import { Route } from '@react-navigation/core'; import { Route } from '@react-navigation/core';
import { StackActions, StackNavigationState } from '@react-navigation/routers'; import { StackActions, StackNavigationState } from '@react-navigation/routers';
@@ -57,10 +62,6 @@ class StackView extends React.Component<Props, State> {
); );
} }
if (!routes.length) {
throw new Error(`There should always be at least one route.`);
}
// If there was no change in routes, we don't need to compute anything // If there was no change in routes, we don't need to compute anything
if (routes === state.routes || !state.routes.length) { if (routes === state.routes || !state.routes.length) {
return { return {
@@ -144,6 +145,20 @@ class StackView extends React.Component<Props, State> {
// i.e. the currently focused route already existed and the previously focused route still exists // i.e. the currently focused route already existed and the previously focused route still exists
// We don't know how to animate this // We don't know how to animate this
} }
} else {
// Keep the routes we are closing or replacing
routes = routes.slice();
routes.splice(
routes.length - 1,
0,
...state.routes.filter(
({ key }) => replacing.includes(key) || closing.includes(key)
)
);
}
if (!routes.length) {
throw new Error(`There should always be at least one route.`);
} }
const descriptors = routes.reduce( const descriptors = routes.reduce(
@@ -272,27 +287,34 @@ class StackView extends React.Component<Props, State> {
mode !== 'modal' && Platform.OS === 'ios' ? 'float' : 'screen'; mode !== 'modal' && Platform.OS === 'ios' ? 'float' : 'screen';
return ( return (
<Stack <SafeAreaProvider>
mode={mode} <SafeAreaConsumer>
getPreviousRoute={this.getPreviousRoute} {insets => (
getGesturesEnabled={this.getGesturesEnabled} <Stack
routes={routes} mode={mode}
openingRoutes={opening} insets={insets as EdgeInsets}
closingRoutes={closing} getPreviousRoute={this.getPreviousRoute}
onGoBack={this.handleGoBack} getGesturesEnabled={this.getGesturesEnabled}
onOpenRoute={this.handleOpenRoute} routes={routes}
onCloseRoute={this.handleCloseRoute} openingRoutes={opening}
onPageChangeStart={onPageChangeStart} closingRoutes={closing}
onPageChangeConfirm={onPageChangeConfirm} onGoBack={this.handleGoBack}
onPageChangeCancel={onPageChangeCancel} onOpenRoute={this.handleOpenRoute}
renderHeader={this.renderHeader} onCloseRoute={this.handleCloseRoute}
renderScene={this.renderScene} onPageChangeStart={onPageChangeStart}
headerMode={headerMode} onPageChangeConfirm={onPageChangeConfirm}
state={state} onPageChangeCancel={onPageChangeCancel}
navigation={navigation} renderHeader={this.renderHeader}
descriptors={descriptors} renderScene={this.renderScene}
{...rest} headerMode={headerMode}
/> state={state}
navigation={navigation}
descriptors={descriptors}
{...rest}
/>
)}
</SafeAreaConsumer>
</SafeAreaProvider>
); );
} }
} }

3246
yarn.lock

File diff suppressed because it is too large Load Diff