MailSetting.jsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { toastSuccess, toastError } from '../../../util/apiNotification';
  5. import { withUnstatedContainers } from '../../UnstatedUtils';
  6. import AppContainer from '../../../services/AppContainer';
  7. import AdminAppContainer from '../../../services/AdminAppContainer';
  8. import SmtpSetting from './SmtpSetting';
  9. import SesSetting from './SesSetting';
  10. function MailSetting(props) {
  11. const { t, adminAppContainer } = props;
  12. const transmissionMethods = ['smtp', 'ses'];
  13. async function submitHandler() {
  14. const { t } = props;
  15. try {
  16. await adminAppContainer.updateMailSettingHandler();
  17. toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.ses_settings') }));
  18. }
  19. catch (err) {
  20. toastError(err);
  21. }
  22. }
  23. async function sendTestEmailHandler() {
  24. const { adminAppContainer } = props;
  25. try {
  26. await adminAppContainer.sendTestEmail();
  27. toastSuccess(t('admin:app_setting.success_to_send_test_email'));
  28. }
  29. catch (err) {
  30. toastError(err);
  31. }
  32. }
  33. return (
  34. <React.Fragment>
  35. {!adminAppContainer.state.isMailerSetup && (
  36. <div className="alert alert-danger"><i className="icon-exclamation"></i> {t('admin:app_setting.mailer_is_not_set_up')}</div>
  37. )}
  38. <div className="row form-group mb-5">
  39. <label className="col-md-3 col-form-label text-right">{t('admin:app_setting.from_e-mail_address')}</label>
  40. <div className="col-md-6">
  41. <input
  42. className="form-control"
  43. type="text"
  44. placeholder={`${t('eg')} mail@growi.org`}
  45. defaultValue={adminAppContainer.state.fromAddress || ''}
  46. onChange={(e) => { adminAppContainer.changeFromAddress(e.target.value) }}
  47. />
  48. </div>
  49. </div>
  50. <div className="row form-group mb-5">
  51. <label className="text-left text-md-right col-md-3 col-form-label">
  52. {t('admin:app_setting.transmission_method')}
  53. </label>
  54. <div className="col-md-6">
  55. {transmissionMethods.map((method) => {
  56. return (
  57. <div key={method} className="custom-control custom-radio custom-control-inline">
  58. <input
  59. type="radio"
  60. className="custom-control-input"
  61. name="transmission-method"
  62. id={`transmission-nethod-radio-${method}`}
  63. checked={adminAppContainer.state.transmissionMethod === method}
  64. onChange={(e) => {
  65. adminAppContainer.changeTransmissionMethod(method);
  66. }}
  67. />
  68. <label className="custom-control-label" htmlFor={`transmission-nethod-radio-${method}`}>{t(`admin:app_setting.${method}_label`)}</label>
  69. </div>
  70. );
  71. })}
  72. </div>
  73. </div>
  74. {adminAppContainer.state.transmissionMethod === 'smtp' && <SmtpSetting />}
  75. {adminAppContainer.state.transmissionMethod === 'ses' && <SesSetting />}
  76. <div className="row my-3">
  77. <div className="mx-auto">
  78. <button type="button" className="btn btn-primary" onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null}>
  79. { t('Update') }
  80. </button>
  81. {adminAppContainer.state.transmissionMethod === 'smtp' && (
  82. <button type="button" className="btn btn-secondary ml-4" onClick={sendTestEmailHandler}>
  83. {t('admin:app_setting.send_test_email')}
  84. </button>
  85. )}
  86. </div>
  87. </div>
  88. </React.Fragment>
  89. );
  90. }
  91. /**
  92. * Wrapper component for using unstated
  93. */
  94. const MailSettingWrapper = withUnstatedContainers(MailSetting, [AppContainer, AdminAppContainer]);
  95. MailSetting.propTypes = {
  96. t: PropTypes.func.isRequired, // i18next
  97. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  98. adminAppContainer: PropTypes.instanceOf(AdminAppContainer).isRequired,
  99. };
  100. export default withTranslation()(MailSettingWrapper);