react-native-navigation的迁移库

platformSpecificDeprecated.android.js 9.8KB

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