react-native-navigation的迁移库

platformSpecificDeprecated.android.js 15KB

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