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