import { TextInput, TextAreaInput, Field, FieldGroup, FieldLabel, FieldRow, FieldError, FieldHint, CheckBox, Button, ButtonGroup, Box, } from '@rocket.chat/fuselage'; import { validateEmail } from '@rocket.chat/tools'; import { Page, PageHeader, PageScrollableContentWithShadow, PageFooter } from '@rocket.chat/ui-client'; import { useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useMutation } from '@tanstack/react-query'; import { useId } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { Trans, useTranslation } from 'react-i18next'; import { isJSON } from '../../../../lib/utils/isJSON'; type SendEmailFormValue = { fromEmail: string; subject: string; emailBody: string; dryRun: boolean; query?: string; }; const initialData = { fromEmail: '', query: '', dryRun: false, subject: '', emailBody: '' }; const MailerPage = () => { const { t } = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const { register, formState: { errors, isDirty }, handleSubmit, reset, control, } = useForm({ defaultValues: initialData, mode: 'onBlur' }); const mailerEndpoint = useEndpoint('POST', '/v1/mailer'); const sendMailAction = useMutation({ mutationFn: mailerEndpoint, onSuccess: () => { dispatchToastMessage({ type: 'success', message: t('The_emails_are_being_sent'), }); }, onError: (error) => { dispatchToastMessage({ type: 'error', message: error }); }, }); const handleSendEmail = async ({ fromEmail, subject, emailBody, dryRun, query }: SendEmailFormValue) => { sendMailAction.mutateAsync({ from: fromEmail, subject, body: emailBody, dryrun: dryRun, query }); }; const mailerFormId = useId(); const fromEmailId = useId(); const queryId = useId(); const dryRunId = useId(); const subjectId = useId(); const emailBodyId = useId(); return ( {t('From')} (validateEmail(fromEmail) ? undefined : t('error-invalid-email-address')), })} error={errors.fromEmail?.message} aria-required='true' aria-invalid={errors.fromEmail ? 'true' : 'false'} aria-describedby={`${fromEmailId}-error`} /> {errors.fromEmail && ( {errors.fromEmail.message} )} {t('Dry_run')} ( )} /> {t('Dry_run_description')} {t('Query')} (query && query !== '' && !isJSON(query) ? t('Query_is_not_valid_JSON') : true), })} error={errors.query?.message} aria-describedby={`${queryId}-error ${queryId}-hint`} aria-invalid={errors.query ? 'true' : 'false'} /> {errors.query && ( {errors.query.message} )} {t('Query_description')} {t('Subject')} {errors.subject && ( {errors.subject.message} )} {t('Email_body')} (emailBody?.indexOf('[unsubscribe]') === -1 ? t('error-missing-unsubscribe-link') : true), })} rows={10} aria-describedby={`${emailBodyId}-error ${emailBodyId}-hint`} error={errors.emailBody?.message} aria-required='true' aria-invalid={errors.emailBody ? 'true' : 'false'} /> {errors.emailBody && ( {errors.emailBody.message} )} }} /> ); }; export default MailerPage;