import React, { useCallback, useEffect, useRef, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { updatePersonalDetails } from "../redux/registrationFormSlice"; import { Grid, TextField, FormControl, InputLabel, Select, MenuItem, Button, Box, Typography, Link, } from "@mui/material"; import AdvancedDropzone from "./AdvancedDropzone"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { LocalizationProvider } from "@mui/x-date-pickers"; import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns"; const OTP_LENGTH = 4; const OTP_TIMER_SEC = 120; // 2 minutes const PersonalDetailsForm = ({ onSubmitStep, onSkipStep, errors }) => { const dispatch = useDispatch(); const data = useSelector((state) => state.registerform.personalDetails); const nameInputRef = useRef(null); const [showOtp, setShowOtp] = useState(false); const [otp, setOtp] = useState(new Array(OTP_LENGTH).fill("")); const [otpTimer, setOtpTimer] = useState(0); const [otpError, setOtpError] = useState(""); const [mobileOtpVerified, setMobileOtpVerified] = useState(false); const [mobileNumberError, setMobileNumberError] = useState(""); const startOtpTimer = useCallback(() => { setOtpTimer(OTP_TIMER_SEC); }, []); useEffect(() => { if (otpTimer <= 0) return; const timerId = setInterval(() => { setOtpTimer((sec) => sec - 1); }, 1000); return () => clearInterval(timerId); }, [otpTimer]); useEffect(() => { nameInputRef.current?.focus(); }, []); const handleOtpChange = (index, value) => { if (!/^\d*$/.test(value)) return; const newOtp = [...otp]; newOtp[index] = value.slice(-1); setOtp(newOtp); if (value && index < OTP_LENGTH - 1) { const next = document.getElementById(`otp-${index + 1}`); if (next) next.focus(); } }; const resetOtp = () => { setOtp(new Array(OTP_LENGTH).fill("")); setOtpError(""); startOtpTimer(); }; const handleMobileSubmit = () => { if (!data.mobileNumber || data.mobileNumber.length !== 10) { setMobileNumberError( "Please enter a valid 10-digit mobile number before sending OTP" ); return; } setMobileNumberError(""); setShowOtp(true); resetOtp(); setMobileOtpVerified(false); }; const handleChange = (field, value) => { dispatch(updatePersonalDetails({ [field]: value })); if (field === "mobileNumber") { setMobileNumberError(""); setShowOtp(false); setOtp(new Array(OTP_LENGTH).fill("")); setOtpError(""); setOtpTimer(0); setMobileOtpVerified(false); } }; const isOtpComplete = otp.every((digit) => digit !== ""); // Simulated API OTP verification (replace with actual) const verifyOtpApi = async (mobile, otpValue) => { return new Promise((resolve, reject) => { setTimeout(() => { if (otpValue === "1234") resolve(true); else reject("Invalid OTP"); }, 1000); }); }; const handleOtpSubmit = async () => { if (!isOtpComplete) { setOtpError("Complete OTP is required"); return; } try { await verifyOtpApi(data.mobileNumber, otp.join("")); setMobileOtpVerified(true); setMobileNumberError(""); } catch (error) { setOtpError(error || "OTP verification failed"); } }; // file upload // const handleSubmit = async () => { // if (showOtp && !isOtpComplete) { // setOtpError("OTP is required and must be complete"); // return; // } // if (showOtp && !mobileOtpVerified) { // try { // await verifyOtpApi(data.mobileNumber, otp.join("")); // setMobileOtpVerified(true); // setOtpError(""); // onSubmitStep(); // console.log("OTP verified on submit"); // } catch (err) { // setOtpError(err || "OTP verification failed"); // } // return; // } // onSubmitStep(); // }; const handleSubmit = async () => { if (showOtp && !isOtpComplete) { setOtpError("OTP is required and must be complete"); return; } if (showOtp && !mobileOtpVerified) { try { await verifyOtpApi(data.mobileNumber, otp.join("")); setMobileOtpVerified(true); setOtpError(""); console.log("Submitting personal details:", data); // log here onSubmitStep(); console.log("OTP verified on submit"); } catch (err) { setOtpError(err || "OTP verification failed"); } return; } // no OTP or already verified console.log("Submitting personal details:", data); // log here onSubmitStep(); }; const formatTimer = (sec) => { const m = Math.floor(sec / 60) .toString() .padStart(2, "0"); const s = (sec % 60).toString().padStart(2, "0"); return `${m}:${s}`; }; const parseDobValue = data.dob ? new Date(data.dob) : null; return ( <>