import React, { useCallback, useEffect } from 'react'; import { useTranslation } from 'next-i18next'; import { useForm } from 'react-hook-form'; import AdminAppContainer from '~/client/services/AdminAppContainer'; import { toastSuccess, toastError } from '~/client/util/toastr'; import { withUnstatedContainers } from '../../UnstatedUtils'; 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']; 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 || '', }); }, [ 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 { // 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(); 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;