DisassociateModal.jsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { useTranslation } from 'react-i18next';
  4. import {
  5. Modal,
  6. ModalHeader,
  7. ModalBody,
  8. ModalFooter,
  9. } from 'reactstrap';
  10. import AppContainer from '~/client/services/AppContainer';
  11. import PersonalContainer from '~/client/services/PersonalContainer';
  12. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  13. import { withUnstatedContainers } from '../UnstatedUtils';
  14. class DisassociateModal extends React.Component {
  15. constructor(props) {
  16. super(props);
  17. this.onClickDisassociateBtn = this.onClickDisassociateBtn.bind(this);
  18. }
  19. async onClickDisassociateBtn() {
  20. const { t, personalContainer } = this.props;
  21. const { providerType, accountId } = this.props.accountForDisassociate;
  22. try {
  23. await personalContainer.disassociateLdapAccount({ providerType, accountId });
  24. this.props.onClose();
  25. toastSuccess(t('security_setting.updated_general_security_setting'));
  26. }
  27. catch (err) {
  28. toastError(err);
  29. }
  30. try {
  31. await personalContainer.retrieveExternalAccounts();
  32. }
  33. catch (err) {
  34. toastError(err);
  35. }
  36. }
  37. render() {
  38. const { t, accountForDisassociate } = this.props;
  39. const { providerType, accountId } = accountForDisassociate;
  40. return (
  41. <Modal isOpen={this.props.isOpen} toggle={this.props.onClose}>
  42. <ModalHeader className="bg-info text-light" toggle={this.props.onClose}>
  43. {t('personal_settings.disassociate_external_account')}
  44. </ModalHeader>
  45. <ModalBody>
  46. {/* eslint-disable-next-line react/no-danger */}
  47. <p dangerouslySetInnerHTML={{ __html: t('personal_settings.disassociate_external_account_desc', { providerType, accountId }) }} />
  48. </ModalBody>
  49. <ModalFooter>
  50. <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.props.onClose}>
  51. { t('Cancel') }
  52. </button>
  53. <button type="button" className="btn btn-sm btn-danger" onClick={this.onClickDisassociateBtn}>
  54. <i className="ti-unlink"></i>
  55. { t('Disassociate') }
  56. </button>
  57. </ModalFooter>
  58. </Modal>
  59. );
  60. }
  61. }
  62. DisassociateModal.propTypes = {
  63. t: PropTypes.func.isRequired, // i18next
  64. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  65. personalContainer: PropTypes.instanceOf(PersonalContainer).isRequired,
  66. isOpen: PropTypes.bool.isRequired,
  67. onClose: PropTypes.func.isRequired,
  68. accountForDisassociate: PropTypes.object.isRequired,
  69. };
  70. const DisassociateModalWrapperFC = (props) => {
  71. const { t } = useTranslation();
  72. return <DisassociateModal t={t} {...props} />;
  73. };
  74. /**
  75. * Wrapper component for using unstated
  76. */
  77. const DisassociateModalWrapper = withUnstatedContainers(DisassociateModalWrapperFC, [AppContainer, PersonalContainer]);
  78. export default DisassociateModalWrapper;