ShareLink.tsx 2.6 KB

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