OutsideShareLinkModal.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalHeader, ModalBody,
  5. } from 'reactstrap';
  6. import { withTranslation } from 'react-i18next';
  7. import { withUnstatedContainers } from './UnstatedUtils';
  8. import AppContainer from '../services/AppContainer';
  9. import PageContainer from '../services/PageContainer';
  10. import ShareLinkList from './ShareLinkList';
  11. import ShareLinkForm from './ShareLinkForm';
  12. import { toastSuccess, toastError } from '../util/apiNotification';
  13. class OutsideShareLinkModal extends React.Component {
  14. constructor() {
  15. super();
  16. this.state = {
  17. shareLinks: [],
  18. isOpenShareLinkForm: false,
  19. };
  20. this.toggleShareLinkFormHandler = this.toggleShareLinkFormHandler.bind(this);
  21. this.deleteAllLinksButtonHandler = this.deleteAllLinksButtonHandler.bind(this);
  22. this.deleteLinkById = this.deleteLinkById.bind(this);
  23. }
  24. componentDidMount() {
  25. this.retrieveShareLinks();
  26. }
  27. async retrieveShareLinks() {
  28. const { appContainer, pageContainer } = this.props;
  29. const { pageId } = pageContainer.state;
  30. try {
  31. const res = await appContainer.apiv3.get('/share-links/', { relatedPage: pageId });
  32. const { shareLinksResult } = res.data;
  33. this.setState({ shareLinks: shareLinksResult });
  34. }
  35. catch (err) {
  36. toastError(err);
  37. }
  38. }
  39. toggleShareLinkFormHandler() {
  40. this.setState({ isOpenShareLinkForm: !this.state.isOpenShareLinkForm });
  41. this.retrieveShareLinks();
  42. }
  43. async deleteAllLinksButtonHandler() {
  44. const { t, appContainer, pageContainer } = this.props;
  45. const { pageId } = pageContainer.state;
  46. try {
  47. const res = await appContainer.apiv3.delete('/share-links/', { relatedPage: pageId });
  48. const count = res.data.n;
  49. toastSuccess(t('toaster.remove_share_link', { count }));
  50. }
  51. catch (err) {
  52. toastError(err);
  53. }
  54. this.retrieveShareLinks();
  55. }
  56. async deleteLinkById(shareLinkId) {
  57. const { t, appContainer } = this.props;
  58. try {
  59. const res = await appContainer.apiv3Delete(`/share-links/${shareLinkId}`);
  60. const { deletedShareLink } = res.data;
  61. toastSuccess(t('toaster.remove_share_link_success', { shareLinkId: deletedShareLink._id }));
  62. }
  63. catch (err) {
  64. toastError(err);
  65. }
  66. this.retrieveShareLinks();
  67. }
  68. render() {
  69. const { t } = this.props;
  70. return (
  71. <Modal size="xl" isOpen={this.props.isOpen} toggle={this.props.onClose}>
  72. <ModalHeader tag="h4" toggle={this.props.onClose} className="bg-primary text-light">{t('share_links.Shere this page link to public')}
  73. </ModalHeader>
  74. <ModalBody>
  75. <div className="container">
  76. <h3 className="grw-modal-head d-flex pb-2">
  77. { t('share_links.share_link_list') }
  78. <button className="btn btn-danger ml-auto " type="button" onClick={this.deleteAllLinksButtonHandler}>{t('delete_all')}</button>
  79. </h3>
  80. <div>
  81. <ShareLinkList
  82. shareLinks={this.state.shareLinks}
  83. onClickDeleteButton={this.deleteLinkById}
  84. />
  85. <button
  86. className="btn btn-outline-secondary d-block mx-auto px-5 mb-3"
  87. type="button"
  88. onClick={this.toggleShareLinkFormHandler}
  89. >
  90. {this.state.isOpenShareLinkForm ? t('Close') : t('New')}
  91. </button>
  92. {this.state.isOpenShareLinkForm && <ShareLinkForm onCloseForm={this.toggleShareLinkFormHandler} />}
  93. </div>
  94. </div>
  95. </ModalBody>
  96. </Modal>
  97. );
  98. }
  99. }
  100. /**
  101. * Wrapper component for using unstated
  102. */
  103. const ModalControlWrapper = withUnstatedContainers(OutsideShareLinkModal, [AppContainer, PageContainer]);
  104. OutsideShareLinkModal.propTypes = {
  105. t: PropTypes.func.isRequired, // i18next
  106. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  107. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  108. isOpen: PropTypes.bool.isRequired,
  109. onClose: PropTypes.func.isRequired,
  110. };
  111. export default withTranslation()(ModalControlWrapper);