DisassociateModal.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 { usePersonalSettings, 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): JSX.Element => {
  19. const { t } = useTranslation();
  20. const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
  21. const { disassociateLdapAccount } = usePersonalSettings();
  22. const { providerType, accountId } = props.accountForDisassociate;
  23. const disassociateAccountHandler = useCallback(async() => {
  24. try {
  25. await disassociateLdapAccount({ providerType, accountId });
  26. props.onClose();
  27. toastSuccess(t('security_settings.updated_general_security_setting'));
  28. }
  29. catch (err) {
  30. toastError(err);
  31. }
  32. if (mutatePersonalExternalAccounts != null) {
  33. mutatePersonalExternalAccounts();
  34. }
  35. }, [accountId, disassociateLdapAccount, mutatePersonalExternalAccounts, props, providerType, t]);
  36. return (
  37. <Modal isOpen={props.isOpen} toggle={props.onClose}>
  38. <ModalHeader className="text-info" toggle={props.onClose}>
  39. {t('personal_settings.disassociate_external_account')}
  40. </ModalHeader>
  41. <ModalBody>
  42. {/* eslint-disable-next-line react/no-danger */}
  43. <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
  44. </ModalBody>
  45. <ModalFooter>
  46. <button type="button" className="btn btn-sm btn-outline-secondary" onClick={props.onClose}>
  47. { t('Cancel') }
  48. </button>
  49. <button type="button" className="btn btn-sm btn-danger" onClick={disassociateAccountHandler}>
  50. <span className="material-symbols-outlined">link_off</span>
  51. { t('Disassociate') }
  52. </button>
  53. </ModalFooter>
  54. </Modal>
  55. );
  56. };
  57. export default DisassociateModal;