import { Box, Button } from '@rocket.chat/fuselage'; import { FieldGroup, TextInput, Field, FieldLabel, FieldRow, FieldError } from '@rocket.chat/fuselage-forms'; import { GenericModal } from '@rocket.chat/ui-client'; import { useToastMessageDispatch, useEndpoint } from '@rocket.chat/ui-contexts'; import { useEffect } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import type { OnConfirm } from './TwoFactorModal'; import { Method } from './TwoFactorModal'; export type TwoFactorEmailModalProps = { onConfirm: OnConfirm; onClose: () => void; invalidAttempt?: boolean; } & ( | { emailOrUsername: string; challengeId?: never; } | { challengeId: string; emailOrUsername?: never; } ); type TwoFactorEmailFormData = { code: string; }; const TwoFactorEmailModal = ({ onConfirm, onClose, invalidAttempt, emailOrUsername, challengeId }: TwoFactorEmailModalProps) => { const dispatchToastMessage = useToastMessageDispatch(); const { t } = useTranslation(); const { control, handleSubmit, setError, setValue, clearErrors, formState: { errors, isSubmitting }, } = useForm({ defaultValues: { code: '' }, }); useEffect(() => { if (invalidAttempt) { setError('code', { type: 'manual', message: t('Invalid_two_factor_code'), }); } }, [invalidAttempt, setError, t]); const sendEmailCode = useEndpoint('POST', '/v1/users.2fa.sendEmailCode'); const sendEmailCodeByChallengeId = useEndpoint('POST', '/v1/twoFactorChallenges.sendEmailCode'); const onClickResendCode = async (): Promise => { try { if (emailOrUsername) { await sendEmailCode({ emailOrUsername }); } else if (challengeId) { await sendEmailCodeByChallengeId({ challengeId }); } dispatchToastMessage({ type: 'success', message: t('Email_sent') }); } catch (error) { dispatchToastMessage({ type: 'error', message: t('error-email-send-failed', { message: error }), }); } }; const onSubmit = handleSubmit(async ({ code }) => { try { await onConfirm(code, Method.EMAIL); } catch (error) { setError('code', { type: 'manual', message: t('Invalid_two_factor_code'), }); setValue('code', ''); } }); return ( } onCancel={onClose} confirmText={t('Verify')} title={t('Enter_authentication_code')} onClose={onClose} variant='warning' confirmDisabled={isSubmitting} tagline={t('Email_two-factor_authentication')} icon={null} > {t('Enter_the_code_we_just_emailed_you')} ( { clearErrors('code'); onChange(e); }} placeholder={t('Enter_code_here')} autoComplete='one-time-code' inputMode='numeric' disabled={isSubmitting} error={errors.code?.message} /> )} /> {errors.code && {errors.code.message}} ); }; export default TwoFactorEmailModal;