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 ( <>
{/* Name */}
handleChange("name", e.target.value)} error={Boolean(errors.name)} helperText={errors.name} placeholder="Enter Name" variant="outlined" />
{/* Gender */}
Gender {errors.gender && (

{errors.gender}

)}
{/* Mobile Number and Send OTP Button */}
handleChange("mobileNumber", e.target.value)} error={ Boolean(errors.mobileNumber) || Boolean(mobileNumberError) } helperText={mobileNumberError || errors.mobileNumber} placeholder="Enter Mobile Number" inputProps={{ maxLength: 10 }} variant="outlined" disabled={mobileOtpVerified} // sx={{ maxWidth: "430px" }} /> {!showOtp && !mobileOtpVerified && ( )}
{/* OTP Inputs */}
{showOtp && !mobileOtpVerified && ( <> {otp.map((digit, index) => ( handleOtpChange(index, e.target.value)} error={Boolean(otpError)} autoFocus={index === 0} variant="outlined" /> ))} {otpTimer > 0 ? ( formatTimer(otpTimer) ) : ( 0} > Resend OTP )} {otpError && ( {otpError} )} )} {mobileOtpVerified && ( Mobile number verified )}
{/* Other fields like DOB, height, marital status, etc. */} {/* Your other inputs here */} {/* DOB */} {/*
handleChange("dob", e.target.value)} error={Boolean(errors.dob)} helperText={errors.dob} InputLabelProps={{ shrink: true }} variant="outlined" />
*/} {/* DOB with MUI DatePicker */}
{ let formatted = ""; if (value instanceof Date && !isNaN(value)) { const y = value.getFullYear(); const m = String(value.getMonth() + 1).padStart(2, "0"); const d = String(value.getDate()).padStart(2, "0"); formatted = `${y}-${m}-${d}`; } handleChange("dob", formatted); }} slotProps={{ textField: { fullWidth: true, error: Boolean(errors.dob), helperText: errors.dob, }, }} />
{/* Height */}
handleChange("height", e.target.value)} error={Boolean(errors.height)} helperText={errors.height} variant="outlined" />
{/* Weight */}
handleChange("weight", e.target.value)} error={Boolean(errors.weight)} helperText={errors.weight} variant="outlined" />
{/* Marital Status */}
Select Marital Status {errors.maritalStatus && ( {errors.maritalStatus} )}
{/* Religion */}
Select Religion {errors.religion && ( {errors.religion} )}
{/* Caste / Community */}
Select Caste / Community {errors.caste && ( {errors.caste} )}
{/* Sub-Caste (optional) */}
Select Sub-Caste (optional)
{/* Gothram (optional) */}
Select Gothram (optional)
{/* Blood Group (optional) */}
Select Blood Group (optional)
{/* Email Id */}
handleChange("email", e.target.value)} error={Boolean(errors.email)} helperText={errors.email} variant="outlined" />
{/* State */}
Select State {errors.state && ( {errors.state} )}
{/* City */}
Select City {errors.city && ( {errors.city} )}
{/* Pin code */}
handleChange("pincode", e.target.value)} error={Boolean(errors.pincode)} helperText={errors.pincode} inputProps={{ maxLength: 6 }} variant="outlined" />
{/* Upload Profile (UI only) */} {/*

Upload PDF, IMG, JPG

*/}
{ // if you want to keep in Redux as plain metadata dispatch(updatePersonalDetails({ profiles: files })); }} />
); }; export default PersonalDetailsForm;