Source: app-navigator.js

import { AppRegistry } from 'react-native'

/**
 * @typedef {Object} AppNavigatorOptions
 * @property {string} initialScreen - The initial screen for the miniapp.  If falsy,
 * the first screen defined in the screens will be used.
 */

/**
 * @constructor
 * @param {Object} screens - The screens to register.
 * @param {Object} options - The navigation options.
 * @example
 * import { AppNavigator } from 'ern-navigation'
 * new AppNavigator({
 *   'MainScreen': MainScreenComponent,
 *   'SecondScreen': SecondScreenComponent
 * }, {
 *   initialScreen: 'MainScreen'
 * }).registerAll('MyMiniApp')
 */
class AppNavigator {
  static screens = {}
  static options = {}

  constructor (screens, options) {
    if (!screens || Object.keys(screens).length < 1) {
      throw new Error('screens parameter must be a non-empty object')
    }
    let firstScreen = Object.keys(screens)[0]
    Object.keys(screens).forEach(screen => {
      if (!screen || !screens[screen]) {
        throw new Error('each screen must be defined')
      }
    })
    this.screens = screens
    this.options = options || {}
    if (!this.options.initialScreen) {
      this.options.initialScreen = firstScreen
    }
    if (!(this.options.initialScreen in this.screens)) {
      throw new Error('the initial screen must be a valid screen identifier')
    }
  }

  /**
   * Register all screens.
   * @param {!string} miniappName - The name of the miniapp.
   */
  registerAll (miniappName) {
    Object.keys(this.screens).forEach(screen => {
      const route = screen === this.options.initialScreen ? miniappName : `${miniappName}.${screen}`
      this.screens[screen].setRegisteredRoute(route)
      this.screens[screen].setAppNavigator(this)
      AppRegistry.registerComponent(
        route,
        () => this.screens[screen]
      )
    })
  }
}

export default AppNavigator