123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- import utils from './utils';
- import Navigation from './Navigation';
- import Controllers, { Modal } from 'react-native-controllers';
- const React = Controllers.hijackReact();
- const {
- ControllerRegistry,
- TabBarControllerIOS,
- NavigationControllerIOS,
- DrawerControllerIOS
- } = React;
-
- function startTabBasedApp(params) {
- if (!params.tabs) {
- console.error('startTabBasedApp(params): params.tabs is required');
- return;
- }
- const controllerID = utils.getRandomId();
- const Controller = Controllers.createClass({
- render: function() {
- if (!params.drawer || (!params.drawer.left && !params.drawer.right)) {
- return this.renderBody();
- } else {
- const navigatorID = controllerID + '_drawer';
- return (
- <DrawerControllerIOS id={navigatorID}
- componentLeft={params.drawer.left ? params.drawer.left.screen : undefined}
- passPropsLeft={{navigatorID: navigatorID}}
- componentRight={params.drawer.right ? params.drawer.right.screen : undefined}
- passPropsRight={{navigatorID: navigatorID}}
- disableOpenGesture={params.drawer.disableOpenGesture}
- >
- {this.renderBody()}
- </DrawerControllerIOS>
- );
- }
- },
- renderBody: function() {
- return (
- <TabBarControllerIOS
- id={controllerID + '_tabs'}
- style={params.tabsStyle}>
- {
- params.tabs.map(function(tab, index) {
- const navigatorID = controllerID + '_nav' + index;
- const screenInstanceID = utils.getRandomId();
- if (!tab.screen) {
- console.error('startTabBasedApp(params): every tab must include a screen property, take a look at tab#' + (index+1));
- return;
- }
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(tab.screen, screenInstanceID, tab);
- return (
- <TabBarControllerIOS.Item {...tab} title={tab.label}>
- <NavigationControllerIOS
- id={navigatorID}
- title={tab.title}
- component={tab.screen}
- passProps={{
- navigatorID: navigatorID,
- screenInstanceID: screenInstanceID,
- navigatorEventID: navigatorEventID
- }}
- style={navigatorStyle}
- leftButtons={navigatorButtons.leftButtons}
- rightButtons={navigatorButtons.rightButtons}
- />
- </TabBarControllerIOS.Item>
- );
- })
- }
- </TabBarControllerIOS>
- );
- }
- });
- ControllerRegistry.registerController(controllerID, () => Controller);
- ControllerRegistry.setRootController(controllerID, params.animationType, params.passProps || {});
- }
-
- function startSingleScreenApp(params) {
- if (!params.screen) {
- console.error('startSingleScreenApp(params): params.screen is required');
- return;
- }
- const controllerID = utils.getRandomId();
- const Controller = Controllers.createClass({
- render: function() {
- if (!params.drawer || (!params.drawer.left && !params.drawer.right)) {
- return this.renderBody();
- } else {
- const navigatorID = controllerID + '_drawer';
- return (
- <DrawerControllerIOS id={navigatorID}
- componentLeft={params.drawer.left ? params.drawer.left.screen : undefined}
- passPropsLeft={{navigatorID: navigatorID}}
- componentRight={params.drawer.right ? params.drawer.right.screen : undefined}
- passPropsRight={{navigatorID: navigatorID}}
- disableOpenGesture={params.drawer.disableOpenGesture}>
- {this.renderBody()}
- </DrawerControllerIOS>
- );
- }
- },
- renderBody: function() {
- const screen = params.screen;
- const navigatorID = controllerID + '_nav';
- const screenInstanceID = utils.getRandomId();
- if (!screen.screen) {
- console.error('startSingleScreenApp(params): screen must include a screen property');
- return;
- }
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(screen.screen, screenInstanceID, screen);
- return (
- <NavigationControllerIOS
- id={navigatorID}
- title={screen.title}
- component={screen.screen}
- passProps={{
- navigatorID: navigatorID,
- screenInstanceID: screenInstanceID,
- navigatorEventID: navigatorEventID
- }}
- style={navigatorStyle}
- leftButtons={navigatorButtons.leftButtons}
- rightButtons={navigatorButtons.rightButtons}
- />
- );
- }
- });
- ControllerRegistry.registerController(controllerID, () => Controller);
- ControllerRegistry.setRootController(controllerID, params.animationType, params.passProps || {});
- }
-
- function _mergeScreenSpecificSettings(screenID, screenInstanceID, params) {
- const screenClass = Navigation.getRegisteredScreen(screenID);
- if (!screenClass) {
- console.error('Cannot create screen ' + screenID + '. Are you it was registered with Navigation.registerScreen?');
- return;
- }
- const navigatorStyle = Object.assign({}, screenClass.navigatorStyle);
- if (params.navigatorStyle) {
- Object.assign(navigatorStyle, params.navigatorStyle);
- }
-
- const navigatorEventID = screenInstanceID + '_events';
- const navigatorButtons = Object.assign({}, screenClass.navigatorButtons);
- if (params.navigatorButtons) {
- Object.assign(navigatorButtons, params.navigatorButtons);
- }
- if (navigatorButtons.leftButtons) {
- for (let i = 0 ; i < navigatorButtons.leftButtons.length ; i++) {
- navigatorButtons.leftButtons[i].onPress = navigatorEventID;
- }
- }
- if (navigatorButtons.rightButtons) {
- for (let i = 0 ; i < navigatorButtons.rightButtons.length ; i++) {
- navigatorButtons.rightButtons[i].onPress = navigatorEventID;
- }
- }
- return { navigatorStyle, navigatorButtons, navigatorEventID };
- }
-
- function navigatorPush(navigator, params) {
- if (!params.screen) {
- console.error('Navigator.push(params): params.screen is required');
- return;
- }
- const screenInstanceID = utils.getRandomId();
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
- const passProps = Object.assign({}, params.passProps);
- passProps.navigatorID = navigator.navigatorID;
- passProps.screenInstanceID = screenInstanceID;
- passProps.navigatorEventID = navigatorEventID;
- Controllers.NavigationControllerIOS(navigator.navigatorID).push({
- title: params.title,
- component: params.screen,
- animated: params.animated,
- passProps: passProps,
- style: navigatorStyle,
- backButtonTitle: params.backButtonTitle,
- backButtonHidden: params.backButtonHidden,
- leftButtons: navigatorButtons.leftButtons,
- rightButtons: navigatorButtons.rightButtons
- });
- }
-
- function navigatorPop(navigator, params) {
- Controllers.NavigationControllerIOS(navigator.navigatorID).pop({
- animated: params.animated
- });
- }
-
- function navigatorPopToRoot(navigator, params) {
- Controllers.NavigationControllerIOS(navigator.navigatorID).popToRoot({
- animated: params.animated
- });
- }
-
- function navigatorResetTo(navigator, params) {
- if (!params.screen) {
- console.error('Navigator.resetTo(params): params.screen is required');
- return;
- }
- const screenInstanceID = utils.getRandomId();
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
- const passProps = Object.assign({}, params.passProps);
- passProps.navigatorID = navigator.navigatorID;
- passProps.screenInstanceID = screenInstanceID;
- passProps.navigatorEventID = navigatorEventID;
- Controllers.NavigationControllerIOS(navigator.navigatorID).resetTo({
- title: params.title,
- component: params.screen,
- animated: params.animated,
- passProps: passProps,
- style: navigatorStyle,
- leftButtons: navigatorButtons.leftButtons,
- rightButtons: navigatorButtons.rightButtons
- });
- }
-
- function navigatorSetTitle(navigator, params) {
- Controllers.NavigationControllerIOS(navigator.navigatorID).setTitle({
- title: params.title
- });
- }
-
- function navigatorToggleDrawer(navigator, params) {
- const controllerID = navigator.navigatorID.split('_')[0];
- if (params.to == 'open') {
- Controllers.DrawerControllerIOS(controllerID + '_drawer').open({
- side: params.side,
- animated: params.animated
- });
- } else if (params.to == 'closed') {
- Controllers.DrawerControllerIOS(controllerID + '_drawer').close({
- side: params.side,
- animated: params.animated
- });
- } else {
- Controllers.DrawerControllerIOS(controllerID + '_drawer').toggle({
- side: params.side,
- animated: params.animated
- });
- }
- }
-
- function navigatorToggleTabs(navigator, params) {
- const controllerID = navigator.navigatorID.split('_')[0];
- Controllers.TabBarControllerIOS(controllerID + '_tabs').setHidden({
- hidden: params.to == 'hidden',
- animated: !(params.animated === false)
- });
- }
-
- function navigatorSetTabBadge(navigator, params) {
- const controllerID = navigator.navigatorID.split('_')[0];
- if (params.tabIndex || params.tabIndex === 0) {
- Controllers.TabBarControllerIOS(controllerID + '_tabs').setBadge({
- tabIndex: params.tabIndex,
- badge: params.badge
- });
- } else {
- Controllers.TabBarControllerIOS(controllerID + '_tabs').setBadge({
- contentId: navigator.navigatorID,
- contentType: 'NavigationControllerIOS',
- badge: params.badge
- });
- }
- }
-
- function navigatorSwitchToTab(navigator, params) {
- const controllerID = navigator.navigatorID.split('_')[0];
- if (params.tabIndex || params.tabIndex === 0) {
- Controllers.TabBarControllerIOS(controllerID + '_tabs').switchTo({
- tabIndex: params.tabIndex
- });
- } else {
- Controllers.TabBarControllerIOS(controllerID + '_tabs').switchTo({
- contentId: navigator.navigatorID,
- contentType: 'NavigationControllerIOS'
- });
- }
- }
-
- function navigatorSetButtons(navigator, navigatorEventID, params) {
- if (params.leftButtons) {
- const buttons = params.leftButtons.slice(); // clone
- for (let i = 0 ; i < buttons.length ; i++) {
- buttons[i].onPress = navigatorEventID;
- }
- Controllers.NavigationControllerIOS(navigator.navigatorID).setLeftButtons(buttons, params.animated);
- }
- if (params.rightButtons) {
- const buttons = params.rightButtons.slice(); // clone
- for (let i = 0 ; i < buttons.length ; i++) {
- buttons[i].onPress = navigatorEventID;
- }
- Controllers.NavigationControllerIOS(navigator.navigatorID).setRightButtons(buttons, params.animated);
- }
- }
-
- function showModal(params) {
- if (!params.screen) {
- console.error('showModal(params): params.screen is required');
- return;
- }
- const controllerID = utils.getRandomId();
- const Controller = Controllers.createClass({
- render: function() {
- const navigatorID = controllerID + '_nav';
- const screenInstanceID = utils.getRandomId();
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
- const passProps = Object.assign({}, params.passProps);
- passProps.navigatorID = navigatorID;
- passProps.screenInstanceID = screenInstanceID;
- passProps.navigatorEventID = navigatorEventID;
- return (
- <NavigationControllerIOS
- id={navigatorID}
- title={params.title}
- component={params.screen}
- passProps={passProps}
- style={navigatorStyle}
- leftButtons={navigatorButtons.leftButtons}
- rightButtons={navigatorButtons.rightButtons}
- />
- );
- }
- });
- ControllerRegistry.registerController(controllerID, () => Controller);
- Modal.showController(controllerID, params.animationType);
- }
-
- function dismissModal(params) {
- Modal.dismissController(params.animationType);
- }
-
- function dismissAllModals(params) {
- Modal.dismissAllControllers(params.animationType);
- }
-
- function showLightBox(params) {
- if (!params.screen) {
- console.error('showLightBox(params): params.screen is required');
- return;
- }
- const controllerID = utils.getRandomId();
- const navigatorID = controllerID + '_nav';
- const screenInstanceID = utils.getRandomId();
- const {
- navigatorStyle,
- navigatorButtons,
- navigatorEventID
- } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
- const passProps = Object.assign({}, params.passProps);
- passProps.navigatorID = navigatorID;
- passProps.screenInstanceID = screenInstanceID;
- passProps.navigatorEventID = navigatorEventID;
- Modal.showLightBox({
- component: params.screen,
- passProps: passProps,
- style: params.style
- });
- }
-
- function dismissLightBox(params) {
- Modal.dismissLightBox();
- }
-
- export default {
- startTabBasedApp,
- startSingleScreenApp,
- navigatorPush,
- navigatorPop,
- navigatorPopToRoot,
- navigatorResetTo,
- showModal,
- dismissModal,
- dismissAllModals,
- showLightBox,
- dismissLightBox,
- navigatorSetButtons,
- navigatorSetTitle,
- navigatorToggleDrawer,
- navigatorToggleTabs,
- navigatorSetTabBadge,
- navigatorSwitchToTab
- }
|