react-native-navigation的迁移库

platformSpecificDeprecated.android.js 11KB

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