admin login

This commit is contained in:
hamid zarghami
2025-08-30 16:24:53 +03:30
parent d19bf516e5
commit 54c3c59a12
24 changed files with 906 additions and 650 deletions
+56 -44
View File
@@ -1,55 +1,50 @@
import { FC } from 'react'
import { type FC } from 'react'
import Input from '../../../components/Input'
import { useTranslation } from 'react-i18next'
import { LoginType } from '../types/AuthTypes'
import { type LoginWithPasswordType } from '../types/AuthTypes'
import { useFormik } from 'formik'
import * as Yup from 'yup'
import { useAuthStore } from '../store/AuthStore'
import Error from '../../../components/Error'
import Button from '../../../components/Button'
import { isEmail } from '../../../config/func'
import { useCheckHasAccount, useLoginWithOtp } from '../hooks/useAuthData'
import { useLoginWithPassword } from '../hooks/useAuthData'
import { toast } from 'react-toastify'
import { ErrorType } from '../../../helpers/types'
import { type ErrorType } from '../../../helpers/types'
import { setRefreshToken, setToken } from '../../../config/func'
import { Pages } from '../../../config/Pages'
const LoginStep1: FC = () => {
const { t } = useTranslation('global')
const { setPhone, phone, setStepLogin, setEmail } = useAuthStore()
const loginWithOtp = useLoginWithOtp()
const checkHasAccount = useCheckHasAccount()
const { setEmail } = useAuthStore()
const loginWithPassword = useLoginWithPassword()
const formik = useFormik<LoginType>({
const formik = useFormik<LoginWithPasswordType>({
initialValues: {
phone_email: phone,
email: '',
password: '',
},
validationSchema: Yup.object({
phone_email: Yup.string()
email: Yup.string()
.email(t('errors.invalid_email'))
.required(t('errors.required')),
password: Yup.string()
.required(t('errors.required'))
}),
onSubmit(values) {
if (isEmail(values.phone_email)) {
setEmail(values.phone_email)
checkHasAccount.mutate({ email: values.phone_email }, {
onSuccess() {
setStepLogin(2)
},
onError(error: ErrorType) {
toast.error(error?.response?.data?.error?.message[0])
},
})
} else {
setPhone(values.phone_email)
loginWithOtp.mutate({ phone: values.phone_email }, {
onSuccess() {
setStepLogin(2)
toast.success(t('auth.otp_sent'))
},
onError(error: ErrorType) {
toast.error(error?.response?.data?.error?.message[0])
},
})
}
setEmail(values.email)
loginWithPassword.mutate(values, {
onSuccess(data) {
if (data?.results?.accessToken?.token && data?.results?.refreshToken?.token) {
setToken(data.results.accessToken.token)
setRefreshToken(data.results.refreshToken.token)
window.location.href = Pages.dashboard
}
},
onError(error: ErrorType) {
toast.error(error?.response?.data?.error?.message[0])
},
})
},
})
@@ -64,32 +59,49 @@ const LoginStep1: FC = () => {
</p>
</div>
<div className='mt-16'>
<div className='mt-16 space-y-6'>
<Input
label={t('auth.mobile_or_email')}
placeholder={t('auth.enter_mobile_or_email')}
type='text'
label={t('auth.email')}
placeholder={t('auth.enter_email')}
type='email'
className='text-right'
name='phone_email'
name='email'
onChange={formik.handleChange}
value={formik.values.phone_email}
value={formik.values.email}
error_text={formik.touched.email && formik.errors.email ? formik.errors.email : ''}
/>
<Input
label={t('auth.password')}
placeholder={t('auth.enter_password')}
type='password'
className='text-right'
name='password'
onChange={formik.handleChange}
value={formik.values.password}
error_text={formik.touched.password && formik.errors.password ? formik.errors.password : ''}
/>
{
formik.touched.phone_email && formik.errors.phone_email &&
formik.touched.email && formik.errors.email &&
<Error
errorText={formik.errors.phone_email}
errorText={formik.errors.email}
/>
}
{
formik.touched.password && formik.errors.password &&
<Error
errorText={formik.errors.password}
/>
}
</div>
<Button
label={t('auth.next')}
label={t('auth.login')}
className='mt-8'
onClick={() => formik.handleSubmit()}
isLoading={loginWithOtp.isPending || checkHasAccount.isPending}
isLoading={loginWithPassword.isPending}
/>
</div>