react-native-navigation的迁移库

platformSpecificDeprecated.ios.js 18KB

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