ExternalAccountLinkedMe.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../UnstatedUtils';
  5. import { toastError } from '../../util/apiNotification';
  6. import AppContainer from '../../services/AppContainer';
  7. import PersonalContainer from '../../services/PersonalContainer';
  8. import ExternalAccountRow from './ExternalAccountRow';
  9. import AssociateModal from './AssociateModal';
  10. import DisassociateModal from './DisassociateModal';
  11. class ExternalAccountLinkedMe extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. isAssociateModalOpen: false,
  16. isDisassociateModalOpen: false,
  17. accountForDisassociate: null,
  18. };
  19. this.openAssociateModal = this.openAssociateModal.bind(this);
  20. this.closeAssociateModal = this.closeAssociateModal.bind(this);
  21. this.openDisassociateModal = this.openDisassociateModal.bind(this);
  22. this.closeDisassociateModal = this.closeDisassociateModal.bind(this);
  23. }
  24. async componentDidMount() {
  25. try {
  26. await this.props.personalContainer.retrieveExternalAccounts();
  27. }
  28. catch (err) {
  29. toastError(err);
  30. }
  31. }
  32. openAssociateModal() {
  33. this.setState({ isAssociateModalOpen: true });
  34. }
  35. closeAssociateModal() {
  36. this.setState({ isAssociateModalOpen: false });
  37. }
  38. /**
  39. * open disassociate modal, and props account
  40. * @param {object} account
  41. */
  42. openDisassociateModal(account) {
  43. this.setState({
  44. isDisassociateModalOpen: true,
  45. accountForDisassociate: account,
  46. });
  47. }
  48. closeDisassociateModal() {
  49. this.setState({ isDisassociateModalOpen: false });
  50. }
  51. render() {
  52. const { t, personalContainer } = this.props;
  53. const { externalAccounts } = personalContainer.state;
  54. return (
  55. <Fragment>
  56. <div className="container-fluid">
  57. <h2 className="border-bottom">
  58. <button type="button" className="btn btn-default btn-sm pull-right" onClick={this.openAssociateModal}>
  59. <i className="icon-plus" aria-hidden="true" />
  60. Add
  61. </button>
  62. { t('admin:user_management.external_accounts') }
  63. </h2>
  64. </div>
  65. <div className="row">
  66. <div className="col-md-12">
  67. <table className="table table-bordered table-user-list">
  68. <thead>
  69. <tr>
  70. <th width="120px">{ t('admin:user_management.authentication_provider') }</th>
  71. <th>
  72. <code>accountId</code>
  73. </th>
  74. <th width="200px">{ t('Created') }</th>
  75. <th width="150px">{ t('Admin') }</th>
  76. </tr>
  77. </thead>
  78. <tbody>
  79. {externalAccounts !== 0 && externalAccounts.map(account => (
  80. <ExternalAccountRow
  81. account={account}
  82. key={account._id}
  83. openDisassociateModal={this.openDisassociateModal}
  84. />
  85. ))}
  86. </tbody>
  87. </table>
  88. </div>
  89. </div>
  90. <AssociateModal
  91. isOpen={this.state.isAssociateModalOpen}
  92. onClose={this.closeAssociateModal}
  93. />
  94. {this.state.accountForDisassociate != null
  95. && (
  96. <DisassociateModal
  97. isOpen={this.state.isDisassociateModalOpen}
  98. onClose={this.closeDisassociateModal}
  99. accountForDisassociate={this.state.accountForDisassociate}
  100. />
  101. )}
  102. </Fragment>
  103. );
  104. }
  105. }
  106. const ExternalAccountLinkedMeWrapper = (props) => {
  107. return createSubscribedElement(ExternalAccountLinkedMe, props, [AppContainer, PersonalContainer]);
  108. };
  109. ExternalAccountLinkedMe.propTypes = {
  110. t: PropTypes.func.isRequired, // i18next
  111. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  112. personalContainer: PropTypes.instanceOf(PersonalContainer).isRequired,
  113. };
  114. export default withTranslation()(ExternalAccountLinkedMeWrapper);