SmtpSetting.jsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import loggerFactory from '@alias/logger';
  5. import { withUnstatedContainers } from '../../UnstatedUtils';
  6. import { toastSuccess, toastError } from '../../../util/apiNotification';
  7. import { withLoadingSppiner } from '../../SuspenseUtils';
  8. import AppContainer from '../../../services/AppContainer';
  9. import AdminAppContainer from '../../../services/AdminAppContainer';
  10. const logger = loggerFactory('growi:smtpSettings');
  11. function SmtpSetting(props) {
  12. const { adminAppContainer, t } = props;
  13. async function submitHandler() {
  14. const { t, adminAppContainer } = props;
  15. try {
  16. await adminAppContainer.updateSmtpSettingHandler();
  17. toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.smtp_settings') }));
  18. }
  19. catch (err) {
  20. toastError(err);
  21. logger.error(err);
  22. }
  23. }
  24. return (
  25. <React.Fragment>
  26. <div id="mail-smtp" className="tab-pane active mt-5">
  27. <div className="row form-group mb-5">
  28. <label className="col-md-3 col-form-label text-left">{t('admin:app_setting.smtp_settings')}</label>
  29. <div className="col-md-4">
  30. <label>{t('admin:app_setting.host')}</label>
  31. <input
  32. className="form-control"
  33. type="text"
  34. defaultValue={adminAppContainer.state.smtpHost || ''}
  35. onChange={(e) => { adminAppContainer.changeSmtpHost(e.target.value) }}
  36. />
  37. </div>
  38. <div className="col-md-2">
  39. <label>{t('admin:app_setting.port')}</label>
  40. <input
  41. className="form-control"
  42. defaultValue={adminAppContainer.state.smtpPort || ''}
  43. onChange={(e) => { adminAppContainer.changeSmtpPort(e.target.value) }}
  44. />
  45. </div>
  46. </div>
  47. <div className="row form-group mb-5">
  48. <div className="col-md-3 offset-md-3">
  49. <label>{t('admin:app_setting.user')}</label>
  50. <input
  51. className="form-control"
  52. type="text"
  53. defaultValue={adminAppContainer.state.smtpUser || ''}
  54. onChange={(e) => { adminAppContainer.changeSmtpUser(e.target.value) }}
  55. />
  56. </div>
  57. <div className="col-md-3">
  58. <label>{t('Password')}</label>
  59. <input
  60. className="form-control"
  61. type="password"
  62. defaultValue={adminAppContainer.state.smtpPassword || ''}
  63. onChange={(e) => { adminAppContainer.changeSmtpPassword(e.target.value) }}
  64. />
  65. </div>
  66. </div>
  67. <div className="row my-3">
  68. <div className="mx-auto">
  69. <button type="button" className="btn btn-primary" onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null}>
  70. { t('Update') }
  71. </button>
  72. </div>
  73. </div>
  74. </div>
  75. </React.Fragment>
  76. );
  77. }
  78. /**
  79. * Wrapper component for using unstated
  80. */
  81. const SmtpSettingWrapper = withUnstatedContainers(withLoadingSppiner(SmtpSetting), [AppContainer, AdminAppContainer]);
  82. SmtpSetting.propTypes = {
  83. t: PropTypes.func.isRequired, // i18next
  84. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  85. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  86. };
  87. export default withTranslation()(SmtpSettingWrapper);