2
0

ExternalAccountLinkedMe.jsx 3.7 KB

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