2
0

AttachmentDeleteModal.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React, { useCallback, useMemo } from 'react';
  2. import { HasObjectId, IAttachment, IUser } from '@growi/core';
  3. import { UserPicture } from '@growi/ui';
  4. import {
  5. Button, Modal, ModalHeader, ModalBody, ModalFooter,
  6. } from 'reactstrap';
  7. import { Username } from '../User/Username';
  8. import styles from './DeleteAttachmentModal.module.scss';
  9. const iconByFormat = (format: string): string => {
  10. return format.match(/image\/.+/i) ? 'icon-picture' : 'icon-doc';
  11. };
  12. export const AttachmentDeleteModal: React.FC<{
  13. isOpen: boolean,
  14. toggle: () => void,
  15. attachmentToDelete: IAttachment & HasObjectId,
  16. deleting: boolean,
  17. deleteError: string,
  18. onAttachmentDeleteHandler: (attachment: IAttachment & HasObjectId) => Promise<void>,
  19. }> = ({
  20. isOpen, toggle,
  21. attachmentToDelete, deleting, deleteError,
  22. onAttachmentDeleteHandler,
  23. }) => {
  24. const onDeleteClicked = useCallback(() => {
  25. onAttachmentDeleteHandler(attachmentToDelete);
  26. }, [attachmentToDelete, onAttachmentDeleteHandler]);
  27. const renderByFileFormat = useCallback((attachment: IAttachment & HasObjectId) => {
  28. const content = (attachment.fileFormat.match(/image\/.+/i))
  29. // eslint-disable-next-line @next/next/no-img-element
  30. ? <img src={attachment.filePathProxied} alt="deleting image" />
  31. : '';
  32. return (
  33. <div className="attachment-delete-image">
  34. <p>
  35. <i className={iconByFormat(attachment.fileFormat)}></i> {attachment.originalName}
  36. </p>
  37. <p>
  38. uploaded by <UserPicture user={attachment.creator} size="sm"></UserPicture> <Username user={attachment.creator as IUser}></Username>
  39. </p>
  40. {content}
  41. </div>
  42. );
  43. }, []);
  44. const deletingIndicator = useMemo(() => {
  45. if (deleting) {
  46. return <div className="speeding-wheel-sm"></div>;
  47. }
  48. if (deleteError) {
  49. return <span>{deleteError}</span>;
  50. }
  51. return <></>;
  52. }, [deleting, deleteError]);
  53. return (
  54. <Modal
  55. isOpen={isOpen}
  56. className={`${styles['attachment-delete-modal']} attachment-delete-modal`}
  57. size="lg"
  58. aria-labelledby="contained-modal-title-lg"
  59. fade={false}
  60. >
  61. <ModalHeader tag="h4" toggle={toggle} className="bg-danger text-light">
  62. <span id="contained-modal-title-lg">Delete attachment?</span>
  63. </ModalHeader>
  64. <ModalBody>
  65. {renderByFileFormat(attachmentToDelete)}
  66. </ModalBody>
  67. <ModalFooter>
  68. <div className="mr-3 d-inline-block">
  69. {deletingIndicator}
  70. </div>
  71. <Button
  72. color="danger"
  73. onClick={onDeleteClicked}
  74. disabled={deleting}
  75. >Delete!
  76. </Button>
  77. </ModalFooter>
  78. </Modal>
  79. );
  80. };