import { type FC, useEffect, useRef } from 'react' import { type OtpVerifyType } from '../types/AuthTypes' import { useFormik } from 'formik' import * as Yup from 'yup' import { useAuthStore } from '../store/AuthStore' import Button from '../../../components/Button' import OTPInput from 'react-otp-input' import { useCountDown } from '../../../hooks/useCountDown' // import ArrowLeftIcon from '../../../assets/images/arrow-left.svg' import { useLoginWithOtp, useOtpVerify } from '../hooks/useAuthData' import { extractErrorMessage, setRefreshToken } from '../../../config/func' import { setToken } from '../../../config/func' import { toast } from '@/shared/toast' import { Paths } from '@/config/Paths' const LoginStep2: FC = () => { const { phone, setStepLogin } = useAuthStore() const { value, reset } = useCountDown(2, true) const otpVerify = useOtpVerify() const loginWithOtp = useLoginWithOtp() const firstOtpInputRef = useRef(null) const formik = useFormik({ initialValues: { phone: phone, otp: '' }, validationSchema: Yup.object({ otp: Yup.string() .required('این فیلد اجباری است.') }), onSubmit(values) { const params: OtpVerifyType = { phone: phone, otp: values.otp } otpVerify.mutate(params, { onSuccess(data) { setToken(data?.data?.tokens?.accessToken?.token) setRefreshToken(data?.data?.tokens?.refreshToken?.token) // Check if there's a redirect parameter in the URL window.location.href = Paths.home }, onError(error) { toast(extractErrorMessage(error), 'error') }, }) }, }) useEffect(() => { const frameId = requestAnimationFrame(() => { firstOtpInputRef.current?.focus() }) return () => cancelAnimationFrame(frameId) }, []) useEffect(() => { // بررسی پشتیبانی از Web OTP API if (!("OTPCredential" in window)) return; const ac = new AbortController(); navigator.credentials .get({ otp: { transport: ["sms"] }, signal: ac.signal, } as CredentialRequestOptions) // اطمینان از تطابق تایپ‌ها .then((otpCredential) => { if (otpCredential && "otp" in otpCredential) { formik.setFieldValue("otp", (otpCredential).otp); } }) .catch((err) => console.error("SMS AutoFill Error:", err)); return () => ac.abort(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const reSend = () => { loginWithOtp.mutate({ phone: phone }, { onSuccess: () => { reset() toast('کد مجدد ارسال شد', 'success') }, onError: (error) => { toast(extractErrorMessage(error), 'error') } }) } useEffect(() => { if (formik.values.otp.length === 5) { formik.handleSubmit() } // eslint-disable-next-line react-hooks/exhaustive-deps }, [formik.values.otp]) return (

کد تایید را وارد کنید

کد تایید برای
{phone}
ارسال شد.
setStepLogin(1)} className='text-black cursor-pointer'> تغییر شماره

کد تایید
formik.setFieldValue('otp', otp)} renderInput={(props, index) => { const { ref, ...inputProps } = props return ( { ref(element) if (index === 0) { firstOtpInputRef.current = element } }} type='tel' autoComplete="one-time-otp" inputMode="numeric" className='w-full h-[50px] min-w-[50px] flex-1 mx-2 bg-white border border-border rounded-[10px]' /> ) }} />
{ formik.touched.otp && formik.errors.otp &&
{formik.errors.otp}
}
{ value !== '00:00' ?
{value}
مانده تا دریافت مجدد کد
:
ارسال مجدد
}