diff --git a/server/package-lock.json b/server/package-lock.json index 9ac9d6b..9877c97 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -17,7 +17,7 @@ "jsonwebtoken": "^9.0.2", "mongoose": "^8.5.2", "nodemailer": "^6.9.14", - "nodemon": "^3.1.4", + "nodemon": "^3.1.10", "razorpay": "^2.9.4", "server": "file:" } @@ -1508,10 +1508,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", - "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", - "license": "MIT", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", "dependencies": { "chokidar": "^3.5.2", "debug": "^4", diff --git a/server/package.json b/server/package.json index 94f61f3..e249ac2 100644 --- a/server/package.json +++ b/server/package.json @@ -19,7 +19,7 @@ "jsonwebtoken": "^9.0.2", "mongoose": "^8.5.2", "nodemailer": "^6.9.14", - "nodemon": "^3.1.4", + "nodemon": "^3.1.10", "razorpay": "^2.9.4", "server": "file:" } diff --git a/src/Component/Auth/Loginform.jsx b/src/Component/Auth/Loginform.jsx index dfd473d..bf12156 100644 --- a/src/Component/Auth/Loginform.jsx +++ b/src/Component/Auth/Loginform.jsx @@ -28,7 +28,7 @@ const Logingform = () => { dispatch(signin(email, password, navigate)); } catch (error) { console.error("Login error:", error); - toast.error("An error occurred during login"); + toast.error("Login failed. Please check your credentials and try again."); } }; diff --git a/src/Component/Auth/Signupform.jsx b/src/Component/Auth/Signupform.jsx index 094cb23..75e0e39 100644 --- a/src/Component/Auth/Signupform.jsx +++ b/src/Component/Auth/Signupform.jsx @@ -11,8 +11,44 @@ const Signupform = () => { password: "", }); - const handleChange = (e) => - setFormData({ ...formData, [e.target.name]: e.target.value }); + const [passwordValidation, setPasswordValidation] = useState({ + minLength: false, + hasUppercase: false, + hasLowercase: false, + hasNumber: false, + hasSpecialChar: false, + }); + + const [showPassword, setShowPassword] = useState(false); + + const validatePassword = (password) => { + const validations = { + minLength: password.length >= 8, + hasUppercase: /[A-Z]/.test(password), + hasLowercase: /[a-z]/.test(password), + hasNumber: /\d/.test(password), + hasSpecialChar: /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password), + }; + setPasswordValidation(validations); + return Object.values(validations).every(Boolean); + }; + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + + if (name === "password") { + validatePassword(value); + } + }; + + const getPasswordStrength = () => { + const validCount = Object.values(passwordValidation).filter(Boolean).length; + if (validCount === 5) return { strength: "Strong", color: "text-green-600", bgColor: "bg-green-100" }; + if (validCount >= 3) return { strength: "Medium", color: "text-yellow-600", bgColor: "bg-yellow-100" }; + if (validCount >= 1) return { strength: "Weak", color: "text-red-600", bgColor: "bg-red-100" }; + return { strength: "Very Weak", color: "text-gray-600", bgColor: "bg-gray-100" }; + }; const navigate = useNavigate(); const dispatch = useDispatch(); @@ -25,14 +61,21 @@ const Signupform = () => { return toast.error("All fields are required"); } + // Validate password before submission + if (!validatePassword(password)) { + return toast.error("Password does not meet the required criteria."); + } + try { dispatch(signUp(username, email, password, navigate)); } catch (error) { console.error("Signup error:", error); - toast.error("An error occurred during signup"); + toast.error("Registration failed. Please try again."); } }; + const passwordStrength = getPasswordStrength(); + return (