ShareLink.tsx 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import React, {
  2. useState, useCallback,
  3. } from 'react';
  4. import { useTranslation } from 'react-i18next';
  5. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  6. import { apiv3Delete } from '~/client/util/apiv3-client';
  7. import { useCurrentPageId } from '~/stores/page';
  8. import { useSWRxSharelink } from '~/stores/share-link';
  9. import { ShareLinkForm } from './ShareLinkForm';
  10. import ShareLinkList from './ShareLinkList';
  11. const ShareLink = (): JSX.Element => {
  12. const { t } = useTranslation();
  13. const [isOpenShareLinkForm, setIsOpenShareLinkForm] = useState<boolean>(false);
  14. const { data: currentPageId } = useCurrentPageId();
  15. const { data: currentShareLinks, mutate } = useSWRxSharelink(currentPageId);
  16. const toggleShareLinkFormHandler = useCallback(() => {
  17. setIsOpenShareLinkForm(prev => !prev);
  18. mutate();
  19. }, [mutate]);
  20. const deleteAllLinksButtonHandler = useCallback(async() => {
  21. try {
  22. const res = await apiv3Delete('/share-links/', { relatedPage: currentPageId });
  23. const count = res.data.n;
  24. toastSuccess(t('toaster.remove_share_link', { count, ns: 'commons' }));
  25. mutate();
  26. }
  27. catch (err) {
  28. toastError(err);
  29. }
  30. }, [mutate, currentPageId, t]);
  31. const deleteLinkById = useCallback(async(shareLinkId) => {
  32. try {
  33. const res = await apiv3Delete(`/share-links/${shareLinkId}`);
  34. const { deletedShareLink } = res.data;
  35. toastSuccess(t('toaster.remove_share_link_success', { shareLinkId: deletedShareLink._id, ns: 'commons' }));
  36. mutate();
  37. }
  38. catch (err) {
  39. toastError(err);
  40. }
  41. }, [mutate, t]);
  42. return (
  43. <div className="container p-0" data-testid="share-link-management">
  44. <h3 className="grw-modal-head d-flex pb-2">
  45. { t('share_links.share_link_list') }
  46. <button className="btn btn-danger ml-auto " type="button" onClick={deleteAllLinksButtonHandler}>{t('delete_all')}</button>
  47. </h3>
  48. <div>
  49. <ShareLinkList
  50. shareLinks={currentShareLinks == null ? [] : currentShareLinks}
  51. onClickDeleteButton={deleteLinkById}
  52. />
  53. <button
  54. className="btn btn-outline-secondary d-block mx-auto px-5"
  55. type="button"
  56. onClick={toggleShareLinkFormHandler}
  57. data-testid="btn-sharelink-toggleform"
  58. >
  59. {isOpenShareLinkForm ? t('Close') : t('New')}
  60. </button>
  61. {isOpenShareLinkForm && <ShareLinkForm onCloseForm={toggleShareLinkFormHandler} />}
  62. </div>
  63. </div>
  64. );
  65. };
  66. export default ShareLink;