react-native-navigation的迁移库

platformSpecificDeprecated.android.js 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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: originalStyleObject.statusBarColor,
  94. topBarColor: originalStyleObject.navBarBackgroundColor,
  95. topBarTransparent: originalStyleObject.navBarTransparent,
  96. topBarTranslucent: originalStyleObject.navBarTranslucent,
  97. collapsingToolBarImage: originalStyleObject.collapsingToolBarImage,
  98. collapsingToolBarCollapsedColor: originalStyleObject.collapsingToolBarCollapsedColor,
  99. titleBarHidden: originalStyleObject.navBarHidden,
  100. titleBarHideOnScroll: originalStyleObject.navBarHideOnScroll,
  101. titleBarTitleColor: originalStyleObject.navBarTextColor,
  102. titleBarSubtitleColor: originalStyleObject.navBarTextSubtitleColor,
  103. titleBarButtonColor: originalStyleObject.navBarButtonColor,
  104. titleBarDisabledButtonColor: originalStyleObject.titleBarDisabledButtonColor,
  105. backButtonHidden: originalStyleObject.backButtonHidden,
  106. topTabsHidden: originalStyleObject.topTabsHidden,
  107. contextualMenuStatusBarColor: originalStyleObject.contextualMenuStatusBarColor,
  108. contextualMenuBackgroundColor: originalStyleObject.contextualMenuBackgroundColor,
  109. contextualMenuButtonsColor: originalStyleObject.contextualMenuButtonsColor,
  110. drawBelowTopBar: !originalStyleObject.drawUnderNavBar,
  111. topTabTextColor: originalStyleObject.topTabTextColor,
  112. selectedTopTabTextColor: originalStyleObject.selectedTopTabTextColor,
  113. selectedTopTabIndicatorHeight: originalStyleObject.selectedTopTabIndicatorHeight,
  114. selectedTopTabIndicatorColor: originalStyleObject.selectedTopTabIndicatorColor,
  115. drawScreenAboveBottomTabs: !originalStyleObject.drawUnderTabBar,
  116. bottomTabsColor: originalStyleObject.tabBarBackgroundColor,
  117. bottomTabsButtonColor: originalStyleObject.tabBarButtonColor,
  118. bottomTabsSelectedButtonColor: originalStyleObject.tabBarSelectedButtonColor,
  119. bottomTabsHidden: originalStyleObject.tabBarHidden,
  120. bottomTabsHiddenOnScroll: originalStyleObject.bottomTabsHiddenOnScroll,
  121. forceTitlesDisplay: originalStyleObject.forceTitlesDisplay,
  122. bottomTabBadgeTextColor: originalStyleObject.bottomTabBadgeTextColor,
  123. bottomTabBadgeBackgroundColor: originalStyleObject.bottomTabBadgeBackgroundColor,
  124. navigationBarColor: originalStyleObject.navigationBarColor
  125. }
  126. if (originalStyleObject.collapsingToolBarImage) {
  127. if (_.isString(originalStyleObject.collapsingToolBarImage)) {
  128. ret.collapsingToolBarImage = originalStyleObject.collapsingToolBarImage;
  129. }
  130. const collapsingToolBarImage = resolveAssetSource(originalStyleObject.collapsingToolBarImage)
  131. if (collapsingToolBarImage) {
  132. ret.collapsingToolBarImage = collapsingToolBarImage.uri;
  133. }
  134. }
  135. return ret;
  136. }
  137. function convertDrawerParamsToSideMenuParams(drawerParams) {
  138. const drawer = Object.assign({}, drawerParams);
  139. if (!drawer.left || !drawer.left.screen) {
  140. return null;
  141. }
  142. let result = {};
  143. result.disableOpenGesture = drawer.disableOpenGesture !== undefined;
  144. result.screenId = drawer.left.screen;
  145. addNavigatorParams(result);
  146. result = adaptNavigationParams(result);
  147. result.passProps = drawer.passProps;
  148. return result;
  149. }
  150. function adaptNavigationParams(screen) {
  151. screen.navigationParams = {
  152. screenInstanceID: screen.screenInstanceID,
  153. navigatorID: screen.navigatorID,
  154. navigatorEventID: screen.navigatorEventID
  155. };
  156. return screen;
  157. }
  158. function startTabBasedApp(params) {
  159. if (!params.tabs) {
  160. console.error('startTabBasedApp(params): params.tabs is required');
  161. return;
  162. }
  163. const newTabs = [];
  164. params.tabs.forEach(function(tab, idx) {
  165. addNavigatorParams(tab, null, idx);
  166. addNavigatorButtons(tab, params.drawer);
  167. addNavigationStyleParams(tab);
  168. addTabIcon(tab);
  169. if (!tab.passProps) {
  170. tab.passProps = params.passProps;
  171. }
  172. adaptTopTabs(tab, tab.navigatorID);
  173. tab.screenId = tab.screen;
  174. let newtab = adaptNavigationStyleToScreenStyle(tab);
  175. newtab = adaptNavigationParams(tab);
  176. newtab.overrideBackPress = tab.overrideBackPress;
  177. newTabs.push(newtab);
  178. });
  179. params.tabs = newTabs;
  180. params.appStyle = convertStyleParams(params.appStyle);
  181. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  182. params.animateShow = convertAnimationType(params.animationType);
  183. newPlatformSpecific.startApp(params);
  184. }
  185. function addTabIcon(tab) {
  186. if (tab.icon) {
  187. const icon = resolveAssetSource(tab.icon);
  188. if (icon) {
  189. tab.icon = icon.uri;
  190. }
  191. }
  192. if (!tab.icon) {
  193. throw new Error("No icon defined for tab " + tab.screen);
  194. }
  195. }
  196. function convertAnimationType(animationType) {
  197. return animationType !== 'none';
  198. }
  199. function navigatorSetButtons(navigator, navigatorEventID, params) {
  200. if (params.rightButtons) {
  201. params.rightButtons.forEach(function(button) {
  202. button.enabled = !button.disabled;
  203. if (button.icon) {
  204. const icon = resolveAssetSource(button.icon);
  205. if (icon) {
  206. button.icon = icon.uri;
  207. }
  208. }
  209. });
  210. }
  211. const leftButton = getLeftButton(params);
  212. if (leftButton) {
  213. if (leftButton.icon) {
  214. const icon = resolveAssetSource(leftButton.icon);
  215. if (icon) {
  216. leftButton.icon = icon.uri;
  217. }
  218. }
  219. }
  220. newPlatformSpecific.setScreenTitleBarButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, leftButton);
  221. }
  222. function navigatorSetTabBadge(navigator, params) {
  223. const badge = params.badge.toString();
  224. if (params.tabIndex >= 0) {
  225. newPlatformSpecific.setBottomTabBadgeByIndex(params.tabIndex, badge);
  226. } else {
  227. newPlatformSpecific.setBottomTabBadgeByNavigatorId(navigator.navigatorID, badge);
  228. }
  229. }
  230. function navigatorSetTitle(navigator, params) {
  231. newPlatformSpecific.setScreenTitleBarTitle(navigator.screenInstanceID, params.title);
  232. }
  233. function navigatorSetSubtitle(navigator, params) {
  234. newPlatformSpecific.setScreenTitleBarSubtitle(navigator.screenInstanceID, params.subtitle);
  235. }
  236. function navigatorSwitchToTab(navigator, params) {
  237. if (params.tabIndex >= 0) {
  238. newPlatformSpecific.selectBottomTabByTabIndex(params.tabIndex);
  239. } else {
  240. newPlatformSpecific.selectBottomTabByNavigatorId(navigator.navigatorID);
  241. }
  242. }
  243. function navigatorToggleDrawer(navigator, params) {
  244. const animated = !(params.animated === false);
  245. if (params.to) {
  246. const visible = params.to === 'open';
  247. newPlatformSpecific.setSideMenuVisible(animated, visible);
  248. } else {
  249. newPlatformSpecific.toggleSideMenuVisible(animated);
  250. }
  251. }
  252. function navigatorToggleNavBar(navigator, params) {
  253. const screenInstanceID = navigator.screenInstanceID;
  254. const visible = params.to === 'shown';
  255. const animated = !(params.animated === false);
  256. newPlatformSpecific.toggleTopBarVisible(
  257. screenInstanceID,
  258. visible,
  259. animated
  260. );
  261. }
  262. function navigatorToggleTabs(navigator, params) {
  263. const visibility = params.to === 'hidden';
  264. const animated = !(params.animated === false);
  265. newPlatformSpecific.toggleBottomTabsVisible(visibility, animated);
  266. }
  267. function showModal(params) {
  268. addNavigatorParams(params);
  269. addNavigatorButtons(params);
  270. addTitleBarBackButtonIfNeeded(params);
  271. addNavigationStyleParams(params);
  272. /*
  273. * adapt to new API
  274. */
  275. adaptTopTabs(params, params.navigatorID);
  276. params.screenId = params.screen;
  277. let adapted = adaptNavigationStyleToScreenStyle(params);
  278. adapted = adaptNavigationParams(adapted);
  279. adapted.overrideBackPress = params.overrideBackPress;
  280. newPlatformSpecific.showModal(adapted);
  281. }
  282. function dismissModal() {
  283. newPlatformSpecific.dismissTopModal();
  284. }
  285. function dismissAllModals(params) {
  286. newPlatformSpecific.dismissAllModals();
  287. }
  288. function addNavigatorParams(screen, navigator = null, idx = '') {
  289. screen.navigatorID = navigator ? navigator.navigatorID : _.uniqueId('navigatorID') + '_nav' + idx;
  290. screen.screenInstanceID = _.uniqueId('screenInstanceID');
  291. screen.navigatorEventID = screen.screenInstanceID + '_events';
  292. }
  293. function addNavigatorButtons(screen, sideMenuParams) {
  294. const Screen = Navigation.getRegisteredScreen(screen.screen);
  295. screen.navigatorButtons = _.cloneDeep(Screen.navigatorButtons);
  296. // Get image uri from image id
  297. const rightButtons = getRightButtons(screen);
  298. if (rightButtons) {
  299. rightButtons.forEach(function(button) {
  300. button.enabled = !button.disabled;
  301. if (button.icon) {
  302. const icon = resolveAssetSource(button.icon);
  303. if (icon) {
  304. button.icon = icon.uri;
  305. }
  306. }
  307. });
  308. }
  309. let leftButton = getLeftButton(screen);
  310. if (sideMenuParams && !leftButton) {
  311. leftButton = createSideMenuButton();
  312. }
  313. if (leftButton) {
  314. if (leftButton.icon) {
  315. const icon = resolveAssetSource(leftButton.icon);
  316. if (icon) {
  317. leftButton.icon = icon.uri;
  318. }
  319. }
  320. }
  321. const fab = getFab(screen);
  322. if (fab) {
  323. screen.fab = fab;
  324. }
  325. if (rightButtons) {
  326. screen.rightButtons = rightButtons;
  327. }
  328. if (leftButton) {
  329. screen.leftButton = leftButton;
  330. }
  331. }
  332. function getFab(screen) {
  333. if (screen.fab) {
  334. const fab = screen.fab;
  335. const collapsedIconUri = resolveAssetSource(fab.collapsedIcon);
  336. if (!collapsedIconUri) {
  337. return;
  338. }
  339. fab.collapsedIcon = collapsedIconUri.uri;
  340. if (fab.expendedIcon) {
  341. const expendedIconUri = resolveAssetSource(fab.expendedIcon);
  342. if (expendedIconUri) {
  343. fab.expendedIcon = expendedIconUri.uri;
  344. }
  345. }
  346. if (fab.actions) {
  347. _.forEach(fab.actions, (action) => {
  348. action.icon = resolveAssetSource(action.icon).uri;
  349. return action;
  350. });
  351. }
  352. return fab;
  353. }
  354. }
  355. function createSideMenuButton() {
  356. return {
  357. id: "sideMenu"
  358. };
  359. }
  360. function addTitleBarBackButtonIfNeeded(screen) {
  361. const leftButton = getLeftButton(screen);
  362. if (!leftButton) {
  363. screen.leftButton = {
  364. id: 'back'
  365. }
  366. }
  367. }
  368. function getLeftButton(screen) {
  369. const leftButton = getLeftButtonDeprecated(screen);
  370. if (leftButton) {
  371. return leftButton;
  372. }
  373. if (screen.navigatorButtons && screen.navigatorButtons.leftButtons) {
  374. return screen.navigatorButtons.leftButtons[0];
  375. }
  376. if (screen.leftButtons) {
  377. if (_.isArray(screen.leftButtons)) {
  378. return screen.leftButtons[0];
  379. } else {
  380. return screen.leftButtons;
  381. }
  382. }
  383. return null;
  384. }
  385. function getLeftButtonDeprecated(screen) {
  386. if (screen.navigatorButtons && screen.navigatorButtons.leftButton) {
  387. return screen.navigatorButtons.leftButton;
  388. }
  389. return screen.leftButton;
  390. }
  391. function getRightButtons(screen) {
  392. if (screen.navigatorButtons && screen.navigatorButtons.rightButtons) {
  393. return screen.navigatorButtons.rightButtons;
  394. }
  395. return screen.rightButtons;
  396. }
  397. function addNavigationStyleParams(screen) {
  398. const Screen = Navigation.getRegisteredScreen(screen.screen);
  399. screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
  400. }
  401. function showSnackbar(navigator, params) {
  402. return newPlatformSpecific.showSnackbar(params);
  403. }
  404. function showContextualMenu(navigator, params) {
  405. const contextualMenu = {
  406. buttons: [],
  407. backButton: {id: 'back'},
  408. navigationParams: {navigatorEventID: navigator.navigatorEventID}
  409. };
  410. params.rightButtons.forEach((button, index) => {
  411. const btn = {
  412. icon: resolveAssetSource(button.icon).uri,
  413. color: processColor(button.color),
  414. label: button.title,
  415. index
  416. };
  417. contextualMenu.buttons.push(btn);
  418. });
  419. newPlatformSpecific.showContextualMenu(navigator.screenInstanceID, contextualMenu, params.onButtonPressed);
  420. }
  421. function dismissContextualMenu() {
  422. newPlatformSpecific.dismissContextualMenu();
  423. }
  424. export default {
  425. startTabBasedApp,
  426. startSingleScreenApp,
  427. navigatorPush,
  428. navigatorPop,
  429. navigatorPopToRoot,
  430. navigatorResetTo,
  431. showModal,
  432. dismissModal,
  433. dismissAllModals,
  434. navigatorSetButtons,
  435. navigatorSetTabBadge,
  436. navigatorSetTitle,
  437. navigatorSetSubtitle,
  438. navigatorSwitchToTab,
  439. navigatorToggleDrawer,
  440. navigatorToggleTabs,
  441. navigatorToggleNavBar,
  442. showSnackbar,
  443. showContextualMenu,
  444. dismissContextualMenu
  445. };