diff --git a/src/feature/AdvancedDropzone.jsx b/src/feature/AdvancedDropzone.jsx index d0bb5f8..d7c42ab 100644 --- a/src/feature/AdvancedDropzone.jsx +++ b/src/feature/AdvancedDropzone.jsx @@ -1,4 +1,6 @@ import React from "react"; +import ArrowLeftIcon from "@mui/icons-material/ArrowLeft"; +import ArrowRightIcon from "@mui/icons-material/ArrowRight"; import { Dropzone, FileMosaic, @@ -13,6 +15,7 @@ const AdvancedDropzone = ({ value, onChange }) => { const [extFiles, setExtFiles] = React.useState(value || []); const [imageSrc, setImageSrc] = React.useState(undefined); const [videoSrc, setVideoSrc] = React.useState(undefined); + const [hoveredId, setHoveredId] = React.useState(null); const updateFiles = (incomingFiles) => { console.log("incoming files", incomingFiles); @@ -53,6 +56,17 @@ const AdvancedDropzone = ({ value, onChange }) => { ); }; + const moveFile = (fromIndex, toIndex) => { + setExtFiles((prev) => { + if (toIndex < 0 || toIndex >= prev.length) return prev; + const updated = [...prev]; + const [moved] = updated.splice(fromIndex, 1); + updated.splice(toIndex, 0, moved); + onChange && onChange(updated); + return updated; + }); + }; + return ( <> { uploadButton: {}, }} > - {extFiles.map((file) => ( - ( +
+ style={{ + position: "relative", + display: "inline-block", + marginBottom: 12, + }} + onMouseEnter={() => setHoveredId(file.id)} + onMouseLeave={() => setHoveredId(null)} + > + + {hoveredId === file.id && ( +
+ + + {file.name} + + +
+ )} +
))}
diff --git a/src/feature/PersonalDetailsForm.jsx b/src/feature/PersonalDetailsForm.jsx index 1e1acc4..02040dc 100644 --- a/src/feature/PersonalDetailsForm.jsx +++ b/src/feature/PersonalDetailsForm.jsx @@ -13,8 +13,11 @@ import { Typography, Link, InputAdornment, + IconButton, } from "@mui/material"; import CheckCircleIcon from "@mui/icons-material/CheckCircle"; +import Visibility from "@mui/icons-material/Visibility"; +import VisibilityOff from "@mui/icons-material/VisibilityOff"; import AdvancedDropzone from "./AdvancedDropzone"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import toast from "react-hot-toast"; @@ -44,6 +47,8 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { const [otpError, setOtpError] = useState(""); const [mobileOtpVerified, setMobileOtpVerified] = useState(false); const [mobileNumberError, setMobileNumberError] = useState(""); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); const sendOtp = useSendOtp(); const verifyOtp = useVerifyOtp(); @@ -102,7 +107,7 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { const raw = cityQuery.data; if (!raw) return []; if (Array.isArray(raw)) return raw; - return raw.city || raw.district || raw.data || []; + return raw.subCaste || raw.district || raw.data || []; }, [cityQuery.data]); const starOptions = useMemo(() => { @@ -194,9 +199,10 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { const res = await sendOtp.mutateAsync(data.mobileNumber); const successMessage = res?.message || + res?.otp || res?.status || "OTP sent successfully"; - toast.success(successMessage); + toast.success(successMessage, { position: "top-right" }); setShowOtp(true); resetOtp(); setMobileOtpVerified(false); @@ -207,7 +213,7 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { error?.response?.data?.otp || error?.message || "Failed to send OTP"; - toast.error(message); + toast.error(message, { position: "top-right" }); } }; @@ -251,20 +257,21 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { }); const successMessage = res?.message || + res?.otp || res?.status || "OTP verified successfully"; - toast.success(successMessage); + toast.success(successMessage, { position: "top-right" }); setMobileOtpVerified(true); setMobileNumberError(""); setOtpError(""); } catch (error) { const message = - error?.response?.data?.otp || error?.response?.data?.message || + error?.response?.data?.otp || error?.message || "Invalid or expired OTP"; setOtpError(message); - toast.error(message); + toast.error(message, { position: "top-right" }); } }; @@ -506,7 +513,7 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { {otpTimer > 0 ? ( - formatTimer(otpTimer) + ` ${formatTimer(otpTimer) } Seconds` ) : ( { {otpError && ( - + {otpError} )} @@ -925,13 +932,26 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { handleChange("password", e.target.value)} error={Boolean(errors.password)} helperText={errors.password} + InputProps={{ + endAdornment: ( + + setShowPassword((prev) => !prev)} + edge="end" + aria-label="toggle password visibility" + > + {showPassword ? : } + + + ), + }} variant="outlined" /> @@ -943,13 +963,26 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { handleChange("confirmPassword", e.target.value)} error={Boolean(errors.confirmPassword)} helperText={errors.confirmPassword} + InputProps={{ + endAdornment: ( + + setShowConfirmPassword((prev) => !prev)} + edge="end" + aria-label="toggle confirm password visibility" + > + {showConfirmPassword ? : } + + + ), + }} variant="outlined" /> @@ -1022,7 +1055,7 @@ const PersonalDetailsForm = ({ onSubmitStep, errors }) => { > {cityOptions.map((city) => ( - {getOptionLabel(city, "City")} + {getOptionLabel(city.district_name, "City")} ))}