ExternalAccountLinkedMe.jsx 3.9 KB

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