PageShareManagement.jsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { UncontrolledTooltip } from 'reactstrap';
  4. import { withTranslation } from 'react-i18next';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import AppContainer from '../../services/AppContainer';
  7. import PageContainer from '../../services/PageContainer';
  8. import OutsideShareLinkModal from '../OutsideShareLinkModal';
  9. import { toastError } from '../../util/apiNotification';
  10. import ArchiveCreateModal from '../ArchiveCreateModal';
  11. const PageShareManagement = (props) => {
  12. const { t, appContainer, pageContainer } = props;
  13. const { path } = pageContainer.state;
  14. const { currentUser } = appContainer;
  15. const [isOutsideShareLinkModalShown, setIsOutsideShareLinkModalShown] = useState(false);
  16. const [isArchiveCreateModalShown, setIsArchiveCreateModalShown] = useState(false);
  17. function openOutsideShareLinkModalHandler() {
  18. setIsOutsideShareLinkModalShown(true);
  19. }
  20. function closeOutsideShareLinkModalHandler() {
  21. setIsOutsideShareLinkModalShown(false);
  22. }
  23. async function getExportPageFile(type) {
  24. const pageId = pageContainer.state.pageId;
  25. try {
  26. const res = await appContainer.apiv3Get('/pages/export', { pageId, type });
  27. return res;
  28. }
  29. catch (err) {
  30. toastError(Error(t('export_bulk.failed_to_export')));
  31. }
  32. }
  33. function exportPage(exportPageFile) {
  34. // TODO implement
  35. }
  36. function exportPageHundler(type) {
  37. const exportPageFile = getExportPageFile(type);
  38. exportPage(exportPageFile);
  39. }
  40. function openArchiveModalHandler() {
  41. setIsArchiveCreateModalShown(true);
  42. }
  43. function closeArchiveCreateModalHandler() {
  44. setIsArchiveCreateModalShown(false);
  45. }
  46. function renderModals() {
  47. return (
  48. <>
  49. <OutsideShareLinkModal
  50. isOpen={isOutsideShareLinkModalShown}
  51. onClose={closeOutsideShareLinkModalHandler}
  52. />
  53. <ArchiveCreateModal
  54. isOpen={isArchiveCreateModalShown}
  55. onClose={closeArchiveCreateModalHandler}
  56. path={path}
  57. />
  58. </>
  59. );
  60. }
  61. function renderCurrentUser() {
  62. return (
  63. <>
  64. <button
  65. type="button"
  66. className="btn-link nav-link bg-transparent dropdown-toggle dropdown-toggle-no-caret"
  67. data-toggle="dropdown"
  68. >
  69. <i className="icon-share"></i>
  70. </button>
  71. </>
  72. );
  73. }
  74. function renderGuestUser() {
  75. return (
  76. <>
  77. <button
  78. type="button"
  79. className="btn nav-link bg-transparent dropdown-toggle dropdown-toggle-no-caret disabled"
  80. id="auth-guest-tltips"
  81. >
  82. <i className="icon-share"></i>
  83. </button>
  84. <UncontrolledTooltip placement="top" target="auth-guest-tltips">
  85. {t('Not available for guest')}
  86. </UncontrolledTooltip>
  87. </>
  88. );
  89. }
  90. return (
  91. <>
  92. {currentUser == null ? renderGuestUser() : renderCurrentUser()}
  93. <div className="dropdown-menu dropdown-menu-right">
  94. <button className="dropdown-item" type="button" onClick={openOutsideShareLinkModalHandler}>
  95. <i className="icon-fw icon-link"></i>
  96. {t('Shere this page link to public')}
  97. <span className="ml-2 badge badge-info badge-pill">{pageContainer.state.shareLinksNumber}</span>
  98. </button>
  99. <button
  100. type="button"
  101. className="dropdown-item"
  102. onClick={() => {
  103. exportPageHundler('markdown');
  104. }}
  105. >
  106. <span>{t('export_bulk.export_page_markdown')}</span>
  107. </button>
  108. <button
  109. type="button"
  110. className="dropdown-item"
  111. onClick={() => {
  112. exportPageHundler('pdf');
  113. }}
  114. >
  115. <span>{t('export_bulk.export_page_pdf')}</span>
  116. </button>
  117. <button className="dropdown-item" type="button" onClick={openArchiveModalHandler}>
  118. <i className="icon-fw"></i>{t('Create Archive Page')}
  119. </button>
  120. </div>
  121. {renderModals()}
  122. </>
  123. );
  124. };
  125. /**
  126. * Wrapper component for using unstated
  127. */
  128. const PageShareManagementWrapper = withUnstatedContainers(PageShareManagement, [AppContainer, PageContainer]);
  129. PageShareManagement.propTypes = {
  130. t: PropTypes.func.isRequired, // i18next
  131. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  132. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  133. };
  134. export default withTranslation()(PageShareManagementWrapper);