react-native-navigation的迁移库

platformSpecificDeprecated.android.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. import React, {Component} from 'react';
  2. import {AppRegistry, NativeModules} from 'react-native';
  3. import _ from 'lodash';
  4. import Navigation from './../Navigation';
  5. const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
  6. import * as newPlatformSpecific from './../platformSpecific';
  7. function startSingleScreenApp(params) {
  8. const screen = params.screen;
  9. if (!screen.screen) {
  10. console.error('startSingleScreenApp(params): screen must include a screen property');
  11. return;
  12. }
  13. addNavigatorParams(screen);
  14. addNavigatorButtons(screen, params.drawer);
  15. addNavigationStyleParams(screen);
  16. screen.passProps = params.passProps;
  17. /*
  18. * adapt to new API
  19. */
  20. adaptTopTabs(screen, screen.navigatorID);
  21. screen.screenId = screen.screen;
  22. params.screen = adaptNavigationStyleToScreenStyle(screen);
  23. params.screen = adaptNavigationParams(screen);
  24. params.appStyle = convertStyleParams(params.appStyle);
  25. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  26. params.overrideBackPress = screen.overrideBackPress;
  27. params.animateShow = convertAnimationType(params.animationType);
  28. newPlatformSpecific.startApp(params);
  29. }
  30. function adaptTopTabs(screen, navigatorID) {
  31. _.forEach(_.get(screen, 'topTabs'), (tab) => {
  32. addNavigatorParams(tab);
  33. if (navigatorID) {
  34. tab.navigatorID = navigatorID;
  35. }
  36. adaptNavigationParams(tab);
  37. });
  38. }
  39. function navigatorPush(navigator, params) {
  40. addNavigatorParams(params, navigator);
  41. addNavigatorButtons(params);
  42. addTitleBarBackButtonIfNeeded(params);
  43. addNavigationStyleParams(params);
  44. adaptTopTabs(params, params.navigatorID);
  45. params.screenId = params.screen;
  46. let adapted = adaptNavigationStyleToScreenStyle(params);
  47. adapted = adaptNavigationParams(adapted);
  48. adapted.overrideBackPress = params.overrideBackPress;
  49. newPlatformSpecific.push(adapted);
  50. }
  51. function navigatorPop(navigator, params) {
  52. addNavigatorParams(params, navigator);
  53. params.screenId = params.screen;
  54. let adapted = adaptNavigationStyleToScreenStyle(params);
  55. adapted = adaptNavigationParams(adapted);
  56. newPlatformSpecific.pop(adapted);
  57. }
  58. function navigatorPopToRoot(navigator, params) {
  59. addNavigatorParams(params, navigator);
  60. params.screenId = params.screen;
  61. let adapted = adaptNavigationStyleToScreenStyle(params);
  62. adapted = adaptNavigationParams(adapted);
  63. newPlatformSpecific.popToRoot(adapted);
  64. }
  65. function navigatorResetTo(navigator, params) {
  66. addNavigatorParams(params, navigator);
  67. addNavigatorButtons(params);
  68. addNavigationStyleParams(params);
  69. adaptTopTabs(params, params.navigatorID);
  70. params.screenId = params.screen;
  71. let adapted = adaptNavigationStyleToScreenStyle(params);
  72. adapted = adaptNavigationParams(adapted);
  73. newPlatformSpecific.newStack(adapted);
  74. }
  75. function adaptNavigationStyleToScreenStyle(screen) {
  76. const navigatorStyle = screen.navigatorStyle;
  77. if (!navigatorStyle) {
  78. return screen;
  79. }
  80. screen.styleParams = convertStyleParams(navigatorStyle);
  81. return _.omit(screen, ['navigatorStyle']);
  82. }
  83. function convertStyleParams(originalStyleObject) {
  84. if (!originalStyleObject) {
  85. return null;
  86. }
  87. return {
  88. statusBarColor: originalStyleObject.statusBarColor,
  89. topBarColor: originalStyleObject.navBarBackgroundColor,
  90. titleBarHidden: originalStyleObject.navBarHidden,
  91. titleBarTitleColor: originalStyleObject.navBarTextColor,
  92. titleBarButtonColor: originalStyleObject.navBarButtonColor,
  93. titleBarDisabledButtonColor: originalStyleObject.titleBarDisabledButtonColor,
  94. backButtonHidden: originalStyleObject.backButtonHidden,
  95. topTabsHidden: originalStyleObject.topTabsHidden,
  96. drawBelowTopBar: !originalStyleObject.drawUnderNavBar,
  97. topTabTextColor: originalStyleObject.topTabTextColor,
  98. selectedTopTabTextColor: originalStyleObject.selectedTopTabTextColor,
  99. selectedTopTabIndicatorHeight: originalStyleObject.selectedTopTabIndicatorHeight,
  100. selectedTopTabIndicatorColor: originalStyleObject.selectedTopTabIndicatorColor,
  101. drawScreenAboveBottomTabs: !originalStyleObject.drawUnderTabBar,
  102. bottomTabsColor: originalStyleObject.tabBarBackgroundColor,
  103. bottomTabsButtonColor: originalStyleObject.tabBarButtonColor,
  104. bottomTabsSelectedButtonColor: originalStyleObject.tabBarSelectedButtonColor,
  105. bottomTabsHidden: originalStyleObject.tabBarHidden,
  106. bottomTabsHiddenOnScroll: originalStyleObject.bottomTabsHiddenOnScroll,
  107. forceTitlesDisplay: originalStyleObject.forceTitlesDisplay,
  108. bottomTabBadgeTextColor: originalStyleObject.bottomTabBadgeTextColor,
  109. bottomTabBadgeBackgroundColor: originalStyleObject.bottomTabBadgeBackgroundColor,
  110. navigationBarColor: originalStyleObject.navigationBarColor
  111. }
  112. }
  113. function convertDrawerParamsToSideMenuParams(drawerParams) {
  114. const drawer = Object.assign({}, drawerParams);
  115. if (!drawer.left || !drawer.left.screen) {
  116. return null;
  117. }
  118. let result = {};
  119. result.disableOpenGesture = drawer.disableOpenGesture !== undefined;
  120. result.screenId = drawer.left.screen;
  121. addNavigatorParams(result);
  122. result = adaptNavigationParams(result);
  123. result.passProps = drawer.passProps;
  124. return result;
  125. }
  126. function adaptNavigationParams(screen) {
  127. screen.navigationParams = {
  128. screenInstanceID: screen.screenInstanceID,
  129. navigatorID: screen.navigatorID,
  130. navigatorEventID: screen.navigatorEventID
  131. };
  132. return screen;
  133. }
  134. function startTabBasedApp(params) {
  135. if (!params.tabs) {
  136. console.error('startTabBasedApp(params): params.tabs is required');
  137. return;
  138. }
  139. const newTabs = [];
  140. params.tabs.forEach(function(tab, idx) {
  141. addNavigatorParams(tab, null, idx);
  142. addNavigatorButtons(tab, params.drawer);
  143. addNavigationStyleParams(tab);
  144. addTabIcon(tab);
  145. tab.passProps = params.passProps;
  146. adaptTopTabs(tab, tab.navigatorID);
  147. tab.screenId = tab.screen;
  148. let newtab = adaptNavigationStyleToScreenStyle(tab);
  149. newtab = adaptNavigationParams(tab);
  150. newtab.overrideBackPress = tab.overrideBackPress;
  151. newTabs.push(newtab);
  152. });
  153. params.tabs = newTabs;
  154. params.appStyle = convertStyleParams(params.appStyle);
  155. params.sideMenu = convertDrawerParamsToSideMenuParams(params.drawer);
  156. params.animateShow = convertAnimationType(params.animationType);
  157. newPlatformSpecific.startApp(params);
  158. }
  159. function addTabIcon(tab) {
  160. if (tab.icon) {
  161. const icon = resolveAssetSource(tab.icon);
  162. if (icon) {
  163. tab.icon = icon.uri;
  164. }
  165. }
  166. if (!tab.icon) {
  167. throw new Error("No icon defined for tab " + tab.screen);
  168. }
  169. }
  170. function convertAnimationType(animationType) {
  171. return animationType !== 'none';
  172. }
  173. function navigatorSetButtons(navigator, navigatorEventID, params) {
  174. if (params.rightButtons) {
  175. params.rightButtons.forEach(function(button) {
  176. button.enabled = !button.disabled;
  177. if (button.icon) {
  178. const icon = resolveAssetSource(button.icon);
  179. if (icon) {
  180. button.icon = icon.uri;
  181. }
  182. }
  183. });
  184. }
  185. if (params.leftButton) {
  186. if (params.leftButton.icon) {
  187. const icon = resolveAssetSource(params.leftButton.icon);
  188. if (icon) {
  189. params.leftButton.icon = icon.uri;
  190. }
  191. }
  192. }
  193. newPlatformSpecific.setScreenTitleBarButtons(navigator.screenInstanceID, navigatorEventID, params.rightButtons, params.leftButton);
  194. }
  195. function navigatorSetTabBadge(navigator, params) {
  196. const badge = params.badge.toString();
  197. if (params.tabIndex >= 0) {
  198. newPlatformSpecific.setBottomTabBadgeByIndex(params.tabIndex, badge);
  199. } else {
  200. newPlatformSpecific.setBottomTabBadgeByNavigatorId(navigator.navigatorID, badge);
  201. }
  202. }
  203. function navigatorSetTitle(navigator, params) {
  204. newPlatformSpecific.setScreenTitleBarTitle(navigator.screenInstanceID, params.title);
  205. }
  206. function navigatorSwitchToTab(navigator, params) {
  207. if (params.tabIndex >= 0) {
  208. newPlatformSpecific.selectBottomTabByTabIndex(params.tabIndex);
  209. } else {
  210. newPlatformSpecific.selectBottomTabByNavigatorId(navigator.navigatorID);
  211. }
  212. }
  213. function navigatorToggleDrawer(navigator, params) {
  214. const animated = !(params.animated === false);
  215. if (params.to) {
  216. const visible = params.to === 'open';
  217. newPlatformSpecific.setSideMenuVisible(animated, visible);
  218. } else {
  219. newPlatformSpecific.toggleSideMenuVisible(animated);
  220. }
  221. }
  222. function navigatorToggleNavBar(navigator, params) {
  223. const screenInstanceID = navigator.screenInstanceID;
  224. const visible = params.to === 'shown';
  225. const animated = !(params.animated === false);
  226. newPlatformSpecific.toggleTopBarVisible(
  227. screenInstanceID,
  228. visible,
  229. animated
  230. );
  231. }
  232. function navigatorToggleTabs(navigator, params) {
  233. const visibility = params.to === 'hidden';
  234. const animated = !(params.animated === false);
  235. newPlatformSpecific.toggleBottomTabsVisible(visibility, animated);
  236. }
  237. function showModal(params) {
  238. addNavigatorParams(params);
  239. addNavigatorButtons(params);
  240. addTitleBarBackButtonIfNeeded(params);
  241. addNavigationStyleParams(params);
  242. /*
  243. * adapt to new API
  244. */
  245. adaptTopTabs(params, params.navigatorID);
  246. params.screenId = params.screen;
  247. let adapted = adaptNavigationStyleToScreenStyle(params);
  248. adapted = adaptNavigationParams(adapted);
  249. adapted.overrideBackPress = params.overrideBackPress;
  250. newPlatformSpecific.showModal(adapted);
  251. }
  252. function dismissModal() {
  253. newPlatformSpecific.dismissTopModal();
  254. }
  255. function dismissAllModals(params) {
  256. newPlatformSpecific.dismissAllModals();
  257. }
  258. function addNavigatorParams(screen, navigator = null, idx = '') {
  259. screen.navigatorID = navigator ? navigator.navigatorID : _.uniqueId('navigatorID') + '_nav' + idx;
  260. screen.screenInstanceID = _.uniqueId('screenInstanceID');
  261. screen.navigatorEventID = screen.screenInstanceID + '_events';
  262. }
  263. function addNavigatorButtons(screen, sideMenuParams) {
  264. const Screen = Navigation.getRegisteredScreen(screen.screen);
  265. Object.assign(screen, Screen.navigatorButtons);
  266. // Get image uri from image id
  267. const rightButtons = getRightButtons(screen);
  268. if (rightButtons) {
  269. rightButtons.forEach(function(button) {
  270. button.enabled = !button.disabled;
  271. if (button.icon) {
  272. const icon = resolveAssetSource(button.icon);
  273. if (icon) {
  274. button.icon = icon.uri;
  275. }
  276. }
  277. });
  278. }
  279. let leftButton = getLeftButton(screen);
  280. if (sideMenuParams && !leftButton) {
  281. leftButton = createSideMenuButton();
  282. }
  283. if (leftButton) {
  284. if (leftButton.icon) {
  285. const icon = resolveAssetSource(leftButton.icon);
  286. if (icon) {
  287. leftButton.icon = icon.uri;
  288. }
  289. }
  290. }
  291. if (rightButtons) {
  292. screen.rightButtons = rightButtons;
  293. }
  294. if (leftButton) {
  295. screen.leftButton = leftButton;
  296. }
  297. }
  298. function createSideMenuButton() {
  299. return {
  300. id: "sideMenu"
  301. };
  302. }
  303. function addTitleBarBackButtonIfNeeded(screen) {
  304. const leftButton = getLeftButton(screen);
  305. if (!leftButton) {
  306. screen.leftButton = {
  307. id: 'back'
  308. }
  309. }
  310. }
  311. function getLeftButton(screen) {
  312. if (screen.navigatorButtons && screen.navigatorButtons.leftButton) {
  313. return screen.navigatorButtons.leftButton;
  314. }
  315. return screen.leftButton;
  316. }
  317. function getRightButtons(screen) {
  318. if (screen.navigatorButtons && screen.navigatorButtons.rightButtons) {
  319. return screen.navigatorButtons.rightButtons;
  320. }
  321. return screen.rightButtons;
  322. }
  323. function addNavigationStyleParams(screen) {
  324. const Screen = Navigation.getRegisteredScreen(screen.screen);
  325. screen.navigatorStyle = Object.assign({}, screen.navigatorStyle, Screen.navigatorStyle);
  326. }
  327. export default {
  328. startTabBasedApp,
  329. startSingleScreenApp,
  330. navigatorPush,
  331. navigatorPop,
  332. navigatorPopToRoot,
  333. navigatorResetTo,
  334. showModal,
  335. dismissModal,
  336. dismissAllModals,
  337. navigatorSetButtons,
  338. navigatorSetTabBadge,
  339. navigatorSetTitle,
  340. navigatorSwitchToTab,
  341. navigatorToggleDrawer,
  342. navigatorToggleTabs,
  343. navigatorToggleNavBar
  344. };