react-native-navigation的迁移库

platformSpecificDeprecated.ios.js 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. /*eslint-disable*/
  2. import Navigation from './../Navigation';
  3. import Controllers, {Modal, Notification} from './controllers';
  4. const React = Controllers.hijackReact();
  5. const {
  6. ControllerRegistry,
  7. TabBarControllerIOS,
  8. NavigationControllerIOS,
  9. DrawerControllerIOS
  10. } = React;
  11. import _ from 'lodash';
  12. import PropRegistry from '../PropRegistry';
  13. function startTabBasedApp(params) {
  14. if (!params.tabs) {
  15. console.error('startTabBasedApp(params): params.tabs is required');
  16. return;
  17. }
  18. const controllerID = _.uniqueId('controllerID');
  19. params.tabs.map(function(tab, index) {
  20. const navigatorID = controllerID + '_nav' + index;
  21. const screenInstanceID = _.uniqueId('screenInstanceID');
  22. if (!tab.screen) {
  23. console.error('startTabBasedApp(params): every tab must include a screen property, take a look at tab#' + (index + 1));
  24. return;
  25. }
  26. const {
  27. navigatorStyle,
  28. navigatorButtons,
  29. navigatorEventID
  30. } = _mergeScreenSpecificSettings(tab.screen, screenInstanceID, tab);
  31. tab.navigationParams = {
  32. screenInstanceID,
  33. navigatorStyle,
  34. navigatorButtons,
  35. navigatorEventID,
  36. navigatorID
  37. };
  38. });
  39. const Controller = Controllers.createClass({
  40. render: function() {
  41. if (!params.drawer || (!params.drawer.left && !params.drawer.right)) {
  42. return this.renderBody();
  43. } else {
  44. const navigatorID = controllerID + '_drawer';
  45. return (
  46. <DrawerControllerIOS id={navigatorID}
  47. componentLeft={params.drawer.left ? params.drawer.left.screen : undefined}
  48. passPropsLeft={{navigatorID: navigatorID}}
  49. componentRight={params.drawer.right ? params.drawer.right.screen : undefined}
  50. passPropsRight={{navigatorID: navigatorID}}
  51. disableOpenGesture={params.drawer.disableOpenGesture}
  52. type={params.drawer.type ? params.drawer.type : 'MMDrawer'}
  53. animationType={params.drawer.animationType ? params.drawer.animationType : 'slide'}
  54. style={params.drawer.style}
  55. >
  56. {this.renderBody()}
  57. </DrawerControllerIOS>
  58. );
  59. }
  60. },
  61. renderBody: function() {
  62. return (
  63. <TabBarControllerIOS
  64. id={controllerID + '_tabs'}
  65. style={params.tabsStyle}>
  66. {
  67. params.tabs.map(function(tab, index) {
  68. return (
  69. <TabBarControllerIOS.Item {...tab} title={tab.label}>
  70. <NavigationControllerIOS
  71. id={tab.navigationParams.navigatorID}
  72. title={tab.title}
  73. titleImage={tab.titleImage}
  74. component={tab.screen}
  75. passProps={{
  76. navigatorID: tab.navigationParams.navigatorID,
  77. screenInstanceID: tab.navigationParams.screenInstanceID,
  78. navigatorEventID: tab.navigationParams.navigatorEventID
  79. }}
  80. style={tab.navigationParams.navigatorStyle}
  81. leftButtons={tab.navigationParams.navigatorButtons.leftButtons}
  82. rightButtons={tab.navigationParams.navigatorButtons.rightButtons}
  83. />
  84. </TabBarControllerIOS.Item>
  85. );
  86. })
  87. }
  88. </TabBarControllerIOS>
  89. );
  90. }
  91. });
  92. savePassProps(params);
  93. ControllerRegistry.registerController(controllerID, () => Controller);
  94. ControllerRegistry.setRootController(controllerID, params.animationType, params.passProps || {});
  95. }
  96. function startSingleScreenApp(params) {
  97. if (!params.screen) {
  98. console.error('startSingleScreenApp(params): params.screen is required');
  99. return;
  100. }
  101. const controllerID = _.uniqueId('controllerID');
  102. const screen = params.screen;
  103. if (!screen.screen) {
  104. console.error('startSingleScreenApp(params): screen must include a screen property');
  105. return;
  106. }
  107. const navigatorID = controllerID + '_nav';
  108. const screenInstanceID = _.uniqueId('screenInstanceID');
  109. const {
  110. navigatorStyle,
  111. navigatorButtons,
  112. navigatorEventID
  113. } = _mergeScreenSpecificSettings(screen.screen, screenInstanceID, screen);
  114. params.navigationParams = {
  115. screenInstanceID,
  116. navigatorStyle,
  117. navigatorButtons,
  118. navigatorEventID,
  119. navigatorID
  120. };
  121. const Controller = Controllers.createClass({
  122. render: function() {
  123. if (!params.drawer || (!params.drawer.left && !params.drawer.right)) {
  124. return this.renderBody();
  125. } else {
  126. const navigatorID = controllerID + '_drawer';
  127. return (
  128. <DrawerControllerIOS id={navigatorID}
  129. componentLeft={params.drawer.left ? params.drawer.left.screen : undefined}
  130. passPropsLeft={{navigatorID: navigatorID}}
  131. componentRight={params.drawer.right ? params.drawer.right.screen : undefined}
  132. passPropsRight={{navigatorID: navigatorID}}
  133. disableOpenGesture={params.drawer.disableOpenGesture}
  134. type={params.drawer.type ? params.drawer.type : 'MMDrawer'}
  135. animationType={params.drawer.animationType ? params.drawer.animationType : 'slide'}
  136. style={params.drawer.style}
  137. >
  138. {this.renderBody()}
  139. </DrawerControllerIOS>
  140. );
  141. }
  142. },
  143. renderBody: function() {
  144. return (
  145. <NavigationControllerIOS
  146. id={navigatorID}
  147. title={screen.title}
  148. subtitle={params.subtitle}
  149. titleImage={screen.titleImage}
  150. component={screen.screen}
  151. passProps={{
  152. navigatorID: navigatorID,
  153. screenInstanceID: screenInstanceID,
  154. navigatorEventID: navigatorEventID
  155. }}
  156. style={navigatorStyle}
  157. leftButtons={navigatorButtons.leftButtons}
  158. rightButtons={navigatorButtons.rightButtons}
  159. />
  160. );
  161. }
  162. });
  163. savePassProps(params);
  164. ControllerRegistry.registerController(controllerID, () => Controller);
  165. ControllerRegistry.setRootController(controllerID, params.animationType, params.passProps || {});
  166. }
  167. function _mergeScreenSpecificSettings(screenID, screenInstanceID, params) {
  168. const screenClass = Navigation.getRegisteredScreen(screenID);
  169. if (!screenClass) {
  170. console.error('Cannot create screen ' + screenID + '. Are you it was registered with Navigation.registerScreen?');
  171. return;
  172. }
  173. const navigatorStyle = Object.assign({}, screenClass.navigatorStyle);
  174. if (params.navigatorStyle) {
  175. Object.assign(navigatorStyle, params.navigatorStyle);
  176. }
  177. let navigatorEventID = screenInstanceID + '_events';
  178. let navigatorButtons = _.cloneDeep(screenClass.navigatorButtons);
  179. if (params.navigatorButtons) {
  180. navigatorButtons = _.cloneDeep(params.navigatorButtons);
  181. }
  182. if (navigatorButtons.leftButtons) {
  183. for (let i = 0; i < navigatorButtons.leftButtons.length; i++) {
  184. navigatorButtons.leftButtons[i].onPress = navigatorEventID;
  185. }
  186. }
  187. if (navigatorButtons.rightButtons) {
  188. for (let i = 0; i < navigatorButtons.rightButtons.length; i++) {
  189. navigatorButtons.rightButtons[i].onPress = navigatorEventID;
  190. }
  191. }
  192. return {navigatorStyle, navigatorButtons, navigatorEventID};
  193. }
  194. function navigatorPush(navigator, params) {
  195. if (!params.screen) {
  196. console.error('Navigator.push(params): params.screen is required');
  197. return;
  198. }
  199. const screenInstanceID = _.uniqueId('screenInstanceID');
  200. const {
  201. navigatorStyle,
  202. navigatorButtons,
  203. navigatorEventID
  204. } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
  205. const passProps = Object.assign({}, params.passProps);
  206. passProps.navigatorID = navigator.navigatorID;
  207. passProps.screenInstanceID = screenInstanceID;
  208. passProps.navigatorEventID = navigatorEventID;
  209. params.navigationParams = {
  210. screenInstanceID,
  211. navigatorStyle,
  212. navigatorButtons,
  213. navigatorEventID,
  214. navigatorID: navigator.navigatorID
  215. };
  216. savePassProps(params);
  217. Controllers.NavigationControllerIOS(navigator.navigatorID).push({
  218. title: params.title,
  219. subtitle: params.subtitle,
  220. titleImage: params.titleImage,
  221. component: params.screen,
  222. animated: params.animated,
  223. passProps: passProps,
  224. style: navigatorStyle,
  225. backButtonTitle: params.backButtonTitle,
  226. backButtonHidden: params.backButtonHidden,
  227. leftButtons: navigatorButtons.leftButtons,
  228. rightButtons: navigatorButtons.rightButtons
  229. });
  230. }
  231. function navigatorPop(navigator, params) {
  232. Controllers.NavigationControllerIOS(navigator.navigatorID).pop({
  233. animated: params.animated
  234. });
  235. }
  236. function navigatorPopToRoot(navigator, params) {
  237. Controllers.NavigationControllerIOS(navigator.navigatorID).popToRoot({
  238. animated: params.animated
  239. });
  240. }
  241. function navigatorResetTo(navigator, params) {
  242. if (!params.screen) {
  243. console.error('Navigator.resetTo(params): params.screen is required');
  244. return;
  245. }
  246. const screenInstanceID = _.uniqueId('screenInstanceID');
  247. const {
  248. navigatorStyle,
  249. navigatorButtons,
  250. navigatorEventID
  251. } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
  252. const passProps = Object.assign({}, params.passProps);
  253. passProps.navigatorID = navigator.navigatorID;
  254. passProps.screenInstanceID = screenInstanceID;
  255. passProps.navigatorEventID = navigatorEventID;
  256. params.navigationParams = {
  257. screenInstanceID,
  258. navigatorStyle,
  259. navigatorButtons,
  260. navigatorEventID,
  261. navigatorID: navigator.navigatorID
  262. };
  263. savePassProps(params);
  264. Controllers.NavigationControllerIOS(navigator.navigatorID).resetTo({
  265. title: params.title,
  266. subtitle: params.subtitle,
  267. titleImage: params.titleImage,
  268. component: params.screen,
  269. animated: params.animated,
  270. passProps: passProps,
  271. style: navigatorStyle,
  272. leftButtons: navigatorButtons.leftButtons,
  273. rightButtons: navigatorButtons.rightButtons
  274. });
  275. }
  276. function navigatorSetTitle(navigator, params) {
  277. Controllers.NavigationControllerIOS(navigator.navigatorID).setTitle({
  278. title: params.title,
  279. subtitle: params.subtitle,
  280. titleImage: params.titleImage,
  281. style: params.navigatorStyle
  282. });
  283. }
  284. function navigatorSetTitleImage(navigator, params) {
  285. Controllers.NavigationControllerIOS(navigator.navigatorID).setTitleImage({
  286. titleImage: params.titleImage
  287. });
  288. }
  289. function navigatorToggleNavBar(navigator, params) {
  290. Controllers.NavigationControllerIOS(navigator.navigatorID).setHidden({
  291. hidden: ((params.to === 'hidden') ? true : false),
  292. animated: params.animated
  293. });
  294. }
  295. function navigatorToggleDrawer(navigator, params) {
  296. const controllerID = navigator.navigatorID.split('_')[0];
  297. if (params.to == 'open') {
  298. Controllers.DrawerControllerIOS(controllerID + '_drawer').open({
  299. side: params.side,
  300. animated: params.animated
  301. });
  302. } else if (params.to == 'closed') {
  303. Controllers.DrawerControllerIOS(controllerID + '_drawer').close({
  304. side: params.side,
  305. animated: params.animated
  306. });
  307. } else {
  308. Controllers.DrawerControllerIOS(controllerID + '_drawer').toggle({
  309. side: params.side,
  310. animated: params.animated
  311. });
  312. }
  313. }
  314. function navigatorToggleTabs(navigator, params) {
  315. const controllerID = navigator.navigatorID.split('_')[0];
  316. Controllers.TabBarControllerIOS(controllerID + '_tabs').setHidden({
  317. hidden: params.to == 'hidden',
  318. animated: !(params.animated === false)
  319. });
  320. }
  321. function navigatorSetTabBadge(navigator, params) {
  322. const controllerID = navigator.navigatorID.split('_')[0];
  323. if (params.tabIndex || params.tabIndex === 0) {
  324. Controllers.TabBarControllerIOS(controllerID + '_tabs').setBadge({
  325. tabIndex: params.tabIndex,
  326. badge: params.badge
  327. });
  328. } else {
  329. Controllers.TabBarControllerIOS(controllerID + '_tabs').setBadge({
  330. contentId: navigator.navigatorID,
  331. contentType: 'NavigationControllerIOS',
  332. badge: params.badge
  333. });
  334. }
  335. }
  336. function navigatorSwitchToTab(navigator, params) {
  337. const controllerID = navigator.navigatorID.split('_')[0];
  338. if (params.tabIndex || params.tabIndex === 0) {
  339. Controllers.TabBarControllerIOS(controllerID + '_tabs').switchTo({
  340. tabIndex: params.tabIndex
  341. });
  342. } else {
  343. Controllers.TabBarControllerIOS(controllerID + '_tabs').switchTo({
  344. contentId: navigator.navigatorID,
  345. contentType: 'NavigationControllerIOS'
  346. });
  347. }
  348. }
  349. function navigatorSetButtons(navigator, navigatorEventID, params) {
  350. if (params.leftButtons) {
  351. const buttons = params.leftButtons.slice(); // clone
  352. for (let i = 0; i < buttons.length; i++) {
  353. buttons[i].onPress = navigatorEventID;
  354. }
  355. Controllers.NavigationControllerIOS(navigator.navigatorID).setLeftButtons(buttons, params.animated);
  356. }
  357. if (params.rightButtons) {
  358. const buttons = params.rightButtons.slice(); // clone
  359. for (let i = 0; i < buttons.length; i++) {
  360. buttons[i].onPress = navigatorEventID;
  361. }
  362. Controllers.NavigationControllerIOS(navigator.navigatorID).setRightButtons(buttons, params.animated);
  363. }
  364. }
  365. function showModal(params) {
  366. if (!params.screen) {
  367. console.error('showModal(params): params.screen is required');
  368. return;
  369. }
  370. const controllerID = _.uniqueId('controllerID');
  371. const navigatorID = controllerID + '_nav';
  372. const screenInstanceID = _.uniqueId('screenInstanceID');
  373. const {
  374. navigatorStyle,
  375. navigatorButtons,
  376. navigatorEventID
  377. } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
  378. const passProps = Object.assign({}, params.passProps);
  379. passProps.navigatorID = navigatorID;
  380. passProps.screenInstanceID = screenInstanceID;
  381. passProps.navigatorEventID = navigatorEventID;
  382. params.navigationParams = {
  383. screenInstanceID,
  384. navigatorStyle,
  385. navigatorButtons,
  386. navigatorEventID,
  387. navigatorID: navigator.navigatorID
  388. };
  389. const Controller = Controllers.createClass({
  390. render: function() {
  391. return (
  392. <NavigationControllerIOS
  393. id={navigatorID}
  394. title={params.title}
  395. subtitle={params.subtitle}
  396. titleImage={params.titleImage}
  397. component={params.screen}
  398. passProps={passProps}
  399. style={navigatorStyle}
  400. leftButtons={navigatorButtons.leftButtons}
  401. rightButtons={navigatorButtons.rightButtons}/>
  402. );
  403. }
  404. });
  405. savePassProps(params);
  406. ControllerRegistry.registerController(controllerID, () => Controller);
  407. Modal.showController(controllerID, params.animationType);
  408. }
  409. function dismissModal(params) {
  410. Modal.dismissController(params.animationType);
  411. }
  412. function dismissAllModals(params) {
  413. Modal.dismissAllControllers(params.animationType);
  414. }
  415. function showLightBox(params) {
  416. if (!params.screen) {
  417. console.error('showLightBox(params): params.screen is required');
  418. return;
  419. }
  420. const controllerID = _.uniqueId('controllerID');
  421. const navigatorID = controllerID + '_nav';
  422. const screenInstanceID = _.uniqueId('screenInstanceID');
  423. const {
  424. navigatorStyle,
  425. navigatorButtons,
  426. navigatorEventID
  427. } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
  428. const passProps = Object.assign({}, params.passProps);
  429. passProps.navigatorID = navigatorID;
  430. passProps.screenInstanceID = screenInstanceID;
  431. passProps.navigatorEventID = navigatorEventID;
  432. params.navigationParams = {
  433. screenInstanceID,
  434. navigatorStyle,
  435. navigatorButtons,
  436. navigatorEventID,
  437. navigatorID
  438. };
  439. savePassProps(params);
  440. Modal.showLightBox({
  441. component: params.screen,
  442. passProps: passProps,
  443. style: params.style
  444. });
  445. }
  446. function dismissLightBox(params) {
  447. Modal.dismissLightBox();
  448. }
  449. function showInAppNotification(params) {
  450. if (!params.screen) {
  451. console.error('showInAppNotification(params): params.screen is required');
  452. return;
  453. }
  454. const controllerID = _.uniqueId('controllerID');
  455. const navigatorID = controllerID + '_nav';
  456. const screenInstanceID = _.uniqueId('screenInstanceID');
  457. const {
  458. navigatorStyle,
  459. navigatorButtons,
  460. navigatorEventID
  461. } = _mergeScreenSpecificSettings(params.screen, screenInstanceID, params);
  462. const passProps = Object.assign({}, params.passProps);
  463. passProps.navigatorID = navigatorID;
  464. passProps.screenInstanceID = screenInstanceID;
  465. passProps.navigatorEventID = navigatorEventID;
  466. params.navigationParams = {
  467. screenInstanceID,
  468. navigatorStyle,
  469. navigatorButtons,
  470. navigatorEventID,
  471. navigatorID
  472. };
  473. Notification.show({
  474. component: params.screen,
  475. passProps: passProps,
  476. style: params.style,
  477. animation: params.animation || Notification.AnimationPresets.default,
  478. position: params.position,
  479. shadowRadius: params.shadowRadius,
  480. dismissWithSwipe: params.dismissWithSwipe || true,
  481. autoDismissTimerSec: params.autoDismissTimerSec || 5
  482. });
  483. }
  484. function dismissInAppNotification(params) {
  485. Notification.dismiss(params);
  486. }
  487. function savePassProps(params) {
  488. //TODO this needs to be handled in a common place,
  489. //TODO also, all global passProps should be handled differently
  490. if (params.navigationParams && params.passProps) {
  491. PropRegistry.save(params.navigationParams.screenInstanceID, params.passProps);
  492. }
  493. if (params.screen && params.screen.passProps) {
  494. PropRegistry.save(params.screen.navigationParams.screenInstanceID, params.screen.passProps);
  495. }
  496. if (_.get(params, 'screen.topTabs')) {
  497. _.forEach(params.screen.topTabs, (tab) => savePassProps(tab));
  498. }
  499. if (params.tabs) {
  500. _.forEach(params.tabs, (tab) => {
  501. if (!tab.passProps) {
  502. tab.passProps = params.passProps;
  503. }
  504. savePassProps(tab);
  505. });
  506. }
  507. }
  508. function showContextualMenu() {
  509. // Android only
  510. }
  511. function dismissContextualMenu() {
  512. // Android only
  513. }
  514. export default {
  515. startTabBasedApp,
  516. startSingleScreenApp,
  517. navigatorPush,
  518. navigatorPop,
  519. navigatorPopToRoot,
  520. navigatorResetTo,
  521. showModal,
  522. dismissModal,
  523. dismissAllModals,
  524. showLightBox,
  525. dismissLightBox,
  526. showInAppNotification,
  527. dismissInAppNotification,
  528. navigatorSetButtons,
  529. navigatorSetTitle,
  530. navigatorSetTitleImage,
  531. navigatorToggleDrawer,
  532. navigatorToggleTabs,
  533. navigatorSetTabBadge,
  534. navigatorSwitchToTab,
  535. navigatorToggleNavBar,
  536. showContextualMenu,
  537. dismissContextualMenu
  538. };