|
@@ -1,14 +1,15 @@
|
|
|
-import React from 'react';
|
|
|
|
|
|
|
+import React, { useCallback, useEffect } from 'react';
|
|
|
|
|
|
|
|
import { useTranslation } from 'next-i18next';
|
|
import { useTranslation } from 'next-i18next';
|
|
|
|
|
+import { useForm } from 'react-hook-form';
|
|
|
|
|
|
|
|
import AdminAppContainer from '~/client/services/AdminAppContainer';
|
|
import AdminAppContainer from '~/client/services/AdminAppContainer';
|
|
|
import { toastSuccess, toastError } from '~/client/util/toastr';
|
|
import { toastSuccess, toastError } from '~/client/util/toastr';
|
|
|
|
|
|
|
|
import { withUnstatedContainers } from '../../UnstatedUtils';
|
|
import { withUnstatedContainers } from '../../UnstatedUtils';
|
|
|
|
|
|
|
|
-import SesSetting from './SesSetting';
|
|
|
|
|
-import SmtpSetting from './SmtpSetting';
|
|
|
|
|
|
|
+import { SesSetting } from './SesSetting';
|
|
|
|
|
+import { SmtpSetting } from './SmtpSetting';
|
|
|
|
|
|
|
|
|
|
|
|
|
type Props = {
|
|
type Props = {
|
|
@@ -22,15 +23,57 @@ const MailSetting = (props: Props) => {
|
|
|
|
|
|
|
|
const transmissionMethods = ['smtp', 'ses'];
|
|
const transmissionMethods = ['smtp', 'ses'];
|
|
|
|
|
|
|
|
- async function submitHandler() {
|
|
|
|
|
|
|
+ const {
|
|
|
|
|
+ register,
|
|
|
|
|
+ handleSubmit,
|
|
|
|
|
+ reset,
|
|
|
|
|
+ } = useForm();
|
|
|
|
|
+
|
|
|
|
|
+ // Reset form when adminAppContainer state changes
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ reset({
|
|
|
|
|
+ fromAddress: adminAppContainer.state.fromAddress || '',
|
|
|
|
|
+ transmissionMethod: adminAppContainer.state.transmissionMethod || 'smtp',
|
|
|
|
|
+ smtpHost: adminAppContainer.state.smtpHost || '',
|
|
|
|
|
+ smtpPort: adminAppContainer.state.smtpPort || '',
|
|
|
|
|
+ smtpUser: adminAppContainer.state.smtpUser || '',
|
|
|
|
|
+ smtpPassword: adminAppContainer.state.smtpPassword || '',
|
|
|
|
|
+ sesAccessKeyId: adminAppContainer.state.sesAccessKeyId || '',
|
|
|
|
|
+ sesSecretAccessKey: adminAppContainer.state.sesSecretAccessKey || '',
|
|
|
|
|
+ });
|
|
|
|
|
+ }, [
|
|
|
|
|
+ adminAppContainer.state.fromAddress,
|
|
|
|
|
+ adminAppContainer.state.transmissionMethod,
|
|
|
|
|
+ adminAppContainer.state.smtpHost,
|
|
|
|
|
+ adminAppContainer.state.smtpPort,
|
|
|
|
|
+ adminAppContainer.state.smtpUser,
|
|
|
|
|
+ adminAppContainer.state.smtpPassword,
|
|
|
|
|
+ adminAppContainer.state.sesAccessKeyId,
|
|
|
|
|
+ adminAppContainer.state.sesSecretAccessKey,
|
|
|
|
|
+ reset,
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ const onSubmit = useCallback(async(data) => {
|
|
|
try {
|
|
try {
|
|
|
|
|
+ // Await all setState completions before API call
|
|
|
|
|
+ await Promise.all([
|
|
|
|
|
+ adminAppContainer.changeFromAddress(data.fromAddress),
|
|
|
|
|
+ adminAppContainer.changeTransmissionMethod(data.transmissionMethod),
|
|
|
|
|
+ adminAppContainer.changeSmtpHost(data.smtpHost),
|
|
|
|
|
+ adminAppContainer.changeSmtpPort(data.smtpPort),
|
|
|
|
|
+ adminAppContainer.changeSmtpUser(data.smtpUser),
|
|
|
|
|
+ adminAppContainer.changeSmtpPassword(data.smtpPassword),
|
|
|
|
|
+ adminAppContainer.changeSesAccessKeyId(data.sesAccessKeyId),
|
|
|
|
|
+ adminAppContainer.changeSesSecretAccessKey(data.sesSecretAccessKey),
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
await adminAppContainer.updateMailSettingHandler();
|
|
await adminAppContainer.updateMailSettingHandler();
|
|
|
toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.mail_settings'), ns: 'commons' }));
|
|
toastSuccess(t('toaster.update_successed', { target: t('admin:app_setting.mail_settings'), ns: 'commons' }));
|
|
|
}
|
|
}
|
|
|
catch (err) {
|
|
catch (err) {
|
|
|
toastError(err);
|
|
toastError(err);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
+ }, [adminAppContainer, t]);
|
|
|
|
|
|
|
|
async function sendTestEmailHandler() {
|
|
async function sendTestEmailHandler() {
|
|
|
const { adminAppContainer } = props;
|
|
const { adminAppContainer } = props;
|
|
@@ -45,7 +88,7 @@ const MailSetting = (props: Props) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
- <React.Fragment>
|
|
|
|
|
|
|
+ <form onSubmit={handleSubmit(onSubmit)}>
|
|
|
{!adminAppContainer.state.isMailerSetup && (
|
|
{!adminAppContainer.state.isMailerSetup && (
|
|
|
<div className="alert alert-danger"><span className="material-symbols-outlined">error</span> {t('admin:app_setting.mailer_is_not_set_up')}</div>
|
|
<div className="alert alert-danger"><span className="material-symbols-outlined">error</span> {t('admin:app_setting.mailer_is_not_set_up')}</div>
|
|
|
)}
|
|
)}
|
|
@@ -56,8 +99,7 @@ const MailSetting = (props: Props) => {
|
|
|
className="form-control"
|
|
className="form-control"
|
|
|
type="text"
|
|
type="text"
|
|
|
placeholder={`${t('eg')} mail@growi.org`}
|
|
placeholder={`${t('eg')} mail@growi.org`}
|
|
|
- value={adminAppContainer.state.fromAddress || ''}
|
|
|
|
|
- onChange={(e) => { adminAppContainer.changeFromAddress(e.target.value) }}
|
|
|
|
|
|
|
+ {...register('fromAddress')}
|
|
|
/>
|
|
/>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -73,12 +115,9 @@ const MailSetting = (props: Props) => {
|
|
|
<input
|
|
<input
|
|
|
type="radio"
|
|
type="radio"
|
|
|
className="form-check-input"
|
|
className="form-check-input"
|
|
|
- name="transmission-method"
|
|
|
|
|
id={`transmission-method-radio-${method}`}
|
|
id={`transmission-method-radio-${method}`}
|
|
|
- checked={adminAppContainer.state.transmissionMethod === method}
|
|
|
|
|
- onChange={(e) => {
|
|
|
|
|
- adminAppContainer.changeTransmissionMethod(method);
|
|
|
|
|
- }}
|
|
|
|
|
|
|
+ value={method}
|
|
|
|
|
+ {...register('transmissionMethod')}
|
|
|
/>
|
|
/>
|
|
|
<label className="form-label form-check-label" htmlFor={`transmission-method-radio-${method}`}>{t(`admin:app_setting.${method}_label`)}</label>
|
|
<label className="form-label form-check-label" htmlFor={`transmission-method-radio-${method}`}>{t(`admin:app_setting.${method}_label`)}</label>
|
|
|
</div>
|
|
</div>
|
|
@@ -87,12 +126,12 @@ const MailSetting = (props: Props) => {
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- {adminAppContainer.state.transmissionMethod === 'smtp' && <SmtpSetting />}
|
|
|
|
|
- {adminAppContainer.state.transmissionMethod === 'ses' && <SesSetting />}
|
|
|
|
|
|
|
+ {adminAppContainer.state.transmissionMethod === 'smtp' && <SmtpSetting register={register} />}
|
|
|
|
|
+ {adminAppContainer.state.transmissionMethod === 'ses' && <SesSetting register={register} />}
|
|
|
|
|
|
|
|
<div className="row my-3">
|
|
<div className="row my-3">
|
|
|
<div className="mx-auto">
|
|
<div className="mx-auto">
|
|
|
- <button type="button" className="btn btn-primary" onClick={submitHandler} disabled={adminAppContainer.state.retrieveError != null}>
|
|
|
|
|
|
|
+ <button type="submit" className="btn btn-primary" disabled={adminAppContainer.state.retrieveError != null}>
|
|
|
{ t('Update') }
|
|
{ t('Update') }
|
|
|
</button>
|
|
</button>
|
|
|
{adminAppContainer.state.transmissionMethod === 'smtp' && (
|
|
{adminAppContainer.state.transmissionMethod === 'smtp' && (
|
|
@@ -102,7 +141,7 @@ const MailSetting = (props: Props) => {
|
|
|
)}
|
|
)}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </React.Fragment>
|
|
|
|
|
|
|
+ </form>
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
};
|
|
};
|