MailSetting.tsx 3.8 KB

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