login with two factor

This commit is contained in:
hamid zarghami
2025-07-27 09:58:00 +03:30
parent b73a265b35
commit 4fd6378ee8
2 changed files with 29 additions and 10 deletions
+3 -1
View File
@@ -244,6 +244,8 @@
"enter_mobile_number": "شماره موبایل خود را وارد کنید", "enter_mobile_number": "شماره موبایل خود را وارد کنید",
"try_again": "ارسال مجدد", "try_again": "ارسال مجدد",
"toast_resend_code": "کد جدیدی برای شما ارسال شد", "toast_resend_code": "کد جدیدی برای شما ارسال شد",
"old_version": "نسخه قدیمی داشبورد" "old_version": "نسخه قدیمی داشبورد",
"twoFactorToken": "کد دو مرحله ای",
"enter_twoFactorToken": "کد دو مرحله ای خود را وارد کنید"
} }
} }
+19 -2
View File
@@ -1,4 +1,4 @@
import { FC } from 'react' import { FC, useState } from 'react'
import LogoImage from '../../assets/images/logo.svg' import LogoImage from '../../assets/images/logo.svg'
import LogoSmallImage from '../../assets/images/logo-small.svg' import LogoSmallImage from '../../assets/images/logo-small.svg'
import Input from '../../components/Input' import Input from '../../components/Input'
@@ -16,16 +16,19 @@ import { Paths } from '../../utils/Paths'
type LoginFormType = { type LoginFormType = {
email: string; email: string;
password: string; password: string;
twoFactorToken?: string;
} }
const Login: FC = () => { const Login: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const loginWithPassword = useLoginWithPassword() const loginWithPassword = useLoginWithPassword()
const [showTwoFactor, setShowTwoFactor] = useState(false)
const formik = useFormik<LoginFormType>({ const formik = useFormik<LoginFormType>({
initialValues: { initialValues: {
email: '', email: '',
password: '' password: '',
twoFactorToken: undefined,
}, },
validationSchema: Yup.object({ validationSchema: Yup.object({
email: Yup.string() email: Yup.string()
@@ -37,6 +40,9 @@ const Login: FC = () => {
onSubmit(values) { onSubmit(values) {
loginWithPassword.mutate(values, { loginWithPassword.mutate(values, {
onSuccess(data) { onSuccess(data) {
if (data?.data?.requires2FA) {
setShowTwoFactor(true)
} else {
setToken(data?.data?.accessToken?.token) setToken(data?.data?.accessToken?.token)
setRefreshToken(data?.data?.refreshToken?.token) setRefreshToken(data?.data?.refreshToken?.token)
const redirectUrl = getRedirectUrl(); const redirectUrl = getRedirectUrl();
@@ -45,6 +51,7 @@ const Login: FC = () => {
return; return;
} }
window.location.href = Paths.received window.location.href = Paths.received
}
}, },
onError(error: ErrorType) { onError(error: ErrorType) {
toast(error?.response?.data?.error?.message[0], 'error') toast(error?.response?.data?.error?.message[0], 'error')
@@ -104,6 +111,16 @@ const Login: FC = () => {
</div> </div>
</div> </div>
{showTwoFactor && (
<div className='mt-6'>
<Input
label={t('auth.twoFactorToken')}
placeholder={t('auth.enter_twoFactorToken')}
{...formik.getFieldProps('twoFactorToken')}
/>
</div>
)}
<Button <Button
label={t('auth.login')} label={t('auth.login')}
className='mt-8' className='mt-8'