EmptyTrashModal.tsx 2.6 KB

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