import type { IEmailInboxPayload } from '@rocket.chat/core-typings'; import { Accordion, AccordionItem, Button, ButtonGroup, TextInput, TextAreaInput, Field, ToggleSwitch, FieldGroup, Box, Margins, NumberInput, PasswordInput, FieldLabel, FieldRow, FieldError, FieldHint, } from '@rocket.chat/fuselage'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { validateEmail } from '@rocket.chat/tools'; import { GenericModal, PageScrollableContentWithShadow } from '@rocket.chat/ui-client'; import { useSetModal, useToastMessageDispatch, useRoute, useEndpoint } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import { useId, useCallback } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import AutoCompleteDepartment from '../../omnichannel/components/AutoCompleteDepartment'; type EmailInboxFormData = { active: boolean; name: string; email: string; description?: string; senderInfo?: string; department?: string; smtpServer: string; smtpPort: string; smtpUsername: string; smtpPassword: string; smtpSecure: boolean; imapServer: string; imapPort: string; imapUsername: string; imapPassword: string; imapSecure: boolean; imapRetries: string; }; type EmailInboxFormProps = { inboxData?: IEmailInboxPayload; }; const EmailInboxForm = ({ inboxData }: EmailInboxFormProps): ReactElement => { const { t } = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const setModal = useSetModal(); const router = useRoute('admin-email-inboxes'); const handleBack = useCallback(() => router.push({}), [router]); const saveEmailInbox = useEndpoint('POST', '/v1/email-inbox'); const deleteInboxAction = useEndpoint('DELETE', '/v1/email-inbox/:_id', { _id: inboxData?._id ?? '' }); const emailAlreadyExistsAction = useEndpoint('GET', '/v1/email-inbox.search'); const { control, handleSubmit, formState: { errors, isDirty }, } = useForm({ values: { active: inboxData?.active ?? true, name: inboxData?.name ?? '', email: inboxData?.email ?? '', description: inboxData?.description ?? '', senderInfo: inboxData?.senderInfo ?? '', department: inboxData?.department ?? '', // SMTP smtpServer: inboxData?.smtp.server ?? '', smtpPort: String(inboxData?.smtp.port ?? 587), smtpUsername: inboxData?.smtp.username ?? '', smtpPassword: inboxData?.smtp.password ?? '', smtpSecure: inboxData?.smtp.secure ?? false, // IMAP imapServer: inboxData?.imap.server ?? '', imapPort: String(inboxData?.imap.port ?? 993), imapUsername: inboxData?.imap.username ?? '', imapPassword: inboxData?.imap.password ?? '', imapSecure: inboxData?.imap.secure ?? false, imapRetries: String(inboxData?.imap.maxRetries ?? 10), }, mode: 'all', }); const handleDelete = useEffectEvent(() => { const deleteInbox = async (): Promise => { try { await deleteInboxAction(); dispatchToastMessage({ type: 'success', message: t('Email_Inbox_has_been_removed') }); handleBack(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } finally { setModal(null); } }; setModal( setModal(null)} confirmText={t('Delete')}> {t('You_will_not_be_able_to_recover_email_inbox')} , ); }); const handleSave = useEffectEvent( async ({ active, name, email, description, senderInfo, department, smtpServer, smtpPort, smtpUsername, smtpPassword, smtpSecure, imapServer, imapPort, imapUsername, imapPassword, imapSecure, imapRetries, }: EmailInboxFormData) => { const smtp = { server: smtpServer, port: parseInt(smtpPort, 10), username: smtpUsername, password: smtpPassword, secure: smtpSecure, }; const imap = { server: imapServer, port: parseInt(imapPort, 10), username: imapUsername, password: imapPassword, secure: imapSecure, maxRetries: parseInt(imapRetries, 10), }; const payload = { ...(inboxData?._id && { _id: inboxData?._id }), active, name, email, description, senderInfo, ...(department && { department }), smtp, imap, }; try { await saveEmailInbox(payload); dispatchToastMessage({ type: 'success', message: t('Email_Inbox_has_been_added') }); handleBack(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }, ); const checkEmailExists = useEffectEvent(async (email: string) => { if (!email) { return; } if (!validateEmail(email)) { return t('error-invalid-email-address'); } const { emailInbox } = await emailAlreadyExistsAction({ email }); if (!emailInbox || (inboxData?._id && emailInbox._id === inboxData?._id)) { return; } return t('Email_already_exists'); }); const activeField = useId(); const nameField = useId(); const emailField = useId(); const descriptionField = useId(); const senderInfoField = useId(); const departmentField = useId(); const smtpServerField = useId(); const smtpPortField = useId(); const smtpUsernameField = useId(); const smtpPasswordField = useId(); const smtpSecureField = useId(); const imapServerField = useId(); const imapPortField = useId(); const imapUsernameField = useId(); const imapPasswordField = useId(); const imapRetriesField = useId(); const imapSecureField = useId(); return ( {t('Active')} ( )} /> {t('Name')} ( )} /> {errors.name && ( {errors.name?.message} )} {t('Email')} checkEmailExists(value), }} render={({ field }) => ( )} /> {errors.email && ( {errors.email?.message} )} {t('Description')} } /> {t('Sender_Info')} } /> {t('Will_Appear_In_From')} {t('Department')} ( )} /> {t('Only_Members_Selected_Department_Can_View_Channel')} {t('Server')} ( )} /> {errors.smtpServer && ( {errors.smtpServer?.message} )} {t('Port')} ( )} /> {errors.smtpPort && ( {errors.smtpPort?.message} )} {t('Username')} ( )} /> {errors.smtpUsername && ( {errors.smtpUsername?.message} )} {t('Password')} ( )} /> {errors.smtpPassword && ( {errors.smtpPassword?.message} )} {t('Connect_SSL_TLS')} } /> {t('Server')} ( )} /> {errors.imapServer && ( {errors.imapServer?.message} )} {t('Port')} ( )} /> {errors.imapPort && ( {errors.imapPort?.message} )} {t('Username')} ( )} /> {errors.imapUsername && ( {errors.imapUsername?.message} )} {t('Password')} ( )} /> {errors.imapPassword && ( {errors.imapPassword?.message} )} {t('Max_Retry')} ( )} /> {errors.imapRetries && ( {errors.imapRetries?.message} )} {t('Connect_SSL_TLS')} } /> {inboxData?._id && ( )} ); }; export default EmailInboxForm;