PageAccessoriesModal.jsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import React, { useCallback, useMemo, useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalBody, ModalHeader, TabContent, TabPane,
  5. } from 'reactstrap';
  6. import { withTranslation } from 'react-i18next';
  7. import PageListIcon from './Icons/PageListIcon';
  8. import TimeLineIcon from './Icons/TimeLineIcon';
  9. import HistoryIcon from './Icons/HistoryIcon';
  10. import AttachmentIcon from './Icons/AttachmentIcon';
  11. import ShareLinkIcon from './Icons/ShareLinkIcon';
  12. import { withUnstatedContainers } from './UnstatedUtils';
  13. import PageAccessoriesContainer from '../services/PageAccessoriesContainer';
  14. import PageAttachment from './PageAttachment';
  15. import PageTimeline from './PageTimeline';
  16. import PageList from './PageList';
  17. import PageHistory from './PageHistory';
  18. import ShareLink from './ShareLink/ShareLink';
  19. import { CustomNav } from './CustomNavigation';
  20. import ExpandOrContractButton from './ExpandOrContractButton';
  21. const PageAccessoriesModal = (props) => {
  22. const {
  23. t, pageAccessoriesContainer, onClose, isGuestUserMode,
  24. } = props;
  25. const { switchActiveTab } = pageAccessoriesContainer;
  26. const { activeTab, activeComponents } = pageAccessoriesContainer.state;
  27. const [isWindowExpanded, setIsWindowExpanded] = useState(false);
  28. const navTabMapping = useMemo(() => {
  29. return {
  30. pagelist: {
  31. Icon: PageListIcon,
  32. i18n: t('page_list'),
  33. index: 0,
  34. },
  35. timeline: {
  36. Icon: TimeLineIcon,
  37. i18n: t('Timeline View'),
  38. index: 1,
  39. },
  40. pageHistory: {
  41. Icon: HistoryIcon,
  42. i18n: t('History'),
  43. index: 2,
  44. },
  45. attachment: {
  46. Icon: AttachmentIcon,
  47. i18n: t('attachment_data'),
  48. index: 3,
  49. },
  50. shareLink: {
  51. Icon: ShareLinkIcon,
  52. i18n: t('share_links.share_link_management'),
  53. index: 4,
  54. isLinkEnabled: v => !isGuestUserMode,
  55. },
  56. };
  57. }, [t, isGuestUserMode]);
  58. const closeModalHandler = useCallback(() => {
  59. if (onClose == null) {
  60. return;
  61. }
  62. onClose();
  63. }, [onClose]);
  64. const expandWindow = () => {
  65. setIsWindowExpanded(true);
  66. };
  67. const contractWindow = () => {
  68. setIsWindowExpanded(false);
  69. };
  70. const buttons = (
  71. <span>
  72. {/* change order because of `float: right` by '.close' class */}
  73. <button type="button" className="close" onClick={closeModalHandler} aria-label="Close">
  74. <span aria-hidden="true">&times;</span>
  75. </button>
  76. <ExpandOrContractButton
  77. isWindowExpanded={isWindowExpanded}
  78. expandWindow={expandWindow}
  79. contractWindow={contractWindow}
  80. />
  81. </span>
  82. );
  83. return (
  84. <React.Fragment>
  85. <Modal size="xl" isOpen={props.isOpen} toggle={closeModalHandler} className={`grw-page-accessories-modal ${isWindowExpanded && 'grw-modal-expanded'} `}>
  86. <ModalHeader className="p-0" toggle={closeModalHandler} close={buttons}>
  87. <CustomNav activeTab={activeTab} navTabMapping={navTabMapping} onNavSelected={switchActiveTab} />
  88. </ModalHeader>
  89. <ModalBody className="overflow-auto grw-modal-body-style p-0">
  90. {/* Do not use CustomTabContent because of performance problem:
  91. the 'navTabMapping[tabId].Content' for PageAccessoriesModal depends on activeComponents */}
  92. <TabContent activeTab={activeTab} className="p-5">
  93. <TabPane tabId="pagelist">
  94. {activeComponents.has('pagelist') && <PageList />}
  95. </TabPane>
  96. <TabPane tabId="timeline">
  97. {activeComponents.has('timeline') && <PageTimeline /> }
  98. </TabPane>
  99. <TabPane tabId="pageHistory">
  100. <div className="overflow-auto">
  101. {activeComponents.has('pageHistory') && <PageHistory /> }
  102. </div>
  103. </TabPane>
  104. <TabPane tabId="attachment">
  105. {activeComponents.has('attachment') && <PageAttachment />}
  106. </TabPane>
  107. {!isGuestUserMode && (
  108. <TabPane tabId="shareLink">
  109. {activeComponents.has('shareLink') && <ShareLink />}
  110. </TabPane>
  111. )}
  112. </TabContent>
  113. </ModalBody>
  114. </Modal>
  115. </React.Fragment>
  116. );
  117. };
  118. /**
  119. * Wrapper component for using unstated
  120. */
  121. const PageAccessoriesModalWrapper = withUnstatedContainers(PageAccessoriesModal, [PageAccessoriesContainer]);
  122. PageAccessoriesModal.propTypes = {
  123. t: PropTypes.func.isRequired, // i18next
  124. pageAccessoriesContainer: PropTypes.instanceOf(PageAccessoriesContainer).isRequired,
  125. isGuestUserMode: PropTypes.bool.isRequired,
  126. isOpen: PropTypes.bool.isRequired,
  127. onClose: PropTypes.func,
  128. };
  129. export default withTranslation()(PageAccessoriesModalWrapper);