react-native-navigation的迁移库

platformSpecificDeprecated.android.js 14KB

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