mirror of
https://github.com/zhigang1992/react-navigation.git
synced 2026-02-15 09:17:26 +08:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cde6e845cd | ||
|
|
fb8c712ad8 | ||
|
|
350b7e0aed | ||
|
|
de112565d3 | ||
|
|
acdd515c13 | ||
|
|
452a6d2004 | ||
|
|
08c8031a71 | ||
|
|
608365266a | ||
|
|
247fba56e6 | ||
|
|
060f5dcecf | ||
|
|
fdec05c87a | ||
|
|
76da804574 |
16
.github/PULL_REQUEST_TEMPLATE.md
vendored
16
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,17 +1,21 @@
|
|||||||
Please provide enough information so that others can review your pull request:
|
Please provide enough information so that others can review your pull request:
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
Explain the **motivation** for making this change. What existing problem does the pull request solve?
|
Explain the **motivation** for making this change. What existing problem does the pull request solve?
|
||||||
|
|
||||||
Prefer **small pull requests**. These are much easier to review and more likely to get merged. Make sure the PR does only one thing, otherwise split it.
|
## Test plan
|
||||||
|
|
||||||
**Test plan (required)**
|
Demonstrate the code is solid. Example: the exact commands you ran and their output, screenshots / videos if the pull request changes UI.
|
||||||
|
|
||||||
Demonstrate the code is solid. Example: The exact commands you ran and their output, screenshots / videos if the pull request changes UI.
|
|
||||||
|
|
||||||
Make sure you test on both platforms if your change affects both platforms.
|
Make sure you test on both platforms if your change affects both platforms.
|
||||||
|
|
||||||
The code must pass tests.
|
The code must pass tests.
|
||||||
|
|
||||||
**Code formatting**
|
## Code formatting
|
||||||
|
|
||||||
Look around. Match the style of the rest of the codebase.
|
Look around. Match the style of the rest of the codebase. Run `yarn format` before committing.
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
Add an entry under the "Unreleased" heading in [CHANGELOG.md](https://github.com/react-navigation/react-navigation/blob/master/CHANGELOG.md#unreleased) which explains your change.
|
||||||
|
|||||||
29
CHANGELOG.md
Normal file
29
CHANGELOG.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2.5.1] - [2018-06-22](https://github.com/react-navigation/react-navigation/releases/tag/2.5.1)
|
||||||
|
### Fixed
|
||||||
|
- `transitionConfig` in stack navigator no longer passes incorrect `fromTransitionProps` when navigating back
|
||||||
|
|
||||||
|
## [2.5.0] - [2018-06-22](https://github.com/react-navigation/react-navigation/releases/tag/2.5.0)
|
||||||
|
### Changed
|
||||||
|
- Refactor internals to make it play more nicely with web
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- `const defaultGetStateForAction = SwitchBasedNavigator.router.getStateForAction` no longer throws error.
|
||||||
|
- Updated react-navigation-drawer to 0.4.1 which should fix issues related to automatically closing drawer when changing routes.
|
||||||
|
|
||||||
|
## [2.4.1] - [2018-06-21](https://github.com/react-navigation/react-navigation/releases/tag/2.4.1)
|
||||||
|
### Changed
|
||||||
|
- Improved examples
|
||||||
|
|
||||||
|
[Unreleased]: https://github.com/react-navigation/react-navigation/compare/2.5.1...HEAD
|
||||||
|
[2.5.0]: https://github.com/react-navigation/react-navigation/compare/2.5.0...2.5.1
|
||||||
|
[2.5.0]: https://github.com/react-navigation/react-navigation/compare/2.4.1...2.5.0
|
||||||
|
[2.4.1]: https://github.com/react-navigation/react-navigation/compare/2.4.0...2.4.1
|
||||||
@@ -13,14 +13,15 @@
|
|||||||
},
|
},
|
||||||
"sdkVersion": "27.0.0",
|
"sdkVersion": "27.0.0",
|
||||||
"entryPoint": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
|
"entryPoint": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
|
||||||
"packagerOpts": {
|
"assetBundlePatterns": [
|
||||||
"assetExts": [
|
"**/*"
|
||||||
"ttf",
|
],
|
||||||
"mp4"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ios": {
|
"ios": {
|
||||||
|
"bundleIdentifier": "com.reactnavigation.example",
|
||||||
"supportsTablet": true
|
"supportsTablet": true
|
||||||
|
},
|
||||||
|
"android": {
|
||||||
|
"package": "com.reactnavigation.example"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-navigation",
|
"name": "react-navigation",
|
||||||
"version": "2.4.1",
|
"version": "2.5.2",
|
||||||
"description": "Routing and navigation for your React Native apps",
|
"description": "Routing and navigation for your React Native apps",
|
||||||
"main": "src/react-navigation.js",
|
"main": "src/react-navigation.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -33,11 +33,10 @@
|
|||||||
"create-react-context": "^0.2.1",
|
"create-react-context": "^0.2.1",
|
||||||
"hoist-non-react-statics": "^2.2.0",
|
"hoist-non-react-statics": "^2.2.0",
|
||||||
"path-to-regexp": "^1.7.0",
|
"path-to-regexp": "^1.7.0",
|
||||||
"prop-types": "^15.5.10",
|
|
||||||
"react-lifecycles-compat": "^3",
|
"react-lifecycles-compat": "^3",
|
||||||
"react-native-safe-area-view": "^0.8.0",
|
"react-native-safe-area-view": "^0.8.0",
|
||||||
"react-navigation-deprecated-tab-navigator": "1.3.0",
|
"react-navigation-deprecated-tab-navigator": "1.3.0",
|
||||||
"react-navigation-drawer": "0.3.2",
|
"react-navigation-drawer": "0.4.2",
|
||||||
"react-navigation-tabs": "0.5.1"
|
"react-navigation-tabs": "0.5.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ import renderer from 'react-test-renderer';
|
|||||||
|
|
||||||
import NavigationActions from '../NavigationActions';
|
import NavigationActions from '../NavigationActions';
|
||||||
import createStackNavigator from '../navigators/createStackNavigator';
|
import createStackNavigator from '../navigators/createStackNavigator';
|
||||||
import { _TESTING_ONLY_reset_container_count } from '../createNavigationContainer';
|
import createNavigationContainer, {
|
||||||
|
_TESTING_ONLY_reset_container_count,
|
||||||
|
} from '../createNavigationContainer';
|
||||||
|
|
||||||
describe('NavigationContainer', () => {
|
describe('NavigationContainer', () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
@@ -19,7 +21,7 @@ describe('NavigationContainer', () => {
|
|||||||
const CarScreen = () => <div />;
|
const CarScreen = () => <div />;
|
||||||
const DogScreen = () => <div />;
|
const DogScreen = () => <div />;
|
||||||
const ElkScreen = () => <div />;
|
const ElkScreen = () => <div />;
|
||||||
const NavigationContainer = createStackNavigator(
|
const Stack = createStackNavigator(
|
||||||
{
|
{
|
||||||
foo: {
|
foo: {
|
||||||
screen: FooScreen,
|
screen: FooScreen,
|
||||||
@@ -44,6 +46,7 @@ describe('NavigationContainer', () => {
|
|||||||
initialRouteName: 'foo',
|
initialRouteName: 'foo',
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
const NavigationContainer = createNavigationContainer(Stack);
|
||||||
|
|
||||||
describe('state.nav', () => {
|
describe('state.nav', () => {
|
||||||
it("should be preloaded with the router's initial state", () => {
|
it("should be preloaded with the router's initial state", () => {
|
||||||
@@ -225,7 +228,7 @@ describe('NavigationContainer', () => {
|
|||||||
|
|
||||||
let spy = spyConsole();
|
let spy = spyConsole();
|
||||||
|
|
||||||
it('warns when you render more than one navigator explicitly', () => {
|
it('warns when you render more than one container explicitly', () => {
|
||||||
class BlankScreen extends React.Component {
|
class BlankScreen extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
return <View />;
|
return <View />;
|
||||||
@@ -242,13 +245,17 @@ describe('NavigationContainer', () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const ChildNavigator = createStackNavigator({
|
const ChildNavigator = createNavigationContainer(
|
||||||
Child: BlankScreen,
|
createStackNavigator({
|
||||||
});
|
Child: BlankScreen,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
const RootStack = createStackNavigator({
|
const RootStack = createNavigationContainer(
|
||||||
Root: RootScreen,
|
createStackNavigator({
|
||||||
});
|
Root: RootScreen,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
renderer.create(<RootStack />).toJSON();
|
renderer.create(<RootStack />).toJSON();
|
||||||
expect(spy).toMatchSnapshot();
|
expect(spy).toMatchSnapshot();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
exports[`NavigationContainer warnings detached navigators warns when you render more than one navigator explicitly 1`] = `
|
exports[`NavigationContainer warnings detached navigators warns when you render more than one container explicitly 1`] = `
|
||||||
Object {
|
Object {
|
||||||
"console": [MockFunction] {
|
"console": [MockFunction] {
|
||||||
"calls": Array [
|
"calls": Array [
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import renderer from 'react-test-renderer';
|
import renderer from 'react-test-renderer';
|
||||||
import StackNavigator from '../createStackNavigator';
|
import StackNavigator from '../createContainedStackNavigator';
|
||||||
|
|
||||||
const SubNavigator = StackNavigator({
|
const SubNavigator = StackNavigator({
|
||||||
Home: {
|
Home: {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
|
|||||||
import { StyleSheet, View } from 'react-native';
|
import { StyleSheet, View } from 'react-native';
|
||||||
import renderer from 'react-test-renderer';
|
import renderer from 'react-test-renderer';
|
||||||
|
|
||||||
import StackNavigator from '../createStackNavigator';
|
import StackNavigator from '../createContainedStackNavigator';
|
||||||
import withNavigation from '../../views/withNavigation';
|
import withNavigation from '../../views/withNavigation';
|
||||||
import { _TESTING_ONLY_reset_container_count } from '../../createNavigationContainer';
|
import { _TESTING_ONLY_reset_container_count } from '../../createNavigationContainer';
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { Component } from 'react';
|
|||||||
import { View } from 'react-native';
|
import { View } from 'react-native';
|
||||||
import renderer from 'react-test-renderer';
|
import renderer from 'react-test-renderer';
|
||||||
|
|
||||||
import SwitchNavigator from '../createSwitchNavigator';
|
import SwitchNavigator from '../createContainedSwitchNavigator';
|
||||||
|
|
||||||
const A = () => <View />;
|
const A = () => <View />;
|
||||||
const B = () => <View />;
|
const B = () => <View />;
|
||||||
|
|||||||
9
src/navigators/createContainedStackNavigator.js
Normal file
9
src/navigators/createContainedStackNavigator.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import createNavigationContainer from '../createNavigationContainer';
|
||||||
|
import createStackNavigator from './createStackNavigator';
|
||||||
|
|
||||||
|
const StackNavigator = (routeConfigs, config = {}) => {
|
||||||
|
const navigator = createStackNavigator(routeConfigs, config);
|
||||||
|
return createNavigationContainer(navigator);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default StackNavigator;
|
||||||
9
src/navigators/createContainedSwitchNavigator.js
Normal file
9
src/navigators/createContainedSwitchNavigator.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import createNavigationContainer from '../createNavigationContainer';
|
||||||
|
import createSwitchNavigator from './createSwitchNavigator';
|
||||||
|
|
||||||
|
const SwitchNavigator = (routeConfigs, config = {}) => {
|
||||||
|
const navigator = createSwitchNavigator(routeConfigs, config);
|
||||||
|
return createNavigationContainer(navigator);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SwitchNavigator;
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
import React from 'react';
|
|
||||||
import createNavigationContainer from '../createNavigationContainer';
|
|
||||||
import createKeyboardAwareNavigator from './createKeyboardAwareNavigator';
|
import createKeyboardAwareNavigator from './createKeyboardAwareNavigator';
|
||||||
import createNavigator from './createNavigator';
|
import createNavigator from './createNavigator';
|
||||||
import StackView from '../views/StackView/StackView';
|
import StackView from '../views/StackView/StackView';
|
||||||
@@ -33,8 +31,7 @@ function createStackNavigator(routeConfigMap, stackConfig = {}) {
|
|||||||
Navigator = createKeyboardAwareNavigator(Navigator);
|
Navigator = createKeyboardAwareNavigator(Navigator);
|
||||||
}
|
}
|
||||||
|
|
||||||
// HOC to provide the navigation prop for the top-level navigator (when the prop is missing)
|
return Navigator;
|
||||||
return createNavigationContainer(Navigator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default createStackNavigator;
|
export default createStackNavigator;
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import createNavigationContainer from '../createNavigationContainer';
|
|
||||||
import createNavigator from '../navigators/createNavigator';
|
import createNavigator from '../navigators/createNavigator';
|
||||||
import SwitchRouter from '../routers/SwitchRouter';
|
import SwitchRouter from '../routers/SwitchRouter';
|
||||||
import SwitchView from '../views/SwitchView/SwitchView';
|
import SwitchView from '../views/SwitchView/SwitchView';
|
||||||
@@ -7,7 +6,7 @@ import SwitchView from '../views/SwitchView/SwitchView';
|
|||||||
function createSwitchNavigator(routeConfigMap, switchConfig = {}) {
|
function createSwitchNavigator(routeConfigMap, switchConfig = {}) {
|
||||||
const router = SwitchRouter(routeConfigMap, switchConfig);
|
const router = SwitchRouter(routeConfigMap, switchConfig);
|
||||||
const Navigator = createNavigator(SwitchView, router, switchConfig);
|
const Navigator = createNavigator(SwitchView, router, switchConfig);
|
||||||
return createNavigationContainer(Navigator);
|
return Navigator;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default createSwitchNavigator;
|
export default createSwitchNavigator;
|
||||||
|
|||||||
8
src/react-navigation.js
vendored
8
src/react-navigation.js
vendored
@@ -17,22 +17,22 @@ module.exports = {
|
|||||||
return require('./navigators/createNavigator').default;
|
return require('./navigators/createNavigator').default;
|
||||||
},
|
},
|
||||||
get createStackNavigator() {
|
get createStackNavigator() {
|
||||||
return require('./navigators/createStackNavigator').default;
|
return require('./navigators/createContainedStackNavigator').default;
|
||||||
},
|
},
|
||||||
get StackNavigator() {
|
get StackNavigator() {
|
||||||
console.warn(
|
console.warn(
|
||||||
'The StackNavigator function name is deprecated, please use createStackNavigator instead'
|
'The StackNavigator function name is deprecated, please use createStackNavigator instead'
|
||||||
);
|
);
|
||||||
return require('./navigators/createStackNavigator').default;
|
return require('./navigators/createContainedStackNavigator').default;
|
||||||
},
|
},
|
||||||
get createSwitchNavigator() {
|
get createSwitchNavigator() {
|
||||||
return require('./navigators/createSwitchNavigator').default;
|
return require('./navigators/createContainedSwitchNavigator').default;
|
||||||
},
|
},
|
||||||
get SwitchNavigator() {
|
get SwitchNavigator() {
|
||||||
console.warn(
|
console.warn(
|
||||||
'The SwitchNavigator function name is deprecated, please use createSwitchNavigator instead'
|
'The SwitchNavigator function name is deprecated, please use createSwitchNavigator instead'
|
||||||
);
|
);
|
||||||
return require('./navigators/createSwitchNavigator').default;
|
return require('./navigators/createContainedSwitchNavigator').default;
|
||||||
},
|
},
|
||||||
get createDrawerNavigator() {
|
get createDrawerNavigator() {
|
||||||
return require('react-navigation-drawer').createDrawerNavigator;
|
return require('react-navigation-drawer').createDrawerNavigator;
|
||||||
|
|||||||
@@ -74,40 +74,40 @@ export default (routeConfigs, config = {}) => {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getNextState(prevState, possibleNextState) {
|
||||||
|
if (!prevState) {
|
||||||
|
return possibleNextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nextState;
|
||||||
|
if (prevState.index !== possibleNextState.index && resetOnBlur) {
|
||||||
|
const prevRouteName = prevState.routes[prevState.index].routeName;
|
||||||
|
const nextRoutes = [...possibleNextState.routes];
|
||||||
|
nextRoutes[prevState.index] = resetChildRoute(prevRouteName);
|
||||||
|
|
||||||
|
return {
|
||||||
|
...possibleNextState,
|
||||||
|
routes: nextRoutes,
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
nextState = possibleNextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getInitialState() {
|
||||||
|
const routes = order.map(resetChildRoute);
|
||||||
|
return {
|
||||||
|
routes,
|
||||||
|
index: initialRouteIndex,
|
||||||
|
isTransitioning: false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
childRouters,
|
childRouters,
|
||||||
|
|
||||||
getInitialState() {
|
|
||||||
const routes = order.map(resetChildRoute);
|
|
||||||
return {
|
|
||||||
routes,
|
|
||||||
index: initialRouteIndex,
|
|
||||||
isTransitioning: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
getNextState(prevState, possibleNextState) {
|
|
||||||
if (!prevState) {
|
|
||||||
return possibleNextState;
|
|
||||||
}
|
|
||||||
|
|
||||||
let nextState;
|
|
||||||
if (prevState.index !== possibleNextState.index && resetOnBlur) {
|
|
||||||
const prevRouteName = prevState.routes[prevState.index].routeName;
|
|
||||||
const nextRoutes = [...possibleNextState.routes];
|
|
||||||
nextRoutes[prevState.index] = resetChildRoute(prevRouteName);
|
|
||||||
|
|
||||||
return {
|
|
||||||
...possibleNextState,
|
|
||||||
routes: nextRoutes,
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
nextState = possibleNextState;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nextState;
|
|
||||||
},
|
|
||||||
|
|
||||||
getActionCreators(route, stateKey) {
|
getActionCreators(route, stateKey) {
|
||||||
return {
|
return {
|
||||||
...getNavigationActionCreators(route),
|
...getNavigationActionCreators(route),
|
||||||
@@ -117,7 +117,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
|
|
||||||
getStateForAction(action, inputState) {
|
getStateForAction(action, inputState) {
|
||||||
let prevState = inputState ? { ...inputState } : inputState;
|
let prevState = inputState ? { ...inputState } : inputState;
|
||||||
let state = inputState || this.getInitialState();
|
let state = inputState || getInitialState();
|
||||||
let activeChildIndex = state.index;
|
let activeChildIndex = state.index;
|
||||||
|
|
||||||
if (action.type === NavigationActions.INIT) {
|
if (action.type === NavigationActions.INIT) {
|
||||||
@@ -154,7 +154,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
if (activeChildState && activeChildState !== activeChildLastState) {
|
if (activeChildState && activeChildState !== activeChildLastState) {
|
||||||
const routes = [...state.routes];
|
const routes = [...state.routes];
|
||||||
routes[state.index] = activeChildState;
|
routes[state.index] = activeChildState;
|
||||||
return this.getNextState(prevState, {
|
return getNextState(prevState, {
|
||||||
...state,
|
...state,
|
||||||
routes,
|
routes,
|
||||||
});
|
});
|
||||||
@@ -204,7 +204,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
if (newChildState && newChildState !== childState) {
|
if (newChildState && newChildState !== childState) {
|
||||||
const routes = [...state.routes];
|
const routes = [...state.routes];
|
||||||
routes[activeChildIndex] = newChildState;
|
routes[activeChildIndex] = newChildState;
|
||||||
return this.getNextState(prevState, {
|
return getNextState(prevState, {
|
||||||
...state,
|
...state,
|
||||||
routes,
|
routes,
|
||||||
index: activeChildIndex,
|
index: activeChildIndex,
|
||||||
@@ -232,7 +232,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
...lastRoute,
|
...lastRoute,
|
||||||
params,
|
params,
|
||||||
};
|
};
|
||||||
return this.getNextState(prevState, {
|
return getNextState(prevState, {
|
||||||
...state,
|
...state,
|
||||||
routes,
|
routes,
|
||||||
});
|
});
|
||||||
@@ -240,7 +240,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (activeChildIndex !== state.index) {
|
if (activeChildIndex !== state.index) {
|
||||||
return this.getNextState(prevState, {
|
return getNextState(prevState, {
|
||||||
...state,
|
...state,
|
||||||
index: activeChildIndex,
|
index: activeChildIndex,
|
||||||
});
|
});
|
||||||
@@ -284,7 +284,7 @@ export default (routeConfigs, config = {}) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (index !== state.index || routes !== state.routes) {
|
if (index !== state.index || routes !== state.routes) {
|
||||||
return this.getNextState(prevState, {
|
return getNextState(prevState, {
|
||||||
...state,
|
...state,
|
||||||
index,
|
index,
|
||||||
routes,
|
routes,
|
||||||
|
|||||||
@@ -21,25 +21,24 @@ function validateRouteConfigMap(routeConfigs) {
|
|||||||
typeof screenComponent !== 'string' &&
|
typeof screenComponent !== 'string' &&
|
||||||
!routeConfig.getScreen)
|
!routeConfig.getScreen)
|
||||||
) {
|
) {
|
||||||
throw new Error(
|
throw new Error(`The component for route '${routeName}' must be a React component. For example:
|
||||||
`The component for route '${routeName}' must be a ` +
|
|
||||||
'React component. For example:\n\n' +
|
import MyScreen from './MyScreen';
|
||||||
"import MyScreen from './MyScreen';\n" +
|
...
|
||||||
'...\n' +
|
${routeName}: MyScreen,
|
||||||
`${routeName}: MyScreen,\n` +
|
}
|
||||||
'}\n\n' +
|
|
||||||
'You can also use a navigator:\n\n' +
|
You can also use a navigator:
|
||||||
"import MyNavigator from './MyNavigator';\n" +
|
|
||||||
'...\n' +
|
import MyNavigator from './MyNavigator';
|
||||||
`${routeName}: MyNavigator,\n` +
|
...
|
||||||
'}'
|
${routeName}: MyNavigator,
|
||||||
);
|
}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (routeConfig.screen && routeConfig.getScreen) {
|
if (routeConfig.screen && routeConfig.getScreen) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Route '${routeName}' should declare a screen or ` +
|
`Route '${routeName}' should declare a screen or a getScreen, not both.`
|
||||||
'a getScreen, not both.'
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,14 +1,3 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2013-present, Facebook, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the BSD-style license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
* of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use invariant() to assert state which your program assumes to be true.
|
* Use invariant() to assert state which your program assumes to be true.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,19 +1,5 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2013-present, Facebook, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the BSD-style license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
* of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
*
|
|
||||||
* @typechecks
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*eslint-disable no-self-compare */
|
/*eslint-disable no-self-compare */
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -71,4 +57,4 @@ function shallowEqual(objA, objB) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = shallowEqual;
|
export default shallowEqual;
|
||||||
|
|||||||
3
src/views/NavigationConsumer.js
Normal file
3
src/views/NavigationConsumer.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { NavigationConsumer } from './NavigationContext';
|
||||||
|
|
||||||
|
export default NavigationConsumer;
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import propTypes from 'prop-types';
|
|
||||||
import createReactContext from 'create-react-context';
|
import createReactContext from 'create-react-context';
|
||||||
|
|
||||||
const NavigationContext = createReactContext();
|
const NavigationContext = createReactContext();
|
||||||
|
|||||||
3
src/views/NavigationProvider.js
Normal file
3
src/views/NavigationProvider.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { NavigationProvider } from './NavigationContext';
|
||||||
|
|
||||||
|
export default NavigationProvider;
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import propTypes from 'prop-types';
|
|
||||||
import { NavigationProvider } from './NavigationContext';
|
import { NavigationProvider } from './NavigationContext';
|
||||||
|
|
||||||
export default class SceneView extends React.PureComponent {
|
export default class SceneView extends React.PureComponent {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { NativeModules } from 'react-native';
|
|||||||
|
|
||||||
import StackViewLayout from './StackViewLayout';
|
import StackViewLayout from './StackViewLayout';
|
||||||
import Transitioner from '../Transitioner';
|
import Transitioner from '../Transitioner';
|
||||||
import NavigationActions from '../../NavigationActions';
|
|
||||||
import StackActions from '../../routers/StackActions';
|
import StackActions from '../../routers/StackActions';
|
||||||
import TransitionConfigs from './StackViewTransitionConfigs';
|
import TransitionConfigs from './StackViewTransitionConfigs';
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import withOrientation from '../withOrientation';
|
|||||||
import { NavigationProvider } from '../NavigationContext';
|
import { NavigationProvider } from '../NavigationContext';
|
||||||
|
|
||||||
import TransitionConfigs from './StackViewTransitionConfigs';
|
import TransitionConfigs from './StackViewTransitionConfigs';
|
||||||
import * as ReactNativeFeatures from '../../utils/ReactNativeFeatures';
|
import { supportsImprovedSpringAnimation } from '../../utils/ReactNativeFeatures';
|
||||||
|
|
||||||
const emptyFunction = () => {};
|
const emptyFunction = () => {};
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ class StackViewLayout extends React.Component {
|
|||||||
const {
|
const {
|
||||||
mode,
|
mode,
|
||||||
transitionProps,
|
transitionProps,
|
||||||
prevTransitionProps,
|
lastTransitionProps,
|
||||||
...passProps
|
...passProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
@@ -154,10 +154,7 @@ class StackViewLayout extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_reset(resetToIndex, duration) {
|
_reset(resetToIndex, duration) {
|
||||||
if (
|
if (Platform.OS === 'ios' && supportsImprovedSpringAnimation()) {
|
||||||
Platform.OS === 'ios' &&
|
|
||||||
ReactNativeFeatures.supportsImprovedSpringAnimation()
|
|
||||||
) {
|
|
||||||
Animated.spring(this.props.transitionProps.position, {
|
Animated.spring(this.props.transitionProps.position, {
|
||||||
toValue: resetToIndex,
|
toValue: resetToIndex,
|
||||||
stiffness: 5000,
|
stiffness: 5000,
|
||||||
@@ -197,10 +194,7 @@ class StackViewLayout extends React.Component {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (
|
if (Platform.OS === 'ios' && supportsImprovedSpringAnimation()) {
|
||||||
Platform.OS === 'ios' &&
|
|
||||||
ReactNativeFeatures.supportsImprovedSpringAnimation()
|
|
||||||
) {
|
|
||||||
Animated.spring(position, {
|
Animated.spring(position, {
|
||||||
toValue,
|
toValue,
|
||||||
stiffness: 5000,
|
stiffness: 5000,
|
||||||
@@ -236,7 +230,7 @@ class StackViewLayout extends React.Component {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
position.stopAnimation((value: number) => {
|
position.stopAnimation(value => {
|
||||||
this._isResponding = true;
|
this._isResponding = true;
|
||||||
this._gestureStartValue = value;
|
this._gestureStartValue = value;
|
||||||
});
|
});
|
||||||
@@ -244,7 +238,7 @@ class StackViewLayout extends React.Component {
|
|||||||
},
|
},
|
||||||
onMoveShouldSetPanResponder: (event, gesture) => {
|
onMoveShouldSetPanResponder: (event, gesture) => {
|
||||||
const {
|
const {
|
||||||
transitionProps: { navigation, position, layout, scene, scenes },
|
transitionProps: { navigation, layout, scene },
|
||||||
mode,
|
mode,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { index } = navigation.state;
|
const { index } = navigation.state;
|
||||||
@@ -407,6 +401,7 @@ class StackViewLayout extends React.Component {
|
|||||||
render() {
|
render() {
|
||||||
let floatingHeader = null;
|
let floatingHeader = null;
|
||||||
const headerMode = this._getHeaderMode();
|
const headerMode = this._getHeaderMode();
|
||||||
|
|
||||||
if (headerMode === 'float') {
|
if (headerMode === 'float') {
|
||||||
const { scene } = this.props.transitionProps;
|
const { scene } = this.props.transitionProps;
|
||||||
floatingHeader = (
|
floatingHeader = (
|
||||||
@@ -416,18 +411,10 @@ class StackViewLayout extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
const {
|
const {
|
||||||
transitionProps: { navigation, position, layout, scene, scenes },
|
transitionProps: { scene, scenes },
|
||||||
mode,
|
mode,
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { index } = navigation.state;
|
|
||||||
const isVertical = mode === 'modal';
|
|
||||||
const { options } = scene.descriptor;
|
const { options } = scene.descriptor;
|
||||||
const gestureDirection = options.gestureDirection;
|
|
||||||
|
|
||||||
const gestureDirectionInverted =
|
|
||||||
typeof gestureDirection === 'string'
|
|
||||||
? gestureDirection === 'inverted'
|
|
||||||
: I18nManager.isRTL;
|
|
||||||
|
|
||||||
const gesturesEnabled =
|
const gesturesEnabled =
|
||||||
typeof options.gesturesEnabled === 'boolean'
|
typeof options.gesturesEnabled === 'boolean'
|
||||||
@@ -512,13 +499,14 @@ class StackViewLayout extends React.Component {
|
|||||||
return TransitionConfigs.getTransitionConfig(
|
return TransitionConfigs.getTransitionConfig(
|
||||||
this.props.transitionConfig,
|
this.props.transitionConfig,
|
||||||
this.props.transitionProps,
|
this.props.transitionProps,
|
||||||
this.props.prevTransitionProps,
|
this.props.lastTransitionProps,
|
||||||
isModal
|
isModal
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
_renderCard = scene => {
|
_renderCard = scene => {
|
||||||
const { screenInterpolator } = this._getTransitionConfig();
|
const { screenInterpolator } = this._getTransitionConfig();
|
||||||
|
|
||||||
const style =
|
const style =
|
||||||
screenInterpolator &&
|
screenInterpolator &&
|
||||||
screenInterpolator({ ...this.props.transitionProps, scene });
|
screenInterpolator({ ...this.props.transitionProps, scene });
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { Animated, Easing, Platform } from 'react-native';
|
import { Animated, Easing, Platform } from 'react-native';
|
||||||
import StyleInterpolator from './StackViewStyleInterpolator';
|
import StyleInterpolator from './StackViewStyleInterpolator';
|
||||||
import * as ReactNativeFeatures from '../../utils/ReactNativeFeatures';
|
import { supportsImprovedSpringAnimation } from '../../utils/ReactNativeFeatures';
|
||||||
|
|
||||||
let IOSTransitionSpec;
|
let IOSTransitionSpec;
|
||||||
if (ReactNativeFeatures.supportsImprovedSpringAnimation()) {
|
if (supportsImprovedSpringAnimation()) {
|
||||||
// These are the exact values from UINavigationController's animation configuration
|
// These are the exact values from UINavigationController's animation configuration
|
||||||
IOSTransitionSpec = {
|
IOSTransitionSpec = {
|
||||||
timing: Animated.spring,
|
timing: Animated.spring,
|
||||||
|
|||||||
@@ -4828,9 +4828,9 @@ react-navigation-deprecated-tab-navigator@1.3.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react-native-tab-view "^0.0.77"
|
react-native-tab-view "^0.0.77"
|
||||||
|
|
||||||
react-navigation-drawer@0.3.2:
|
react-navigation-drawer@0.4.2:
|
||||||
version "0.3.2"
|
version "0.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-0.3.2.tgz#f9b0bd29c6859500201ec4742e81db992074aec2"
|
resolved "https://registry.yarnpkg.com/react-navigation-drawer/-/react-navigation-drawer-0.4.2.tgz#49aa1bc6684923294a9c112dce75d8ec4184c64f"
|
||||||
dependencies:
|
dependencies:
|
||||||
react-native-drawer-layout-polyfill "^1.3.2"
|
react-native-drawer-layout-polyfill "^1.3.2"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user