react-native-navigation的迁移库

platformSpecificDeprecated.android.js 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. /*eslint-disable*/
  2. import React, {Component} from 'react';
  3. import ReactNative, {AppRegistry, NativeModules, processColor} from 'react-native';
  4. import _ from 'lodash';
  5. import PropRegistry from './../PropRegistry';
  6. import Navigation from './../Navigation';
  7. const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
  8. import * as newPlatformSpecific from './../platformSpecific';
  9. async function startSingleScreenApp(params) {
  10. const screen = params.screen;
  11. if (!screen.screen) {
  12. console.error('startSingleScreenApp(params): screen must include a screen property');
  13. return;
  14. }
  15. addNavigatorParams(screen);
  16. addNavigatorButtons(screen, params.drawer);
  17. addNavigationStyleParams(screen);
  18. screen.passProps = params.passProps;
  19. /*
  20. * adapt to new API
  21. */
  22. adaptTopTabs(screen, screen.navigatorID);
  23. screen.screenId = screen.screen;
  24. params.screen = adaptNavigationStyleToScreenStyle(screen);
  25. params.screen = adaptNavigationParams(screen);
  26. params.appStyle = convertStyleParams(params.appStyle);
  27. if (params.appStyle) {
  28. params.appStyle.orientation = getOrientation(params);
  29. }
  30. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  31. params.overrideBackPress = screen.overrideBackPress;
  32. params.animateShow = convertAnimationType(params.animationType);
  33. return await newPlatformSpecific.startApp(params);
  34. }
  35. function getOrientation(params) {
  36. if (params.portraitOnlyMode || _.get(params, 'appStyle.orientation') === 'portrait') {
  37. return 'portrait';
  38. }
  39. if (params.landscaptOnlyMode || _.get(params, 'appStyle.orientation') === 'landscape') {
  40. return 'landscape';
  41. }
  42. return 'auto';
  43. }
  44. function adaptTopTabs(screen, navigatorID) {
  45. screen.topTabs = _.cloneDeep(screen.topTabs);
  46. _.forEach(_.get(screen, 'topTabs'), (tab) => {
  47. addNavigatorParams(tab);
  48. if (navigatorID) {
  49. tab.navigatorID = navigatorID;
  50. }
  51. tab.screen = tab.screenId;
  52. if (tab.icon) {
  53. addTabIcon(tab);
  54. }
  55. addNavigatorButtons(tab);
  56. adaptNavigationParams(tab);
  57. addNavigationStyleParams(tab);
  58. tab = adaptNavigationStyleToScreenStyle(tab);
  59. });
  60. }
  61. function navigatorPush(navigator, params) {
  62. addNavigatorParams(params, navigator);
  63. addNavigatorButtons(params);
  64. addTitleBarBackButtonIfNeeded(params);
  65. addNavigationStyleParams(params);
  66. adaptTopTabs(params, params.navigatorID);
  67. params.screenId = params.screen;
  68. let adapted = adaptNavigationStyleToScreenStyle(params);
  69. adapted = adaptNavigationParams(adapted);
  70. adapted.overrideBackPress = params.overrideBackPress;
  71. adapted.timestamp = Date.now();
  72. if (!adapted.passProps) {
  73. adapted.passProps = {};
  74. }
  75. if (!adapted.passProps.commandType) {
  76. adapted.passProps.commandType = 'Push';
  77. }
  78. return newPlatformSpecific.push(adapted);
  79. }
  80. function navigatorPop(navigator, params) {
  81. addNavigatorParams(params, navigator);
  82. params.screenId = params.screen;
  83. let adapted = adaptNavigationStyleToScreenStyle(params);
  84. adapted = adaptNavigationParams(adapted);
  85. adapted.timestamp = Date.now();
  86. newPlatformSpecific.pop(adapted);
  87. }
  88. function navigatorPopToRoot(navigator, params) {
  89. addNavigatorParams(params, navigator);
  90. params.screenId = params.screen;
  91. let adapted = adaptNavigationStyleToScreenStyle(params);
  92. adapted = adaptNavigationParams(adapted);
  93. adapted.timestamp = Date.now();
  94. newPlatformSpecific.popToRoot(adapted);
  95. }
  96. function navigatorResetTo(navigator, params) {
  97. addNavigatorParams(params, navigator);
  98. addNavigatorButtons(params);
  99. addNavigationStyleParams(params);
  100. adaptTopTabs(params, params.navigatorID);
  101. params.screenId = params.screen;
  102. let adapted = adaptNavigationStyleToScreenStyle(params);
  103. adapted = adaptNavigationParams(adapted);
  104. adapted.timestamp = Date.now();
  105. newPlatformSpecific.newStack(adapted);
  106. }
  107. function adaptNavigationStyleToScreenStyle(screen) {
  108. const navigatorStyle = screen.navigatorStyle;
  109. if (!navigatorStyle) {
  110. return screen;
  111. }
  112. screen.styleParams = convertStyleParams(navigatorStyle);
  113. return _.omit(screen, ['navigatorStyle']);
  114. }
  115. function convertStyleParams(originalStyleObject) {
  116. if (!originalStyleObject) {
  117. return null;
  118. }
  119. let ret = {
  120. orientation: originalStyleObject.orientation,
  121. screenAnimationType: originalStyleObject.screenAnimationType,
  122. statusBarColor: processColor(originalStyleObject.statusBarColor),
  123. statusBarHidden: originalStyleObject.statusBarHidden,
  124. statusBarTextColorScheme: originalStyleObject.statusBarTextColorScheme,
  125. drawUnderStatusBar: originalStyleObject.drawUnderStatusBar,
  126. topBarReactView: originalStyleObject.navBarCustomView,
  127. topBarReactViewAlignment: originalStyleObject.navBarComponentAlignment,
  128. topBarReactViewInitialProps: originalStyleObject.navBarCustomViewInitialProps,
  129. topBarColor: processColor(originalStyleObject.navBarBackgroundColor),
  130. topBarTransparent: originalStyleObject.navBarTransparent,
  131. topBarTranslucent: originalStyleObject.navBarTranslucent,
  132. topBarElevationShadowEnabled: originalStyleObject.topBarElevationShadowEnabled,
  133. topBarCollapseOnScroll: originalStyleObject.topBarCollapseOnScroll,
  134. topBarBorderColor: processColor(originalStyleObject.topBarBorderColor),
  135. topBarBorderWidth: originalStyleObject.topBarBorderWidth && `${originalStyleObject.topBarBorderWidth}`,
  136. collapsingToolBarImage: originalStyleObject.collapsingToolBarImage,
  137. collapsingToolBarComponent: originalStyleObject.collapsingToolBarComponent,
  138. collapsingToolBarComponentHeight: originalStyleObject.collapsingToolBarComponentHeight,
  139. collapsingToolBarCollapsedColor: processColor(originalStyleObject.collapsingToolBarCollapsedColor),
  140. collapsingToolBarExpendedColor: processColor(originalStyleObject.collapsingToolBarExpendedColor),
  141. showTitleWhenExpended: originalStyleObject.showTitleWhenExpended,
  142. expendCollapsingToolBarOnTopTabChange: originalStyleObject.expendCollapsingToolBarOnTopTabChange,
  143. titleBarHidden: originalStyleObject.navBarHidden,
  144. titleBarHideOnScroll: originalStyleObject.navBarHideOnScroll,
  145. titleBarTitleColor: processColor(originalStyleObject.navBarTextColor),
  146. titleBarSubtitleColor: processColor(originalStyleObject.navBarSubtitleColor),
  147. titleBarSubtitleFontSize: originalStyleObject.navBarSubtitleFontSize,
  148. titleBarSubtitleFontFamily: originalStyleObject.navBarSubtitleFontFamily,
  149. titleBarButtonColor: processColor(originalStyleObject.navBarButtonColor),
  150. titleBarButtonFontFamily: originalStyleObject.navBarButtonFontFamily,
  151. titleBarDisabledButtonColor: processColor(originalStyleObject.titleBarDisabledButtonColor),
  152. titleBarTitleFontFamily: originalStyleObject.navBarTextFontFamily,
  153. titleBarTitleFontSize: originalStyleObject.navBarTextFontSize,
  154. titleBarTitleFontBold: originalStyleObject.navBarTextFontBold,
  155. titleBarTitleTextCentered: originalStyleObject.navBarTitleTextCentered,
  156. titleBarSubTitleTextCentered: originalStyleObject.navBarSubTitleTextCentered,
  157. titleBarHeight: originalStyleObject.navBarHeight,
  158. titleBarTopPadding: originalStyleObject.navBarTopPadding,
  159. backButtonHidden: originalStyleObject.backButtonHidden,
  160. topTabsHidden: originalStyleObject.topTabsHidden,
  161. contextualMenuStatusBarColor: processColor(originalStyleObject.contextualMenuStatusBarColor),
  162. contextualMenuBackgroundColor: processColor(originalStyleObject.contextualMenuBackgroundColor),
  163. contextualMenuButtonsColor: processColor(originalStyleObject.contextualMenuButtonsColor),
  164. drawBelowTopBar: !originalStyleObject.drawUnderNavBar,
  165. topTabTextColor: processColor(originalStyleObject.topTabTextColor),
  166. topTabTextFontFamily: originalStyleObject.topTabTextFontFamily,
  167. topTabIconColor: processColor(originalStyleObject.topTabIconColor),
  168. selectedTopTabIconColor: processColor(originalStyleObject.selectedTopTabIconColor),
  169. selectedTopTabTextColor: processColor(originalStyleObject.selectedTopTabTextColor),
  170. selectedTopTabIndicatorHeight: originalStyleObject.selectedTopTabIndicatorHeight,
  171. selectedTopTabIndicatorColor: processColor(originalStyleObject.selectedTopTabIndicatorColor),
  172. topTabsScrollable: originalStyleObject.topTabsScrollable,
  173. topTabsHeight: originalStyleObject.topTabsHeight,
  174. screenBackgroundColor: processColor(originalStyleObject.screenBackgroundColor),
  175. drawScreenAboveBottomTabs: !originalStyleObject.drawUnderTabBar,
  176. initialTabIndex: originalStyleObject.initialTabIndex,
  177. bottomTabsColor: processColor(originalStyleObject.tabBarBackgroundColor),
  178. bottomTabsButtonColor: processColor(originalStyleObject.tabBarButtonColor),
  179. bottomTabsSelectedButtonColor: processColor(originalStyleObject.tabBarSelectedButtonColor),
  180. bottomTabsHidden: originalStyleObject.tabBarHidden,
  181. bottomTabsHiddenOnScroll: originalStyleObject.bottomTabsHiddenOnScroll,
  182. forceTitlesDisplay: originalStyleObject.forceTitlesDisplay,
  183. bottomTabBadgeTextColor: processColor(originalStyleObject.bottomTabBadgeTextColor),
  184. bottomTabBadgeBackgroundColor: processColor(originalStyleObject.bottomTabBadgeBackgroundColor),
  185. bottomTabFontFamily: originalStyleObject.tabFontFamily,
  186. navigationBarColor: processColor(originalStyleObject.navigationBarColor)
  187. };
  188. if (originalStyleObject.disabledButtonColor) {
  189. ret.titleBarDisabledButtonColor = processColor(originalStyleObject.disabledButtonColor);
  190. }
  191. if (originalStyleObject.collapsingToolBarImage) {
  192. if (_.isString(originalStyleObject.collapsingToolBarImage)) {
  193. ret.collapsingToolBarImage = originalStyleObject.collapsingToolBarImage;
  194. }
  195. const collapsingToolBarImage = resolveAssetSource(originalStyleObject.collapsingToolBarImage)
  196. if (collapsingToolBarImage) {
  197. ret.collapsingToolBarImage = collapsingToolBarImage.uri;
  198. }
  199. }
  200. if (_.isUndefined(ret.expendCollapsingToolBarOnTopTabChange)) {
  201. ret.expendCollapsingToolBarOnTopTabChange = true;
  202. }
  203. if (ret.topBarReactViewInitialProps) {
  204. const passPropsKey = _.uniqueId('customNavBarComponent');
  205. PropRegistry.save(passPropsKey, ret.topBarReactViewInitialProps);
  206. ret.topBarReactViewInitialProps = {passPropsKey};
  207. }
  208. return ret;
  209. }
  210. function convertDrawerParamsToSideMenuParams(drawerParams) {
  211. const drawer = Object.assign({}, drawerParams);
  212. let result = {
  213. left: {},
  214. right: {}
  215. };
  216. Object.keys(result).forEach((key) => {
  217. if (drawer[key] && drawer[key].screen) {
  218. result[key].screenId = drawer[key].screen;
  219. addNavigatorParams(result[key]);
  220. result[key] = adaptNavigationParams(result[key]);
  221. result[key].passProps = drawer[key].passProps;
  222. if (drawer.disableOpenGesture) {
  223. result[key].disableOpenGesture = parseInt(drawer.disableOpenGesture);
  224. } else {
  225. let fixedWidth = drawer[key].disableOpenGesture;
  226. result[key].disableOpenGesture = fixedWidth ? parseInt(fixedWidth) : null;
  227. }
  228. if (drawer.fixedWidth) {
  229. result[key].fixedWidth = drawer.fixedWidth;
  230. } else {
  231. result[key].fixedWidth = drawer[key].fixedWidth;
  232. }
  233. } else {
  234. result[key] = null;
  235. }
  236. })
  237. return result;
  238. }
  239. function adaptNavigationParams(screen) {
  240. screen.navigationParams = {
  241. screenInstanceID: screen.screenInstanceID,
  242. navigatorID: screen.navigatorID,
  243. navigatorEventID: screen.navigatorEventID
  244. };
  245. return screen;
  246. }
  247. async function startTabBasedApp(params) {
  248. if (!params.tabs) {
  249. console.error('startTabBasedApp(params): params.tabs is required');
  250. return;
  251. }
  252. const newTabs = [];
  253. params.tabs = _.cloneDeep(params.tabs);
  254. params.tabs.forEach(function(tab, idx) {
  255. addNavigatorParams(tab, null, idx);
  256. addNavigatorButtons(tab, params.drawer);
  257. addNavigationStyleParams(tab);
  258. addTabIcon(tab);
  259. if (!tab.passProps) {
  260. tab.passProps = params.passProps;
  261. }
  262. adaptTopTabs(tab, tab.navigatorID);
  263. tab.screenId = tab.screen;
  264. let newtab = adaptNavigationStyleToScreenStyle(tab);
  265. newtab = adaptNavigationParams(tab);
  266. newtab.overrideBackPress = tab.overrideBackPress;
  267. newtab.timestamp = Date.now();
  268. newTabs.push(newtab);
  269. });
  270. params.tabs = newTabs;
  271. params.appStyle = convertStyleParams(params.appStyle);
  272. if (params.appStyle) {
  273. params.appStyle.orientation = getOrientation(params);
  274. }
  275. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  276. params.animateShow = convertAnimationType(params.animationType);
  277. return await newPlatformSpecific.startApp(params);
  278. }
  279. function addTabIcon(tab) {
  280. if (tab.icon) {
  281. const icon = resolveAssetSource(tab.icon);
  282. if (icon) {
  283. tab.icon = icon.uri;
  284. }
  285. }
  286. if (!tab.icon) {
  287. throw new Error("No icon defined for tab " + tab.screen);
  288. }
  289. }
  290. function convertAnimationType(animationType) {
  291. return animationType !== 'none';
  292. }
  293. function navigatorSetButtons(navigator, navigatorEventID, _params) {
  294. const params = _.cloneDeep(_params);
  295. if (params.rightButtons) {
  296. params.rightButtons.forEach(function(button) {
  297. button.enabled = !button.disabled;
  298. if (button.icon) {
  299. const icon = resolveAssetSource(button.icon);
  300. if (icon) {
  301. button.icon = icon.uri;
  302. }
  303. }
  304. if (button.buttonColor) {
  305. button.color = processColor(button.buttonColor);
  306. }
  307. if (button.component) {
  308. const passPropsKey = _.uniqueId('customButtonComponent');
  309. PropRegistry.save(passPropsKey, button.passProps);
  310. button.passProps = {passPropsKey};
  311. }
  312. });
  313. }
  314. let leftButton = getLeftButton(params);
  315. if (leftButton) {
  316. if (leftButton.icon) {
  317. const icon = resolveAssetSource(leftButton.icon);
  318. if (icon) {
  319. leftButton.icon = icon.uri;
  320. }
  321. }
  322. if (leftButton.buttonColor) {
  323. leftButton.color = processColor(leftButton.buttonColor);
  324. }
  325. } else if (shouldRemoveLeftButton(params)) {
  326. leftButton = {};
  327. }
  328. const fab = getFab(params);
  329. newPlatformSpecific.setScreenButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, leftButton, fab);
  330. }
  331. function shouldRemoveLeftButton(params) {
  332. return params.leftButtons && params.leftButtons.length === 0;
  333. }
  334. function navigatorSetTabBadge(navigator, params) {
  335. const badge = params.badge ? params.badge.toString() : '';
  336. if (params.tabIndex >= 0) {
  337. newPlatformSpecific.setBottomTabBadgeByIndex(params.tabIndex, badge);
  338. } else {
  339. newPlatformSpecific.setBottomTabBadgeByNavigatorId(navigator.navigatorID, badge);
  340. }
  341. }
  342. function navigatorSetTabButton(navigator, params) {
  343. if (params.icon) {
  344. const icon = resolveAssetSource(params.icon);
  345. if (icon) {
  346. params.icon = icon.uri;
  347. }
  348. }
  349. params.navigationParams = {};
  350. if (params.tabIndex >= 0) {
  351. newPlatformSpecific.setBottomTabButtonByIndex(params.tabIndex, params);
  352. } else {
  353. newPlatformSpecific.setBottomTabButtonByNavigatorId(navigator.navigatorID, params);
  354. }
  355. }
  356. function navigatorSetTitle(navigator, params) {
  357. newPlatformSpecific.setScreenTitleBarTitle(navigator.screenInstanceID, params.title);
  358. }
  359. function navigatorSetSubtitle(navigator, params) {
  360. newPlatformSpecific.setScreenTitleBarSubtitle(navigator.screenInstanceID, params.subtitle);
  361. }
  362. function navigatorSetStyle(navigator, params) {
  363. const style = convertStyleParams(params);
  364. newPlatformSpecific.setScreenStyle(navigator.screenInstanceID, style);
  365. }
  366. function navigatorSwitchToTab(navigator, params) {
  367. if (params.tabIndex >= 0) {
  368. newPlatformSpecific.selectBottomTabByTabIndex(params.tabIndex);
  369. } else {
  370. newPlatformSpecific.selectBottomTabByNavigatorId(navigator.navigatorID);
  371. }
  372. }
  373. function navigatorSwitchToTopTab(navigator, params) {
  374. if (params.tabIndex >= 0) {
  375. newPlatformSpecific.selectTopTabByTabIndex(navigator.screenInstanceID, params.tabIndex);
  376. } else {
  377. newPlatformSpecific.selectTopTabByScreen(navigator.screenInstanceID);
  378. }
  379. }
  380. function navigatorToggleDrawer(navigator, params) {
  381. const animated = !(params.animated === false);
  382. if (params.to) {
  383. const visible = params.to === 'open';
  384. newPlatformSpecific.setSideMenuVisible(animated, visible, params.side);
  385. } else {
  386. newPlatformSpecific.toggleSideMenuVisible(animated, params.side);
  387. }
  388. }
  389. function navigatorSetDrawerEnabled(navigator, params) {
  390. newPlatformSpecific.setSideMenuEnabled(params.enabled, params.side);
  391. }
  392. function navigatorToggleNavBar(navigator, params) {
  393. const screenInstanceID = navigator.screenInstanceID;
  394. const visible = params.to === 'shown' || params.to === 'show';
  395. const animated = !(params.animated === false);
  396. newPlatformSpecific.toggleTopBarVisible(
  397. screenInstanceID,
  398. visible,
  399. animated
  400. );
  401. }
  402. function navigatorToggleTabs(navigator, params) {
  403. const visibility = params.to === 'hidden';
  404. const animated = !(params.animated === false);
  405. newPlatformSpecific.toggleBottomTabsVisible(visibility, animated);
  406. }
  407. function showModal(params) {
  408. addNavigatorParams(params);
  409. addNavigatorButtons(params);
  410. addTitleBarBackButtonIfNeeded(params);
  411. addNavigationStyleParams(params);
  412. /*
  413. * adapt to new API
  414. */
  415. adaptTopTabs(params, params.navigatorID);
  416. params.screenId = params.screen;
  417. let adapted = adaptNavigationStyleToScreenStyle(params);
  418. adapted = adaptNavigationParams(adapted);
  419. adapted.overrideBackPress = params.overrideBackPress;
  420. adapted.timestamp = Date.now();
  421. if (!adapted.passProps) {
  422. adapted.passProps = {};
  423. }
  424. if (!adapted.passProps.commandType) {
  425. adapted.passProps.commandType = 'ShowModal';
  426. }
  427. newPlatformSpecific.showModal(adapted);
  428. }
  429. function showLightBox(params) {
  430. params.navigationParams = {};
  431. addNavigatorParams(params.navigationParams);
  432. params.screenId = params.screen;
  433. const backgroundBlur = _.get(params, 'style.backgroundBlur');
  434. const backgroundColor = _.get(params, 'style.backgroundColor');
  435. if (backgroundColor) {
  436. params.backgroundColor = processColor(backgroundColor);
  437. } else {
  438. if (backgroundBlur === 'dark') {
  439. params.backgroundColor = processColor('rgba(0, 0, 0, 0.5)');
  440. } else {
  441. params.backgroundColor = processColor('transparent');
  442. }
  443. }
  444. params.tapBackgroundToDismiss = _.get(params, 'style.tapBackgroundToDismiss') || false;
  445. newPlatformSpecific.showLightBox(params);
  446. }
  447. function dismissLightBox() {
  448. newPlatformSpecific.dismissLightBox();
  449. }
  450. function dismissModal(params) {
  451. newPlatformSpecific.dismissTopModal({
  452. ...params,
  453. navigationParams: {}
  454. });
  455. }
  456. function dismissAllModals(params) {
  457. newPlatformSpecific.dismissAllModals();
  458. }
  459. function showInAppNotification(params) {
  460. params.navigationParams = {};
  461. addNavigatorParams(params.navigationParams);
  462. params.autoDismissTimerSec = params.autoDismissTimerSec || 5;
  463. if (params.autoDismiss === false) delete params.autoDismissTimerSec;
  464. newPlatformSpecific.showInAppNotification(params);
  465. }
  466. function dismissInAppNotification(params) {
  467. newPlatformSpecific.dismissInAppNotification(params);
  468. }
  469. function addNavigatorParams(screen, navigator = null, idx = '') {
  470. screen.navigatorID = navigator ? navigator.navigatorID : _.uniqueId('navigatorID') + '_nav' + idx;
  471. screen.screenInstanceID = _.uniqueId('screenInstanceID');
  472. screen.navigatorEventID = screen.screenInstanceID + '_events';
  473. }
  474. function addNavigatorButtons(screen, sideMenuParams) {
  475. const Screen = Navigation.getRegisteredScreen(screen.screen);
  476. if (screen.navigatorButtons == null) {
  477. screen.navigatorButtons = _.cloneDeep(Screen.navigatorButtons);
  478. }
  479. // Get image uri from image id
  480. const rightButtons = getRightButtons(screen);
  481. if (rightButtons) {
  482. rightButtons.forEach(function(button) {
  483. button.enabled = !button.disabled;
  484. if (button.icon) {
  485. const icon = resolveAssetSource(button.icon);
  486. if (icon) {
  487. button.icon = icon.uri;
  488. }
  489. }
  490. if (button.buttonColor) {
  491. button.color = processColor(button.buttonColor);
  492. }
  493. if (button.component) {
  494. const passPropsKey = _.uniqueId('customButtonComponent');
  495. PropRegistry.save(passPropsKey, button.passProps);
  496. button.passProps = {passPropsKey};
  497. }
  498. });
  499. }
  500. let leftButton = getLeftButton(screen);
  501. if (leftButton) {
  502. if (leftButton.icon) {
  503. const icon = resolveAssetSource(leftButton.icon);
  504. if (icon) {
  505. leftButton.icon = icon.uri;
  506. }
  507. }
  508. if (leftButton.buttonColor) {
  509. leftButton.color = processColor(leftButton.buttonColor);
  510. }
  511. }
  512. const fab = getFab(screen);
  513. if (fab) {
  514. screen.fab = fab;
  515. }
  516. if (rightButtons) {
  517. screen.rightButtons = rightButtons;
  518. }
  519. if (leftButton) {
  520. screen.leftButton = leftButton;
  521. }
  522. }
  523. function getFab(screen) {
  524. let fab = screen.fab;
  525. if (screen.navigatorButtons && screen.navigatorButtons.fab) {
  526. fab = screen.navigatorButtons.fab;
  527. }
  528. if (fab === null || fab === undefined) {
  529. return;
  530. }
  531. if (Object.keys(fab).length === 0 ) {
  532. return {};
  533. }
  534. const collapsedIconUri = resolveAssetSource(fab.collapsedIcon);
  535. if (!collapsedIconUri) {
  536. return;
  537. }
  538. fab.collapsedIcon = collapsedIconUri.uri;
  539. if (fab.expendedIcon) {
  540. const expendedIconUri = resolveAssetSource(fab.expendedIcon);
  541. if (expendedIconUri) {
  542. fab.expendedIcon = expendedIconUri.uri;
  543. }
  544. }
  545. if (fab.backgroundColor) {
  546. fab.backgroundColor = processColor(fab.backgroundColor);
  547. }
  548. if (fab.collapsedIconColor) {
  549. fab.collapsedIconColor = processColor(fab.collapsedIconColor);
  550. }
  551. if (fab.expendedIconColor) {
  552. fab.expendedIconColor = processColor(fab.expendedIconColor);
  553. }
  554. if (fab.actions) {
  555. _.forEach(fab.actions, (action) => {
  556. action.icon = resolveAssetSource(action.icon).uri;
  557. if (action.backgroundColor) {
  558. action.backgroundColor = processColor(action.backgroundColor)
  559. }
  560. if (action.iconColor) {
  561. action.iconColor = processColor(action.iconColor)
  562. }
  563. return action;
  564. });
  565. }
  566. return fab;
  567. }
  568. function createSideMenuButton() {
  569. return {
  570. id: "sideMenu"
  571. };
  572. }
  573. function addTitleBarBackButtonIfNeeded(screen) {
  574. const leftButton = getLeftButton(screen);
  575. if (!leftButton) {
  576. screen.leftButton = {
  577. id: 'back'
  578. }
  579. }
  580. }
  581. function getLeftButton(screen) {
  582. const leftButton = getLeftButtonDeprecated(screen);
  583. if (leftButton) {
  584. return leftButton;
  585. }
  586. if (screen.navigatorButtons && screen.navigatorButtons.leftButtons) {
  587. return screen.navigatorButtons.leftButtons[0];
  588. }
  589. if (screen.leftButtons) {
  590. if (_.isArray(screen.leftButtons)) {
  591. return screen.leftButtons[0];
  592. } else {
  593. return screen.leftButtons;
  594. }
  595. }
  596. return null;
  597. }
  598. function getLeftButtonDeprecated(screen) {
  599. if (screen.navigatorButtons && screen.navigatorButtons.leftButton) {
  600. return screen.navigatorButtons.leftButton;
  601. }
  602. return screen.leftButton;
  603. }
  604. function getRightButtons(screen) {
  605. if (screen.navigatorButtons && screen.navigatorButtons.rightButtons) {
  606. return screen.navigatorButtons.rightButtons;
  607. } else if (screen.rightButtons) {
  608. return screen.rightButtons
  609. }
  610. const Screen = Navigation.getRegisteredScreen(screen.screen);
  611. if (Screen.navigatorButtons && !_.isEmpty(Screen.navigatorButtons.rightButtons)) {
  612. return _.cloneDeep(Screen.navigatorButtons.rightButtons);
  613. }
  614. return null;
  615. }
  616. function addNavigationStyleParams(screen) {
  617. const Screen = Navigation.getRegisteredScreen(screen.screen);
  618. screen.navigatorStyle = Object.assign({}, Screen.navigatorStyle, screen.navigatorStyle);
  619. }
  620. function showSnackbar(params) {
  621. const adapted = _.cloneDeep(params);
  622. if (adapted.backgroundColor) {
  623. adapted.backgroundColor = processColor(adapted.backgroundColor);
  624. }
  625. if (adapted.actionColor) {
  626. adapted.actionColor = processColor(adapted.actionColor);
  627. }
  628. if (adapted.textColor) {
  629. adapted.textColor = processColor(adapted.textColor);
  630. }
  631. return newPlatformSpecific.showSnackbar(adapted);
  632. }
  633. function dismissSnackbar() {
  634. return newPlatformSpecific.dismissSnackbar();
  635. }
  636. function showContextualMenu(navigator, params) {
  637. const contextualMenu = {
  638. buttons: [],
  639. backButton: {id: 'back'},
  640. navigationParams: {navigatorEventID: navigator.navigatorEventID}
  641. };
  642. params.rightButtons.forEach((button, index) => {
  643. const btn = {
  644. icon: resolveAssetSource(button.icon),
  645. showAsAction: button.showAsAction,
  646. color: processColor(button.color),
  647. label: button.title,
  648. index
  649. };
  650. if (btn.icon) {
  651. btn.icon = btn.icon.uri;
  652. }
  653. contextualMenu.buttons.push(btn);
  654. });
  655. newPlatformSpecific.showContextualMenu(navigator.screenInstanceID, contextualMenu, params.onButtonPressed);
  656. }
  657. function dismissContextualMenu() {
  658. newPlatformSpecific.dismissContextualMenu();
  659. }
  660. async function isAppLaunched() {
  661. return await newPlatformSpecific.isAppLaunched();
  662. }
  663. async function isRootLaunched() {
  664. return await newPlatformSpecific.isRootLaunched();
  665. }
  666. async function getCurrentlyVisibleScreenId() {
  667. return await newPlatformSpecific.getCurrentlyVisibleScreenId();
  668. }
  669. async function getLaunchArgs() {
  670. return await newPlatformSpecific.getLaunchArgs();
  671. }
  672. export default {
  673. startTabBasedApp,
  674. startSingleScreenApp,
  675. navigatorPush,
  676. navigatorPop,
  677. navigatorPopToRoot,
  678. navigatorResetTo,
  679. showModal,
  680. dismissModal,
  681. dismissAllModals,
  682. showInAppNotification,
  683. showLightBox,
  684. dismissLightBox,
  685. dismissInAppNotification,
  686. navigatorSetButtons,
  687. navigatorSetTabBadge,
  688. navigatorSetTabButton,
  689. navigatorSetTitle,
  690. navigatorSetSubtitle,
  691. navigatorSetStyle,
  692. navigatorSwitchToTab,
  693. navigatorSwitchToTopTab,
  694. navigatorToggleDrawer,
  695. navigatorSetDrawerEnabled,
  696. navigatorToggleTabs,
  697. navigatorToggleNavBar,
  698. showSnackbar,
  699. dismissSnackbar,
  700. showContextualMenu,
  701. dismissContextualMenu,
  702. isAppLaunched,
  703. isRootLaunched,
  704. getCurrentlyVisibleScreenId,
  705. getLaunchArgs
  706. };