react-native-navigation的迁移库

platformSpecific.ios.js 15KB

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