DisassociateModal.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import React, { useCallback } from 'react';
  2. import type { IExternalAccountHasId } 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 { usePersonalSettings, useSWRxPersonalExternalAccounts } from '~/stores/personal-settings';
  12. type Props = {
  13. isOpen: boolean,
  14. onClose: () => void,
  15. accountForDisassociate: IExternalAccountHasId,
  16. }
  17. const DisassociateModal = (props: Props): JSX.Element => {
  18. const { t } = useTranslation();
  19. const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
  20. const { disassociateLdapAccount } = usePersonalSettings();
  21. const { providerType, accountId } = props.accountForDisassociate;
  22. const disassociateAccountHandler = useCallback(async() => {
  23. try {
  24. await disassociateLdapAccount({ providerType, accountId });
  25. props.onClose();
  26. toastSuccess(t('security_settings.updated_general_security_setting'));
  27. }
  28. catch (err) {
  29. toastError(err);
  30. }
  31. if (mutatePersonalExternalAccounts != null) {
  32. mutatePersonalExternalAccounts();
  33. }
  34. }, [accountId, disassociateLdapAccount, mutatePersonalExternalAccounts, props, providerType, t]);
  35. return (
  36. <Modal isOpen={props.isOpen} toggle={props.onClose}>
  37. <ModalHeader className="bg-info text-light" toggle={props.onClose}>
  38. {t('personal_settings.disassociate_external_account')}
  39. </ModalHeader>
  40. <ModalBody>
  41. {/* eslint-disable-next-line react/no-danger */}
  42. <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
  43. </ModalBody>
  44. <ModalFooter>
  45. <button type="button" className="btn btn-sm btn-outline-secondary" onClick={props.onClose}>
  46. { t('Cancel') }
  47. </button>
  48. <button type="button" className="btn btn-sm btn-danger" onClick={disassociateAccountHandler}>
  49. <i className="ti ti-unlink"></i>
  50. { t('Disassociate') }
  51. </button>
  52. </ModalFooter>
  53. </Modal>
  54. );
  55. };
  56. export default DisassociateModal;