Skip to content

Feature based navigation for react-native (using react-navigation)

License

Notifications You must be signed in to change notification settings

sylvainlg/feature-react-navigation

Repository files navigation

feature-react-navigation - Feature based navigation using react-navigation

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.

feature react navigation 508c8d7d913a4c3ca61b7428dea59bdb 508c8d7d913a4c3ca61b7428dea59bdb feature react navigation

Getting started

$ 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

Usage

1 - Register the aspect

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) :

App.js

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
    },
});

Navigator object configuration

This is the classic

With this configuration, the module stay a pure react module. Any adherence with react-native is no longer required.

navigationPattern configuration

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>
  )
}

2 - Promote routes

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.

src/feature/login/index.js
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
});