AssociateModal.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React, { useState, useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import {
  4. Modal,
  5. ModalHeader,
  6. ModalBody,
  7. ModalFooter,
  8. } from 'reactstrap';
  9. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  10. import { usePersonalSettings, useSWRxPersonalExternalAccounts } from '~/stores/personal-settings';
  11. import LdapAuthTest from '../Admin/Security/LdapAuthTest';
  12. type Props = {
  13. isOpen: boolean,
  14. onClose: () => void,
  15. }
  16. const AssociateModal = (props: Props): JSX.Element => {
  17. const { t } = useTranslation();
  18. const { mutate: mutatePersonalExternalAccounts } = useSWRxPersonalExternalAccounts();
  19. const { associateLdapAccount } = usePersonalSettings();
  20. const { isOpen, onClose } = props;
  21. const [username, setUsername] = useState('');
  22. const [password, setPassword] = useState('');
  23. const closeModalHandler = useCallback(() => {
  24. onClose();
  25. setUsername('');
  26. setPassword('');
  27. }, [onClose]);
  28. const clickAddLdapAccountHandler = useCallback(async() => {
  29. try {
  30. await associateLdapAccount({ username, password });
  31. mutatePersonalExternalAccounts();
  32. closeModalHandler();
  33. toastSuccess(t('security_setting.updated_general_security_setting'));
  34. }
  35. catch (err) {
  36. toastError(err);
  37. }
  38. }, [associateLdapAccount, closeModalHandler, mutatePersonalExternalAccounts, password, t, username]);
  39. return (
  40. <Modal isOpen={isOpen} toggle={closeModalHandler} size="lg" data-testid="grw-associate-modal">
  41. <ModalHeader className="bg-primary text-light" toggle={onClose}>
  42. { t('admin:user_management.create_external_account') }
  43. </ModalHeader>
  44. <ModalBody>
  45. <ul className="nav nav-tabs passport-settings mb-2" role="tablist">
  46. <li className="nav-item active">
  47. <a href="#passport-ldap" className="nav-link active" data-toggle="tab" role="tab">
  48. <i className="fa fa-sitemap"></i> LDAP
  49. </a>
  50. </li>
  51. <li className="nav-item">
  52. <a href="#github-tbd" className="nav-link" data-toggle="tab" role="tab">
  53. <i className="fa fa-github"></i> (TBD) GitHub
  54. </a>
  55. </li>
  56. <li className="nav-item">
  57. <a href="#google-tbd" className="nav-link" data-toggle="tab" role="tab">
  58. <i className="fa fa-google"></i> (TBD) Google OAuth
  59. </a>
  60. </li>
  61. <li className="nav-item">
  62. <a href="#facebook-tbd" className="nav-link" data-toggle="tab" role="tab">
  63. <i className="fa fa-facebook"></i> (TBD) Facebook
  64. </a>
  65. </li>
  66. <li className="nav-item">
  67. <a href="#twitter-tbd" className="nav-link" data-toggle="tab" role="tab">
  68. <i className="fa fa-twitter"></i> (TBD) Twitter
  69. </a>
  70. </li>
  71. </ul>
  72. <div className="tab-content">
  73. <div id="passport-ldap" className="tab-pane active">
  74. <LdapAuthTest
  75. username={username}
  76. password={password}
  77. onChangeUsername={username => setUsername(username)}
  78. onChangePassword={password => setPassword(password)}
  79. />
  80. </div>
  81. <div id="github-tbd" className="tab-pane" role="tabpanel">TBD</div>
  82. <div id="google-tbd" className="tab-pane" role="tabpanel">TBD</div>
  83. <div id="facebook-tbd" className="tab-pane" role="tabpanel">TBD</div>
  84. <div id="twitter-tbd" className="tab-pane" role="tabpanel">TBD</div>
  85. </div>
  86. </ModalBody>
  87. <ModalFooter className="border-top-0">
  88. <button type="button" className="btn btn-primary mt-3" onClick={clickAddLdapAccountHandler}>
  89. <i className="fa fa-plus-circle" aria-hidden="true"></i>
  90. {t('add')}
  91. </button>
  92. </ModalFooter>
  93. </Modal>
  94. );
  95. };
  96. export default AssociateModal;