react-native-navigation的迁移库

platformSpecificDeprecated.android.js 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. /*eslint-disable*/
  2. import React, {Component} from 'react';
  3. import {AppRegistry, NativeModules, processColor} from 'react-native';
  4. import _ from 'lodash';
  5. import Navigation from './../Navigation';
  6. const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
  7. import * as newPlatformSpecific from './../platformSpecific';
  8. function startSingleScreenApp(params) {
  9. const screen = params.screen;
  10. if (!screen.screen) {
  11. console.error('startSingleScreenApp(params): screen must include a screen property');
  12. return;
  13. }
  14. addNavigatorParams(screen);
  15. addNavigatorButtons(screen, params.drawer);
  16. addNavigationStyleParams(screen);
  17. screen.passProps = params.passProps;
  18. /*
  19. * adapt to new API
  20. */
  21. adaptTopTabs(screen, screen.navigatorID);
  22. screen.screenId = screen.screen;
  23. params.screen = adaptNavigationStyleToScreenStyle(screen);
  24. params.screen = adaptNavigationParams(screen);
  25. params.appStyle = convertStyleParams(params.appStyle);
  26. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  27. params.overrideBackPress = screen.overrideBackPress;
  28. params.animateShow = convertAnimationType(params.animationType);
  29. newPlatformSpecific.startApp(params);
  30. }
  31. function adaptTopTabs(screen, navigatorID) {
  32. _.forEach(_.get(screen, 'topTabs'), (tab) => {
  33. addNavigatorParams(tab);
  34. if (navigatorID) {
  35. tab.navigatorID = navigatorID;
  36. }
  37. tab.screen = tab.screenId;
  38. addNavigatorButtons(tab);
  39. adaptNavigationParams(tab);
  40. addNavigationStyleParams(tab);
  41. tab = adaptNavigationStyleToScreenStyle(tab);
  42. });
  43. }
  44. function navigatorPush(navigator, params) {
  45. addNavigatorParams(params, navigator);
  46. addNavigatorButtons(params);
  47. addTitleBarBackButtonIfNeeded(params);
  48. addNavigationStyleParams(params);
  49. adaptTopTabs(params, params.navigatorID);
  50. params.screenId = params.screen;
  51. let adapted = adaptNavigationStyleToScreenStyle(params);
  52. adapted = adaptNavigationParams(adapted);
  53. adapted.overrideBackPress = params.overrideBackPress;
  54. newPlatformSpecific.push(adapted);
  55. }
  56. function navigatorPop(navigator, params) {
  57. addNavigatorParams(params, navigator);
  58. params.screenId = params.screen;
  59. let adapted = adaptNavigationStyleToScreenStyle(params);
  60. adapted = adaptNavigationParams(adapted);
  61. newPlatformSpecific.pop(adapted);
  62. }
  63. function navigatorPopToRoot(navigator, params) {
  64. addNavigatorParams(params, navigator);
  65. params.screenId = params.screen;
  66. let adapted = adaptNavigationStyleToScreenStyle(params);
  67. adapted = adaptNavigationParams(adapted);
  68. newPlatformSpecific.popToRoot(adapted);
  69. }
  70. function navigatorResetTo(navigator, params) {
  71. addNavigatorParams(params, navigator);
  72. addNavigatorButtons(params);
  73. addNavigationStyleParams(params);
  74. adaptTopTabs(params, params.navigatorID);
  75. params.screenId = params.screen;
  76. let adapted = adaptNavigationStyleToScreenStyle(params);
  77. adapted = adaptNavigationParams(adapted);
  78. newPlatformSpecific.newStack(adapted);
  79. }
  80. function adaptNavigationStyleToScreenStyle(screen) {
  81. const navigatorStyle = screen.navigatorStyle;
  82. if (!navigatorStyle) {
  83. return screen;
  84. }
  85. screen.styleParams = convertStyleParams(navigatorStyle);
  86. return _.omit(screen, ['navigatorStyle']);
  87. }
  88. function convertStyleParams(originalStyleObject) {
  89. if (!originalStyleObject) {
  90. return null;
  91. }
  92. let ret = {
  93. statusBarColor: processColor(originalStyleObject.statusBarColor),
  94. topBarColor: processColor(originalStyleObject.navBarBackgroundColor),
  95. topBarTransparent: originalStyleObject.navBarTransparent,
  96. topBarTranslucent: originalStyleObject.navBarTranslucent,
  97. topBarElevationShadowEnabled: originalStyleObject.topBarElevationShadowEnabled,
  98. collapsingToolBarImage: originalStyleObject.collapsingToolBarImage,
  99. collapsingToolBarCollapsedColor: processColor(originalStyleObject.collapsingToolBarCollapsedColor),
  100. titleBarHidden: originalStyleObject.navBarHidden,
  101. titleBarHideOnScroll: originalStyleObject.navBarHideOnScroll,
  102. titleBarTitleColor: processColor(originalStyleObject.navBarTextColor),
  103. titleBarSubtitleColor: processColor(originalStyleObject.navBarTextSubtitleColor),
  104. titleBarButtonColor: processColor(originalStyleObject.navBarButtonColor),
  105. titleBarDisabledButtonColor: processColor(originalStyleObject.titleBarDisabledButtonColor),
  106. backButtonHidden: originalStyleObject.backButtonHidden,
  107. topTabsHidden: originalStyleObject.topTabsHidden,
  108. contextualMenuStatusBarColor: processColor(originalStyleObject.contextualMenuStatusBarColor),
  109. contextualMenuBackgroundColor: processColor(originalStyleObject.contextualMenuBackgroundColor),
  110. contextualMenuButtonsColor: processColor(originalStyleObject.contextualMenuButtonsColor),
  111. drawBelowTopBar: !originalStyleObject.drawUnderNavBar,
  112. topTabTextColor: processColor(originalStyleObject.topTabTextColor),
  113. selectedTopTabTextColor: processColor(originalStyleObject.selectedTopTabTextColor),
  114. selectedTopTabIndicatorHeight: originalStyleObject.selectedTopTabIndicatorHeight,
  115. selectedTopTabIndicatorColor: processColor(originalStyleObject.selectedTopTabIndicatorColor),
  116. screenBackgroundColor: processColor(originalStyleObject.screenBackgroundColor),
  117. drawScreenAboveBottomTabs: !originalStyleObject.drawUnderTabBar,
  118. bottomTabsColor: processColor(originalStyleObject.tabBarBackgroundColor),
  119. bottomTabsButtonColor: processColor(originalStyleObject.tabBarButtonColor),
  120. bottomTabsSelectedButtonColor: processColor(originalStyleObject.tabBarSelectedButtonColor),
  121. bottomTabsHidden: originalStyleObject.tabBarHidden,
  122. bottomTabsHiddenOnScroll: originalStyleObject.bottomTabsHiddenOnScroll,
  123. forceTitlesDisplay: originalStyleObject.forceTitlesDisplay,
  124. bottomTabBadgeTextColor: processColor(originalStyleObject.bottomTabBadgeTextColor),
  125. bottomTabBadgeBackgroundColor: processColor(originalStyleObject.bottomTabBadgeBackgroundColor),
  126. navigationBarColor: processColor(originalStyleObject.navigationBarColor)
  127. }
  128. if (originalStyleObject.collapsingToolBarImage) {
  129. if (_.isString(originalStyleObject.collapsingToolBarImage)) {
  130. ret.collapsingToolBarImage = originalStyleObject.collapsingToolBarImage;
  131. }
  132. const collapsingToolBarImage = resolveAssetSource(originalStyleObject.collapsingToolBarImage)
  133. if (collapsingToolBarImage) {
  134. ret.collapsingToolBarImage = collapsingToolBarImage.uri;
  135. }
  136. }
  137. return ret;
  138. }
  139. function convertDrawerParamsToSideMenuParams(drawerParams) {
  140. const drawer = Object.assign({}, drawerParams);
  141. let result = {
  142. left: {},
  143. right: {}
  144. };
  145. Object.keys(result).forEach((key) => {
  146. if (drawer[key] && drawer[key].screen) {
  147. result[key].screenId = drawer[key].screen;
  148. addNavigatorParams(result[key]);
  149. result[key] = adaptNavigationParams(result[key]);
  150. result[key].passProps = drawer[key].passProps;
  151. result[key].disableOpenGesture = drawer.disableOpenGesture;
  152. } else {
  153. result[key] = null;
  154. }
  155. })
  156. return result;
  157. }
  158. function adaptNavigationParams(screen) {
  159. screen.navigationParams = {
  160. screenInstanceID: screen.screenInstanceID,
  161. navigatorID: screen.navigatorID,
  162. navigatorEventID: screen.navigatorEventID
  163. };
  164. return screen;
  165. }
  166. function startTabBasedApp(params) {
  167. if (!params.tabs) {
  168. console.error('startTabBasedApp(params): params.tabs is required');
  169. return;
  170. }
  171. const newTabs = [];
  172. params.tabs = _.cloneDeep(params.tabs);
  173. params.tabs.forEach(function(tab, idx) {
  174. addNavigatorParams(tab, null, idx);
  175. addNavigatorButtons(tab, params.drawer);
  176. addNavigationStyleParams(tab);
  177. addTabIcon(tab);
  178. if (!tab.passProps) {
  179. tab.passProps = params.passProps;
  180. }
  181. adaptTopTabs(tab, tab.navigatorID);
  182. tab.screenId = tab.screen;
  183. let newtab = adaptNavigationStyleToScreenStyle(tab);
  184. newtab = adaptNavigationParams(tab);
  185. newtab.overrideBackPress = tab.overrideBackPress;
  186. newTabs.push(newtab);
  187. });
  188. params.tabs = newTabs;
  189. params.appStyle = convertStyleParams(params.appStyle);
  190. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  191. params.animateShow = convertAnimationType(params.animationType);
  192. newPlatformSpecific.startApp(params);
  193. }
  194. function addTabIcon(tab) {
  195. if (tab.icon) {
  196. const icon = resolveAssetSource(tab.icon);
  197. if (icon) {
  198. tab.icon = icon.uri;
  199. }
  200. }
  201. if (!tab.icon) {
  202. throw new Error("No icon defined for tab " + tab.screen);
  203. }
  204. }
  205. function convertAnimationType(animationType) {
  206. return animationType !== 'none';
  207. }
  208. function navigatorSetButtons(navigator, navigatorEventID, params) {
  209. if (params.rightButtons) {
  210. params.rightButtons.forEach(function(button) {
  211. button.enabled = !button.disabled;
  212. if (button.icon) {
  213. const icon = resolveAssetSource(button.icon);
  214. if (icon) {
  215. button.icon = icon.uri;
  216. }
  217. }
  218. });
  219. }
  220. const leftButton = getLeftButton(params);
  221. if (leftButton) {
  222. if (leftButton.icon) {
  223. const icon = resolveAssetSource(leftButton.icon);
  224. if (icon) {
  225. leftButton.icon = icon.uri;
  226. }
  227. }
  228. }
  229. const fab = getFab(params);
  230. console.log('params: ', JSON.stringify(params));
  231. console.log('fab: ', JSON.stringify(fab));
  232. newPlatformSpecific.setScreenButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, leftButton, fab);
  233. }
  234. function navigatorSetTabBadge(navigator, params) {
  235. const badge = params.badge.toString();
  236. if (params.tabIndex >= 0) {
  237. newPlatformSpecific.setBottomTabBadgeByIndex(params.tabIndex, badge);
  238. } else {
  239. newPlatformSpecific.setBottomTabBadgeByNavigatorId(navigator.navigatorID, badge);
  240. }
  241. }
  242. function navigatorSetTitle(navigator, params) {
  243. newPlatformSpecific.setScreenTitleBarTitle(navigator.screenInstanceID, params.title);
  244. }
  245. function navigatorSetSubtitle(navigator, params) {
  246. newPlatformSpecific.setScreenTitleBarSubtitle(navigator.screenInstanceID, params.subtitle);
  247. }
  248. function navigatorSwitchToTab(navigator, params) {
  249. if (params.tabIndex >= 0) {
  250. newPlatformSpecific.selectBottomTabByTabIndex(params.tabIndex);
  251. } else {
  252. newPlatformSpecific.selectBottomTabByNavigatorId(navigator.navigatorID);
  253. }
  254. }
  255. function navigatorToggleDrawer(navigator, params) {
  256. const animated = !(params.animated === false);
  257. if (params.to) {
  258. const visible = params.to === 'open';
  259. newPlatformSpecific.setSideMenuVisible(animated, visible, params.side);
  260. } else {
  261. newPlatformSpecific.toggleSideMenuVisible(animated, params.side);
  262. }
  263. }
  264. function navigatorToggleNavBar(navigator, params) {
  265. const screenInstanceID = navigator.screenInstanceID;
  266. const visible = params.to === 'shown';
  267. const animated = !(params.animated === false);
  268. newPlatformSpecific.toggleTopBarVisible(
  269. screenInstanceID,
  270. visible,
  271. animated
  272. );
  273. }
  274. function navigatorToggleTabs(navigator, params) {
  275. const visibility = params.to === 'hidden';
  276. const animated = !(params.animated === false);
  277. newPlatformSpecific.toggleBottomTabsVisible(visibility, animated);
  278. }
  279. function showModal(params) {
  280. addNavigatorParams(params);
  281. addNavigatorButtons(params);
  282. addTitleBarBackButtonIfNeeded(params);
  283. addNavigationStyleParams(params);
  284. /*
  285. * adapt to new API
  286. */
  287. adaptTopTabs(params, params.navigatorID);
  288. params.screenId = params.screen;
  289. let adapted = adaptNavigationStyleToScreenStyle(params);
  290. adapted = adaptNavigationParams(adapted);
  291. adapted.overrideBackPress = params.overrideBackPress;
  292. newPlatformSpecific.showModal(adapted);
  293. }
  294. function dismissModal() {
  295. newPlatformSpecific.dismissTopModal();
  296. }
  297. function dismissAllModals(params) {
  298. newPlatformSpecific.dismissAllModals();
  299. }
  300. function addNavigatorParams(screen, navigator = null, idx = '') {
  301. screen.navigatorID = navigator ? navigator.navigatorID : _.uniqueId('navigatorID') + '_nav' + idx;
  302. screen.screenInstanceID = _.uniqueId('screenInstanceID');
  303. screen.navigatorEventID = screen.screenInstanceID + '_events';
  304. }
  305. function addNavigatorButtons(screen, sideMenuParams) {
  306. const Screen = Navigation.getRegisteredScreen(screen.screen);
  307. screen.navigatorButtons = _.cloneDeep(Screen.navigatorButtons);
  308. // Get image uri from image id
  309. const rightButtons = getRightButtons(screen);
  310. if (rightButtons) {
  311. rightButtons.forEach(function(button) {
  312. button.enabled = !button.disabled;
  313. if (button.icon) {
  314. const icon = resolveAssetSource(button.icon);
  315. if (icon) {
  316. button.icon = icon.uri;
  317. }
  318. }
  319. });
  320. }
  321. let leftButton = getLeftButton(screen);
  322. if (sideMenuParams && !leftButton) {
  323. leftButton = createSideMenuButton();
  324. }
  325. if (leftButton) {
  326. if (leftButton.icon) {
  327. const icon = resolveAssetSource(leftButton.icon);
  328. if (icon) {
  329. leftButton.icon = icon.uri;
  330. }
  331. }
  332. }
  333. const fab = getFab(screen);
  334. if (fab) {
  335. screen.fab = fab;
  336. }
  337. if (rightButtons) {
  338. screen.rightButtons = rightButtons;
  339. }
  340. if (leftButton) {
  341. screen.leftButton = leftButton;
  342. }
  343. }
  344. function getFab(screen) {
  345. let fab = screen.fab;
  346. if (screen.navigatorButtons && screen.navigatorButtons.fab) {
  347. fab = screen.navigatorButtons.fab;
  348. }
  349. if (fab === null || fab === undefined) {
  350. return;
  351. }
  352. if (Object.keys(fab).length === 0 ) {
  353. return {};
  354. }
  355. const collapsedIconUri = resolveAssetSource(fab.collapsedIcon);
  356. if (!collapsedIconUri) {
  357. return;
  358. }
  359. fab.collapsedIcon = collapsedIconUri.uri;
  360. if (fab.expendedIcon) {
  361. const expendedIconUri = resolveAssetSource(fab.expendedIcon);
  362. if (expendedIconUri) {
  363. fab.expendedIcon = expendedIconUri.uri;
  364. }
  365. }
  366. if (fab.backgroundColor) {
  367. fab.backgroundColor = processColor(fab.backgroundColor);
  368. }
  369. if (fab.actions) {
  370. _.forEach(fab.actions, (action) => {
  371. action.icon = resolveAssetSource(action.icon).uri;
  372. return action;
  373. });
  374. }
  375. return fab;
  376. }
  377. function createSideMenuButton() {
  378. return {
  379. id: "sideMenu"
  380. };
  381. }
  382. function addTitleBarBackButtonIfNeeded(screen) {
  383. const leftButton = getLeftButton(screen);
  384. if (!leftButton) {
  385. screen.leftButton = {
  386. id: 'back'
  387. }
  388. }
  389. }
  390. function getLeftButton(screen) {
  391. const leftButton = getLeftButtonDeprecated(screen);
  392. if (leftButton) {
  393. return leftButton;
  394. }
  395. if (screen.navigatorButtons && screen.navigatorButtons.leftButtons) {
  396. return screen.navigatorButtons.leftButtons[0];
  397. }
  398. if (screen.leftButtons) {
  399. if (_.isArray(screen.leftButtons)) {
  400. return screen.leftButtons[0];
  401. } else {
  402. return screen.leftButtons;
  403. }
  404. }
  405. return null;
  406. }
  407. function getLeftButtonDeprecated(screen) {
  408. if (screen.navigatorButtons && screen.navigatorButtons.leftButton) {
  409. return screen.navigatorButtons.leftButton;
  410. }
  411. return screen.leftButton;
  412. }
  413. function getRightButtons(screen) {
  414. if (screen.navigatorButtons && screen.navigatorButtons.rightButtons) {
  415. return screen.navigatorButtons.rightButtons;
  416. }
  417. return screen.rightButtons;
  418. }
  419. function addNavigationStyleParams(screen) {
  420. const Screen = Navigation.getRegisteredScreen(screen.screen);
  421. screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
  422. }
  423. function showSnackbar(navigator, params) {
  424. return newPlatformSpecific.showSnackbar(params);
  425. }
  426. function showContextualMenu(navigator, params) {
  427. const contextualMenu = {
  428. buttons: [],
  429. backButton: {id: 'back'},
  430. navigationParams: {navigatorEventID: navigator.navigatorEventID}
  431. };
  432. params.rightButtons.forEach((button, index) => {
  433. const btn = {
  434. icon: resolveAssetSource(button.icon),
  435. showAsAction: button.showAsAction,
  436. color: processColor(button.color),
  437. label: button.title,
  438. index
  439. };
  440. if (btn.icon) {
  441. btn.icon = btn.icon.uri;
  442. }
  443. contextualMenu.buttons.push(btn);
  444. });
  445. newPlatformSpecific.showContextualMenu(navigator.screenInstanceID, contextualMenu, params.onButtonPressed);
  446. }
  447. function dismissContextualMenu() {
  448. newPlatformSpecific.dismissContextualMenu();
  449. }
  450. export default {
  451. startTabBasedApp,
  452. startSingleScreenApp,
  453. navigatorPush,
  454. navigatorPop,
  455. navigatorPopToRoot,
  456. navigatorResetTo,
  457. showModal,
  458. dismissModal,
  459. dismissAllModals,
  460. navigatorSetButtons,
  461. navigatorSetTabBadge,
  462. navigatorSetTitle,
  463. navigatorSetSubtitle,
  464. navigatorSwitchToTab,
  465. navigatorToggleDrawer,
  466. navigatorToggleTabs,
  467. navigatorToggleNavBar,
  468. showSnackbar,
  469. showContextualMenu,
  470. dismissContextualMenu
  471. };