ApiSettings.jsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import AppContainer from '~/client/services/AppContainer';
  5. import PersonalContainer from '~/client/services/PersonalContainer';
  6. import { toastSuccess, toastError } from '~/client/util/apiNotification';
  7. import { apiv3Put } from '~/client/util/apiv3-client';
  8. import { withUnstatedContainers } from '../UnstatedUtils';
  9. class ApiSettings extends React.Component {
  10. constructor(appContainer) {
  11. super();
  12. this.onClickSubmit = this.onClickSubmit.bind(this);
  13. }
  14. async onClickSubmit() {
  15. const { t, appContainer, personalContainer } = this.props;
  16. try {
  17. await apiv3Put('/personal-setting/api-token');
  18. await personalContainer.retrievePersonalData();
  19. toastSuccess(t('toaster.update_successed', { target: t('page_me_apitoken.api_token') }));
  20. }
  21. catch (err) {
  22. toastError(err);
  23. }
  24. }
  25. render() {
  26. const { t, personalContainer } = this.props;
  27. return (
  28. <React.Fragment>
  29. <h2 className="border-bottom my-4">{ t('API Token Settings') }</h2>
  30. <div className="row mb-3">
  31. <label htmlFor="apiToken" className="col-md-3 text-md-right">{t('Current API Token')}</label>
  32. <div className="col-md-6">
  33. {personalContainer.state.apiToken != null
  34. ? (
  35. <input
  36. data-testid="grw-api-settings-input"
  37. data-hide-in-vrt
  38. className="form-control"
  39. type="text"
  40. name="apiToken"
  41. value={personalContainer.state.apiToken}
  42. readOnly
  43. />
  44. )
  45. : (
  46. <p>
  47. { t('page_me_apitoken.notice.apitoken_issued') }
  48. </p>
  49. )}
  50. </div>
  51. </div>
  52. <div className="row">
  53. <div className="offset-lg-2 col-lg-7">
  54. <p className="alert alert-warning">
  55. { t('page_me_apitoken.notice.update_token1') }<br />
  56. { t('page_me_apitoken.notice.update_token2') }
  57. </p>
  58. </div>
  59. </div>
  60. <div className="row my-3">
  61. <div className="offset-4 col-5">
  62. <button
  63. data-testid="grw-api-settings-update-button"
  64. type="button"
  65. className="btn btn-primary text-nowrap"
  66. onClick={this.onClickSubmit}
  67. >
  68. {t('Update API Token')}
  69. </button>
  70. </div>
  71. </div>
  72. </React.Fragment>
  73. );
  74. }
  75. }
  76. const ApiSettingsWrapper = withUnstatedContainers(ApiSettings, [AppContainer, PersonalContainer]);
  77. ApiSettings.propTypes = {
  78. t: PropTypes.func.isRequired, // i18next
  79. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  80. personalContainer: PropTypes.instanceOf(PersonalContainer).isRequired,
  81. };
  82. export default withTranslation()(ApiSettingsWrapper);