Files
react-navigation/src/routers/createConfigGetter.js
Brent Vatne ae98089337 Cache event subscribers and clean up after unmounting (#3648)
* This caches "child event subscribers" by key and removes them when they're not needed anymore. Once a navigator unmounts we also remove upstream subscribers.

* Fix tests
2018-03-05 11:27:57 -08:00

58 lines
1.5 KiB
JavaScript

import invariant from '../utils/invariant';
import getScreenForRouteName from './getScreenForRouteName';
import validateScreenOptions from './validateScreenOptions';
function applyConfig(configurer, navigationOptions, configProps) {
if (typeof configurer === 'function') {
return {
...navigationOptions,
...configurer({
...configProps,
navigationOptions,
}),
};
}
if (typeof configurer === 'object') {
return {
...navigationOptions,
...configurer,
};
}
return navigationOptions;
}
export default (routeConfigs, navigatorScreenConfig) => (
navigation,
screenProps
) => {
const { state, dispatch } = navigation;
const route = state;
invariant(
route.routeName && typeof route.routeName === 'string',
'Cannot get config because the route does not have a routeName.'
);
const Component = getScreenForRouteName(routeConfigs, route.routeName);
const routeConfig = routeConfigs[route.routeName];
const routeScreenConfig = routeConfig.navigationOptions;
const componentScreenConfig = Component.navigationOptions;
const configOptions = { navigation, screenProps: screenProps || {} };
let outputConfig = applyConfig(navigatorScreenConfig, {}, configOptions);
outputConfig = applyConfig(
componentScreenConfig,
outputConfig,
configOptions
);
outputConfig = applyConfig(routeScreenConfig, outputConfig, configOptions);
validateScreenOptions(outputConfig, route);
return outputConfig;
};