diff --git a/ipi-survey-platform/src/pages/ChangePassword/ChangePassword.jsx b/ipi-survey-platform/src/pages/ChangePassword/ChangePassword.jsx index 2c1213f..4f7bda2 100644 --- a/ipi-survey-platform/src/pages/ChangePassword/ChangePassword.jsx +++ b/ipi-survey-platform/src/pages/ChangePassword/ChangePassword.jsx @@ -4,6 +4,52 @@ import apiClient from '@/services/api/apiClient'; const logoSrc = '/assets/images/FCSCLogo.svg'; +const ToggleableInput = ({ label, type = "password", value, onChange, show, toggleShow, placeholder }) => ( +
If you cannot read the code, click "Refresh" or type:{" "} diff --git a/ipi-survey-platform/src/pages/PublicContactForm.jsx b/ipi-survey-platform/src/pages/PublicContactForm.jsx index 26a120b..606715e 100644 --- a/ipi-survey-platform/src/pages/PublicContactForm.jsx +++ b/ipi-survey-platform/src/pages/PublicContactForm.jsx @@ -11,9 +11,6 @@ const PublicContactForm = () => { establishmentName: "", establishmentId: "", email: "", - // contactName: "", - // contactPhone: "", - // notes: "", }); const [errors, setErrors] = useState({}); @@ -28,6 +25,9 @@ const PublicContactForm = () => { const [otp, setOtp] = useState(""); const [otpMsg, setOtpMsg] = useState(""); const [otpError, setOtpError] = useState(""); + const [toast, setToast] = useState(null); + + const toastTimeoutRef = React.useRef(null); const generateCaptcha = () => { const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; @@ -42,6 +42,35 @@ const PublicContactForm = () => { generateCaptcha(); }, []); + useEffect(() => { + return () => { + if (toastTimeoutRef.current) { + window.clearTimeout(toastTimeoutRef.current); + } + }; + }, []); + + const showToast = (type, message) => { + if (!message) return; + if (toastTimeoutRef.current) { + window.clearTimeout(toastTimeoutRef.current); + toastTimeoutRef.current = null; + } + setToast({ type, message }); + toastTimeoutRef.current = window.setTimeout(() => { + setToast(null); + toastTimeoutRef.current = null; + }, 4000); + }; + + const closeToast = () => { + if (toastTimeoutRef.current) { + window.clearTimeout(toastTimeoutRef.current); + toastTimeoutRef.current = null; + } + setToast(null); + }; + const validate = (data = formData) => { const newErrors = {}; @@ -49,33 +78,12 @@ const PublicContactForm = () => { if (!data.email.trim()) newErrors.email = "Registered Email is required."; else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email)) newErrors.email = "Enter a valid email address."; - // if (!data.contactName.trim()) newErrors.contactName = "Contact Person Name is required."; - // if (!data.contactPhone.trim()) { - // newErrors.contactPhone = "Contact Phone is required."; - // } else if (!/^\d{10,12}$/.test(data.contactPhone)) { - // newErrors.contactPhone = "Enter a valid phone number (10–12 digits)."; - // } setErrors(newErrors); setIsValid(Object.keys(newErrors).length === 0); return newErrors; }; -// const handleNameChange = (e) => { -// const { value } = e.target; -// const filtered = value.replace(/[^A-Za-z\s]/g, ""); -// setFormData((prev) => ({ ...prev, contactName: filtered })); -// validate({ ...formData, contactName: filtered }); -// }; - -// const handlePhoneChange = (e) => { -// let { value } = e.target; -// value = value.replace(/\D/g, ""); -// if (value.length > 12) value = value.slice(0, 12); -// setFormData((prev) => ({ ...prev, contactPhone: value })); -// validate({ ...formData, contactPhone: value }); -// }; - const handleChange = (e) => { const { name, value } = e.target; const updated = { ...formData, [name]: value }; @@ -113,9 +121,12 @@ const PublicContactForm = () => { const response = await apiClient.post("/forgot-password/request-otp", payload); if (response?.data) { - navigate("/change-password", { - state: { email: formData.email.trim() }, - }); + showToast('success', 'OTP sent to your registered email successfully!'); + setTimeout(() => { + navigate("/change-password", { + state: { email: formData.email.trim() }, + }); + }, 1500); } else { setErrorMsg("Something went wrong. Please try again."); } @@ -165,7 +176,6 @@ const PublicContactForm = () => { setLoading(false); } }; - const handleResendOtp = () => { setOtpMsg("A new OTP has been sent to your registered email."); @@ -174,6 +184,29 @@ const PublicContactForm = () => { return (
- If you cannot read the code, click "Refresh" or type:{" "} - {captcha} -
+ If you cannot read the code, click "Refresh" or type:{" "} + {captcha} +