EmptyTrashModal.tsx 2.7 KB

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