feature-react-navigation is a feature-u module which provide a routing aspect into your features using react-navigation.
The module aim to build a single navigation tree with routes provided by each feature registred in your feature-u instance. Your features don’t have the knowledge off the final tree, they only have to expose their routes throught the route
aspect.
$ yarn add feature-react-navigation
Additionnally, you may need peerDependencies installed :
$ yarn add feature-u
$ yarn add @react-navigation/core
$ yarn add @react-navigation/native
or
$ yarn add @react-navigation/web
Within your mainline, register the feature-react-navigation routeAspect
to feature-u’s launchApp() method.
Please note that routeAspect has 1 required named parameter (see below for details) :
import { launchApp } from 'feature-u';
import { createRouteAspect } from 'feature-react-navigation';
import { createAppContainer } from '@react-navigation/native';
import features from './feature';
// configure Aspects (as needed)
const routeAspect = createRouteAspect({
Navigator
});
export default launchApp({
aspects: [
routeAspect,
... other Aspects here
],
features,
registerRootAppElm(rootAppElm) {
AppRegistry.registerComponent(appName, () => () => rootAppElm); // convert rootAppElm to a React Component
},
});
This is the classic
With this configuration, the module stay a pure react
module. Any adherence with react-native
is no longer required.
In mobile application, the navigation stack could be a lot more complex than on the web and react-navigation
respond to that complexity by providing some different navigators (stack, switch, tab, drawer). The navigationPattern
configuration is the way to deal with it in feature-react-navigation
.
Beside, features don’t have to know how the navigation is organize in the final application. Even, you may want to re-use some feature across applications whithout inheriting the same navigation stack. With this way of building navigation stack, your application have total control about it.
-
navigator
: create[Navigator] function -
navigationOptions
: options taken by the navigator function -
routes
: list of named route from features -
featureRoutes
: list of feature names, expended to each routes starting by the feature name - see [Promote routes].
const Navigator = ({ routes }) => {
return (
<NavigatorContainer>
<Stack.Navigator>
{routes.map(route => <Stack.Screen name={route.screen.name} component={route.screen} />)}
</Stack.Navigator>
</NavigatorContainer>
)
}
Within each feature that promotes UI Screens, simply register the feature’s route through the Feature.route
property (using feature-u's [createFeature()
]).
In the sample, login
feature promotes somes routes in a react-navigation
[compatible format](https://reactnavigation.org/docs/en/hello-react-navigation.html). It’s strongly encouraged to prefix all route names by the feature name in order to use [featureRoutes]
pattern configuration.
import React from 'react';
import {createFeature} from 'feature-u';
import fname from './feature-name'
import {LoginScreen,
LoginSuccessScreen} from './screens';
export default createFeature({
name: 'login',
route: {
routes: {
[`${fname}.LOGIN`]: {
screen: LoginScreen,
},
[`${fname}.SUCCESS`]: {
screen: LoginSuccessScreen,
},
},
},
... snip snip
});