'use client'; import React, { useState, type FormEvent, type ChangeEvent, useEffect, useRef } from 'react' import PrimaryButton from '@/components/button/PrimaryButton' import { EyeToggleIcon } from '@/components/icons/EyeToggleIcon'; import InputField from '@/components/input/InputField'; import OTPInputField from '@/components/input/MultiInputField'; enum LOGIN_STEPS { ENTER_NUMBER = 0, ENTER_PASSWORD = 1, ENTER_OTP = 2, } enum CLICK_ID { TOGGLE_PASSWORD = "togglePassword", RESET_PASSWORD = "resetPassword", RESEND_OTP = "resendOtp" } type Props = object function AuthIndex({ }: Props) { const [number, setNumber] = useState(""); const [password, setPassword] = useState(""); const [otp, setOtp] = useState(""); const [showPassword, setShowPassword] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [step, setStep] = useState(LOGIN_STEPS.ENTER_NUMBER); const [timerRunning, setTimerRunning] = useState(false); const [secondLeft, setSecondsLeft] = useState(0); const intervalRef = useRef(null); // ← useRef for interval useEffect(() => { if (timerRunning && intervalRef.current === null) { intervalRef.current = setInterval(() => { setSecondsLeft((state) => { if (state <= 1) { // changed to <= 1 to prevent negative values setTimerRunning(false); clearInterval(intervalRef.current!); intervalRef.current = null; return 0; } return state - 1; }); }, 1000); } return () => { // Cleanup if component unmounts or timerRunning changes if (intervalRef.current) { clearInterval(intervalRef.current); intervalRef.current = null; } }; }, [timerRunning]); useEffect(() => { if (step == LOGIN_STEPS.ENTER_OTP) { setSecondsLeft(30); setTimerRunning(true); } return () => { } }, [step]) const updateInput = (e: ChangeEvent) => { if (e.target.id == "phone") { setNumber(() => e.target.value) } else if (e.target.id == "password") { setPassword(() => e.target.value) } else if (e.target.id == "rememberMe") { setRememberMe((state) => !state) } else if (e.target.id.startsWith("otp-data")) { const index = +e.target.id.split('-')[2]; const prev = otp.padEnd(6).split(''); prev[index] = e.target.value; const next = prev.join(''); setOtp(next.trimEnd()); } } const onClickEvent = (e: React.MouseEvent) => { e.stopPropagation(); const target = e.target as HTMLButtonElement; if (target.id === CLICK_ID.TOGGLE_PASSWORD) { setShowPassword((state) => !state); } else if (target.id === CLICK_ID.RESET_PASSWORD) { setShowPassword((state) => !state); } else if (target.id === CLICK_ID.RESEND_OTP) { setSecondsLeft(30); setTimerRunning(true); } }; const submit = (e: FormEvent) => { e.preventDefault(); console.log("STEP: ", step) if (step == LOGIN_STEPS.ENTER_NUMBER) { setStep(LOGIN_STEPS.ENTER_PASSWORD) } if (step == LOGIN_STEPS.ENTER_PASSWORD) { setStep(LOGIN_STEPS.ENTER_OTP) } if (step == LOGIN_STEPS.ENTER_OTP) { setStep(LOGIN_STEPS.ENTER_NUMBER) setTimerRunning(false); } } if (step == LOGIN_STEPS.ENTER_NUMBER) { // First Step -> Enter number return (
ورود به سیستم

برای ورود شماره همراه خود را وارد نمایید.

بعدی
) } if (step == LOGIN_STEPS.ENTER_PASSWORD) { return (
ورود به سیستم

کلمه عبور خود را وارد نمایید.

{/* TODO: customize checkbox */}
ورود به منو
) } if (step == LOGIN_STEPS.ENTER_OTP) { return (
{/* // TODO: add persian digits font */}
کد فعالسازی را وارد کنید

کد ۶ رقمی ارسال شده به شماره {number} را وارد نمایید.

{timerRunning ?
{secondLeft} ثانیه دیگر تا دریافت کد
:
کد را دریافت نکردید؟
}
بعدی
) } } export default AuthIndex