react-native-navigation的迁移库

platformSpecificDeprecated.android.js 26KB

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