import { useCallback, useEffect } from 'react'; import { useTranslation } from 'next-i18next'; import { useForm } from 'react-hook-form'; import AdminAppContainer from '~/client/services/AdminAppContainer'; import { toastError, toastSuccess } from '~/client/util/toastr'; import { withUnstatedContainers } from '../../UnstatedUtils'; import { OAuth2Setting } from './OAuth2Setting'; import { SesSetting } from './SesSetting'; import { SmtpSetting } from './SmtpSetting'; type Props = { adminAppContainer: AdminAppContainer; }; const MailSetting = (props: Props) => { const { t } = useTranslation(['admin', 'commons']); const { adminAppContainer } = props; const transmissionMethods = ['smtp', 'ses', 'oauth2']; const { register, handleSubmit, reset, watch } = useForm(); // Watch the transmission method to dynamically switch between SMTP and SES settings const currentTransmissionMethod = watch( 'transmissionMethod', adminAppContainer.state.transmissionMethod || 'smtp', ); // 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 || '', oauth2ClientId: adminAppContainer.state.oauth2ClientId || '', oauth2ClientSecret: adminAppContainer.state.oauth2ClientSecret || '', oauth2RefreshToken: adminAppContainer.state.oauth2RefreshToken || '', oauth2User: adminAppContainer.state.oauth2User || '', }); }, [ adminAppContainer.state.fromAddress, adminAppContainer.state.transmissionMethod, adminAppContainer.state.smtpHost, adminAppContainer.state.smtpPort, adminAppContainer.state.smtpUser, adminAppContainer.state.smtpPassword, adminAppContainer.state.sesAccessKeyId, adminAppContainer.state.sesSecretAccessKey, adminAppContainer.state.oauth2ClientId, adminAppContainer.state.oauth2ClientSecret, adminAppContainer.state.oauth2RefreshToken, adminAppContainer.state.oauth2User, reset, ]); const onSubmit = useCallback( async (data) => { 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), adminAppContainer.changeOAuth2ClientId(data.oauth2ClientId), adminAppContainer.changeOAuth2ClientSecret(data.oauth2ClientSecret), adminAppContainer.changeOAuth2RefreshToken(data.oauth2RefreshToken), adminAppContainer.changeOAuth2User(data.oauth2User), ]); await adminAppContainer.updateMailSettingHandler(); toastSuccess( t('toaster.update_successed', { target: t('admin:app_setting.mail_settings'), ns: 'commons', }), ); } catch (err) { toastError(err); } }, [adminAppContainer, t], ); async function sendTestEmailHandler() { const { adminAppContainer } = props; try { await adminAppContainer.sendTestEmail(); toastSuccess(t('admin:app_setting.success_to_send_test_email')); } catch (err) { toastError(err); } } return (
); }; /** * Wrapper component for using unstated */ const MailSettingWrapper = withUnstatedContainers(MailSetting, [ AdminAppContainer, ]); export default MailSettingWrapper;