DisassociateModal.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import React, { useCallback } from 'react';
  2. import type { HasObjectId, IExternalAccount } from '@growi/core';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. Modal,
  6. ModalHeader,
  7. ModalBody,
  8. ModalFooter,
  9. } from 'reactstrap';
  10. import { toastSuccess, toastError } from '~/client/util/toastr';
  11. import type { IExternalAuthProviderType } from '~/interfaces/external-auth-provider';
  12. import { useDisassociateLdapAccount, useSWRxPersonalExternalAccounts } from '~/stores/personal-settings';
  13. type Props = {
  14. isOpen: boolean,
  15. onClose: () => void,
  16. accountForDisassociate: IExternalAccount<IExternalAuthProviderType> & HasObjectId,
  17. }
  18. const DisassociateModal = (props: Props): React.JSX.Element => {
  19. const { isOpen, onClose, accountForDisassociate } = props;
  20. const { t } = useTranslation();
  21. const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
  22. const { trigger: disassociateLdapAccount } = useDisassociateLdapAccount();
  23. const { providerType, accountId } = accountForDisassociate;
  24. const disassociateAccountHandler = useCallback(async() => {
  25. try {
  26. await disassociateLdapAccount({ providerType, accountId });
  27. onClose();
  28. toastSuccess(t('security_settings.updated_general_security_setting'));
  29. }
  30. catch (err) {
  31. toastError(err);
  32. }
  33. if (mutatePersonalExternalAccounts != null) {
  34. mutatePersonalExternalAccounts();
  35. }
  36. }, [accountId, disassociateLdapAccount, mutatePersonalExternalAccounts, onClose, providerType, t]);
  37. // Early return optimization
  38. if (!isOpen) {
  39. return <></>;
  40. }
  41. return (
  42. <Modal isOpen={isOpen} toggle={onClose}>
  43. <ModalHeader className="text-info" toggle={onClose}>
  44. {t('personal_settings.disassociate_external_account')}
  45. </ModalHeader>
  46. <ModalBody>
  47. {/* eslint-disable-next-line react/no-danger */}
  48. <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
  49. </ModalBody>
  50. <ModalFooter>
  51. <button type="button" className="btn btn-sm btn-outline-secondary" onClick={onClose}>
  52. { t('Cancel') }
  53. </button>
  54. <button type="button" className="btn btn-sm btn-danger" onClick={disassociateAccountHandler}>
  55. <span className="material-symbols-outlined">link_off</span>
  56. { t('Disassociate') }
  57. </button>
  58. </ModalFooter>
  59. </Modal>
  60. );
  61. };
  62. export default DisassociateModal;