DeleteSlackBotSettingsModal.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React, { useCallback, useMemo } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import {
  4. Button, Modal, ModalHeader, ModalBody, ModalFooter,
  5. } from 'reactstrap';
  6. type DeleteSlackBotSettingsModalProps = {
  7. isResetAll: boolean,
  8. isOpen: boolean,
  9. onClose?: () => void,
  10. onClickDeleteButton?: () => void,
  11. }
  12. export const DeleteSlackBotSettingsModal = React.memo((props: DeleteSlackBotSettingsModalProps) => {
  13. const { t } = useTranslation();
  14. const {
  15. isResetAll, isOpen, onClose, onClickDeleteButton,
  16. } = props;
  17. const deleteSlackCredentialsHandler = useCallback(() => {
  18. onClickDeleteButton?.();
  19. onClose?.();
  20. }, [onClickDeleteButton, onClose]);
  21. const closeButtonHandler = useCallback(() => {
  22. onClose?.();
  23. }, [onClose]);
  24. // Memoize conditional content
  25. const headerContent = useMemo(() => {
  26. if (isResetAll) {
  27. return (
  28. <>
  29. <span className="material-symbols-outlined">delete_forever</span>
  30. {t('admin:slack_integration.reset_all_settings')}
  31. </>
  32. );
  33. }
  34. return (
  35. <>
  36. <span className="material-symbols-outlined">delete</span>
  37. {t('admin:slack_integration.delete_slackbot_settings')}
  38. </>
  39. );
  40. }, [isResetAll, t]);
  41. const bodyContent = useMemo(() => {
  42. const htmlContent = isResetAll
  43. ? t('admin:slack_integration.all_settings_of_the_bot_will_be_reset')
  44. : t('admin:slack_integration.slackbot_settings_notice');
  45. return (
  46. <span
  47. // eslint-disable-next-line react/no-danger
  48. dangerouslySetInnerHTML={{ __html: htmlContent }}
  49. />
  50. );
  51. }, [isResetAll, t]);
  52. const deleteButtonContent = useMemo(() => {
  53. if (isResetAll) {
  54. return (
  55. <>
  56. <span className="material-symbols-outlined">delete_forever</span>
  57. {t('admin:slack_integration.reset')}
  58. </>
  59. );
  60. }
  61. return (
  62. <>
  63. <span className="material-symbols-outlined">delete</span>
  64. {t('admin:slack_integration.delete')}
  65. </>
  66. );
  67. }, [isResetAll, t]);
  68. // Early return optimization
  69. if (!isOpen) {
  70. return <></>;
  71. }
  72. return (
  73. <Modal isOpen={isOpen} toggle={closeButtonHandler} className="page-comment-delete-modal">
  74. <ModalHeader tag="h4" toggle={closeButtonHandler} className="text-danger">
  75. <span>{headerContent}</span>
  76. </ModalHeader>
  77. <ModalBody>
  78. {bodyContent}
  79. </ModalBody>
  80. <ModalFooter>
  81. <Button onClick={closeButtonHandler}>{t('Cancel')}</Button>
  82. <Button color="danger" onClick={deleteSlackCredentialsHandler}>
  83. {deleteButtonContent}
  84. </Button>
  85. </ModalFooter>
  86. </Modal>
  87. );
  88. });
  89. DeleteSlackBotSettingsModal.displayName = 'DeleteSlackBotSettingsModal';