input slug

This commit is contained in:
hamid zarghami
2025-11-19 09:06:17 +03:30
parent 6cc718891d
commit e9e66f129e
6 changed files with 39 additions and 10 deletions
+3 -1
View File
@@ -38,7 +38,9 @@
"enter_password_step3": "رمز عبور را وارد کنید", "enter_password_step3": "رمز عبور را وارد کنید",
"enter_your_password": "رمز عبور خود را وارد کنید.", "enter_your_password": "رمز عبور خود را وارد کنید.",
"forgot_password": "فراموشی رمز عبور", "forgot_password": "فراموشی رمز عبور",
"login_with_otp": "ورود با رمز عبور یکبار مصرف" "login_with_otp": "ورود با رمز عبور یکبار مصرف",
"slug": "نام کاربری",
"enter_slug": "نام کاربری خود را وارد کنید"
}, },
"errors": { "errors": {
"required": "این فیلد اجباری می باشد", "required": "این فیلد اجباری می باشد",
+27 -4
View File
@@ -9,30 +9,33 @@ import Button from '../../../components/Button'
import { useLoginWithOtp } from '../hooks/useAuthData' import { useLoginWithOtp } from '../hooks/useAuthData'
import { toast } from 'react-toastify' import { toast } from 'react-toastify'
import { type ErrorType } from '../../../helpers/types' import { type ErrorType } from '../../../helpers/types'
import { useParams } from 'react-router-dom'
type LoginStep1FormType = { type LoginStep1FormType = {
phone: string; phone: string;
slug: string;
} }
const LoginStep1: FC = () => { const LoginStep1: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const { setPhone, phone, setStepLogin } = useAuthStore() const { setPhone, phone, setStepLogin, setSlug } = useAuthStore()
const loginWithOtp = useLoginWithOtp() const loginWithOtp = useLoginWithOtp()
const { slug } = useParams()
const formik = useFormik<LoginStep1FormType>({ const formik = useFormik<LoginStep1FormType>({
initialValues: { initialValues: {
phone: phone, phone: phone,
slug: ''
}, },
validationSchema: Yup.object({ validationSchema: Yup.object({
phone: Yup.string() phone: Yup.string()
.required(t('errors.required')),
slug: Yup.string()
.required(t('errors.required')) .required(t('errors.required'))
}), }),
onSubmit(values) { onSubmit(values) {
setPhone(values.phone) setPhone(values.phone)
loginWithOtp.mutate({ phone: values.phone, slug: slug as string }, { setSlug(values.slug)
loginWithOtp.mutate(values, {
onSuccess() { onSuccess() {
setStepLogin(2) setStepLogin(2)
toast.success(t('auth.otp_sent')) toast.success(t('auth.otp_sent'))
@@ -75,6 +78,26 @@ const LoginStep1: FC = () => {
</div> </div>
<div className='mt-4'>
<Input
label={t('auth.slug')}
placeholder={t('auth.enter_slug')}
type='text'
className='text-right'
name='slug'
onChange={formik.handleChange}
value={formik.values.slug}
/>
{
formik.touched.slug && formik.errors.slug &&
<Error
errorText={formik.errors.slug}
/>
}
</div>
<Button <Button
label={t('auth.next')} label={t('auth.next')}
+2 -4
View File
@@ -12,15 +12,13 @@ import { useOtpVerify } from '../hooks/useAuthData'
import { type ErrorType } from '../../../helpers/types' import { type ErrorType } from '../../../helpers/types'
import { toast } from 'react-toastify' import { toast } from 'react-toastify'
import { setToken, setRefreshToken } from '../../../config/func' import { setToken, setRefreshToken } from '../../../config/func'
import { useParams } from 'react-router-dom'
const LoginStep2: FC = () => { const LoginStep2: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const { phone, setStepLogin } = useAuthStore() const { phone, setStepLogin, slug } = useAuthStore()
const { value } = useCountDown(2, true) const { value } = useCountDown(2, true)
const otpVerify = useOtpVerify() const otpVerify = useOtpVerify()
const { slug } = useParams()
const formik = useFormik<{ otp: string }>({ const formik = useFormik<{ otp: string }>({
initialValues: { initialValues: {
@@ -34,7 +32,7 @@ const LoginStep2: FC = () => {
const params: OtpVerifyType = { const params: OtpVerifyType = {
phone: phone, phone: phone,
otp: values.otp, otp: values.otp,
slug: slug as string slug: slug
} }
otpVerify.mutate(params, { otpVerify.mutate(params, {
onSuccess(data) { onSuccess(data) {
+4
View File
@@ -3,6 +3,10 @@ import { type AuthStoreType } from "../../auth/types/AuthTypes";
export const useAuthStore = create<AuthStoreType>((set) => ({ export const useAuthStore = create<AuthStoreType>((set) => ({
phone: "", phone: "",
slug: "",
setSlug(value) {
set({ slug: value });
},
setPhone(value) { setPhone(value) {
set({ phone: value }); set({ phone: value });
}, },
+2
View File
@@ -9,6 +9,8 @@ export type LoginPasswordType = {
export type AuthStoreType = { export type AuthStoreType = {
phone: string; phone: string;
slug: string;
setSlug: (value: string) => void;
setPhone: (value: string) => void; setPhone: (value: string) => void;
email: string; email: string;
setEmail: (value: string) => void; setEmail: (value: string) => void;
+1 -1
View File
@@ -6,7 +6,7 @@ import Login from '../pages/auth/Login'
const Auth: FC = () => { const Auth: FC = () => {
return ( return (
<Routes> <Routes>
<Route path={Pages.auth.login + '/:slug'} element={<Login />} /> <Route path={Pages.auth.login} element={<Login />} />
</Routes> </Routes>
) )
} }