EmptyTrashModal.tsx 2.4 KB

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