react-native-navigation的迁移库

platformSpecificDeprecated.android.js 10KB

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