EmptyTrashModal.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import type { FC } from 'react';
  2. import React, {
  3. useState,
  4. } from 'react';
  5. import { useTranslation } from 'next-i18next';
  6. import {
  7. Modal, ModalHeader, ModalBody, ModalFooter,
  8. } from 'reactstrap';
  9. import { apiv3Delete } from '~/client/util/apiv3-client';
  10. import { useEmptyTrashModalStatus, useEmptyTrashModalActions } from '~/states/ui/modal/empty-trash';
  11. import ApiErrorMessageList from './PageManagement/ApiErrorMessageList';
  12. const EmptyTrashModal: FC = () => {
  13. const { t } = useTranslation();
  14. const emptyTrashModalData = useEmptyTrashModalStatus();
  15. const { close: closeEmptyTrashModal } = useEmptyTrashModalActions();
  16. const isOpened = emptyTrashModalData?.isOpened ?? false;
  17. const canDeleteAllpages = emptyTrashModalData?.opts?.canDeleteAllPages ?? false;
  18. const [errs, setErrs] = useState<Error[] | null>(null);
  19. async function emptyTrash() {
  20. if (emptyTrashModalData == null || emptyTrashModalData.pages == null) {
  21. return;
  22. }
  23. try {
  24. await apiv3Delete('/pages/empty-trash');
  25. const onEmptiedTrash = emptyTrashModalData.opts?.onEmptiedTrash;
  26. if (onEmptiedTrash != null) {
  27. onEmptiedTrash();
  28. }
  29. closeEmptyTrashModal();
  30. }
  31. catch (err) {
  32. setErrs([err]);
  33. }
  34. }
  35. async function emptyTrashButtonHandler() {
  36. await emptyTrash();
  37. }
  38. const renderPagePaths = () => {
  39. const pages = emptyTrashModalData?.pages;
  40. if (pages != null) {
  41. return pages.map(page => (
  42. <p key={page.data._id} className="mb-1">
  43. <code>{ page.data.path }</code>
  44. </p>
  45. ));
  46. }
  47. return <></>;
  48. };
  49. return (
  50. <Modal size="lg" isOpen={isOpened} toggle={closeEmptyTrashModal} data-testid="page-delete-modal">
  51. <ModalHeader tag="h4" toggle={closeEmptyTrashModal} className="text-danger">
  52. <span className="material-symbols-outlined">delete_forever</span>
  53. {t('modal_empty.empty_the_trash')}
  54. </ModalHeader>
  55. <ModalBody>
  56. <div className="grw-scrollable-modal-body pb-1">
  57. <label className="form-label">{ t('modal_delete.deleting_page') }:</label><br />
  58. {/* Todo: change the way to show path on modal when too many pages are selected */}
  59. {renderPagePaths()}
  60. </div>
  61. {!canDeleteAllpages && t('modal_empty.not_deletable_notice')}<br />
  62. {t('modal_empty.notice')}
  63. </ModalBody>
  64. <ModalFooter>
  65. <ApiErrorMessageList errs={errs} />
  66. <button
  67. type="button"
  68. className="btn btn-danger"
  69. onClick={emptyTrashButtonHandler}
  70. >
  71. <span className="material-symbols-outlined" aria-hidden="true">delete_forever</span>
  72. {t('modal_empty.empty_the_trash_button')}
  73. </button>
  74. </ModalFooter>
  75. </Modal>
  76. );
  77. };
  78. export default EmptyTrashModal;