ShareLink.jsx 3.5 KB

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