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 (
@@ -46,6 +89,7 @@ const Signupform = () => { placeholder="you@example.com" value={formData.email} onChange={handleChange} + required />
@@ -60,6 +104,7 @@ const Signupform = () => { placeholder="your_username" value={formData.username} onChange={handleChange} + required /> @@ -67,19 +112,67 @@ const Signupform = () => { - +
+ + +
+ + {/* Password Strength Indicator */} + {formData.password && ( +
+
+ Password Strength: + + {passwordStrength.strength} + +
+
+

Password Requirements:

+
    +
  • + {passwordValidation.minLength ? '✅' : '❌'} + At least 8 characters +
  • +
  • + {passwordValidation.hasUppercase ? '✅' : '❌'} + At least 1 uppercase letter (A-Z) +
  • +
  • + {passwordValidation.hasLowercase ? '✅' : '❌'} + At least 1 lowercase letter (a-z) +
  • +
  • + {passwordValidation.hasNumber ? '✅' : '❌'} + At least 1 number (0-9) +
  • +
  • + {passwordValidation.hasSpecialChar ? '✅' : '❌'} + At least 1 special character (!@#$%^&*) +
  • +
+
+
+ )} diff --git a/src/service/apiConnector.jsx b/src/service/apiConnector.jsx index 93ab238..7f10b28 100644 --- a/src/service/apiConnector.jsx +++ b/src/service/apiConnector.jsx @@ -4,6 +4,14 @@ export const axiosInstance = axios.create({}); export const apiConnector = async (method, url, bodyData, headers, params) => { try { + console.log("Making API request:", { + method, + url, + bodyData, + headers, + params + }); + const response = await axiosInstance({ method: `${method}`, url: `${url}`, @@ -11,9 +19,17 @@ export const apiConnector = async (method, url, bodyData, headers, params) => { headers: headers ? headers : null, params: params ? params : null, }); + + console.log("API response:", response); return response; } catch (error) { console.error("API Connector Error:", error); + console.error("Error details:", { + message: error.message, + code: error.code, + response: error.response, + request: error.request + }); throw error; } }; diff --git a/src/service/apis.jsx b/src/service/apis.jsx index aa04359..1e00860 100644 --- a/src/service/apis.jsx +++ b/src/service/apis.jsx @@ -1,28 +1,33 @@ const BASE_URL = import.meta.env.VITE_BASE_URL; +console.log("Environment variables:", { + VITE_BASE_URL: import.meta.env.VITE_BASE_URL, + BASE_URL: BASE_URL +}); + export const authEndpoits = { - SIGNUP_API: `${BASE_URL}/user/signup`, - SIGNIN_API: `${BASE_URL}/user/signin`, + SIGNUP_API: `${BASE_URL}/api/user/signup`, + SIGNIN_API: `${BASE_URL}/api/user/signin`, }; export const BlogEndpoints = { - GET_BLOGS: `${BASE_URL}/blog/blogs`, - CREATE_BLOG: `${BASE_URL}/blog/create`, - GET_BLOG: `${BASE_URL}/blog/blogdel:id`, + GET_BLOGS: `${BASE_URL}/api/blog/blogs`, + CREATE_BLOG: `${BASE_URL}/api/blog/create`, + GET_BLOG: `${BASE_URL}/api/blog/blogdel:id`, }; export const OrderEndpoints = { - CREATE_ORDER: `${BASE_URL}/order/createOrder`, - CANCEL_ORDER: `${BASE_URL}/order/cancel:id`, + CREATE_ORDER: `${BASE_URL}/api/order/createOrder`, + CANCEL_ORDER: `${BASE_URL}/api/order/cancel:id`, }; export const PaymentEndpoints = { - CREATE_PAYMENT: `${BASE_URL}/payment/createPayment`, - VERIFY_PAYMENT: `${BASE_URL}/payment/verifyPayment`, + CREATE_PAYMENT: `${BASE_URL}/api/payment/createPayment`, + VERIFY_PAYMENT: `${BASE_URL}/api/payment/verifyPayment`, }; export const PlantsEndpoints = { - GET_PLANTS: `${BASE_URL}/plants/getAllplants`, - ADD_PLANT: `${BASE_URL}/plants/addPlant`, - GET_PLANT: `${BASE_URL}/plants/getplant`, + GET_PLANTS: `${BASE_URL}/api/plants/getAllplants`, + ADD_PLANT: `${BASE_URL}/api/plants/addPlant`, + GET_PLANT: `${BASE_URL}/api/plants/getplant`, }; diff --git a/src/service/oprations/authApi.jsx b/src/service/oprations/authApi.jsx index 0cd6e7f..77194b0 100644 --- a/src/service/oprations/authApi.jsx +++ b/src/service/oprations/authApi.jsx @@ -27,13 +27,13 @@ export function signUp(username, email, password, navigate) { } ); - toast.success("Signup Successfully"); + toast.success("Registration complete! You can now log in."); navigate("/signin"); } catch (error) { console.log(error); - toast.error(error.response?.data?.error || "An error occurred"); + toast.error(error.response?.data?.error || error.response?.data?.message || "Registration failed. Please try again."); } finally { dispatch(setLoading(false)); } @@ -54,11 +54,11 @@ export function signin(email, password, navigate) { dispatch(setToken(response.data.token)); localStorage.setItem("token", response.data.token); dispatch(setIslogin(true)); - toast.success("Logged In"); + toast.success("Login successful! Welcome🎉"); navigate("/"); } catch (error) { console.log(error); - toast.error(error.response?.data?.message || "An error occurred"); + toast.error(error.response?.data?.message || "Login failed. Please check your credentials and try again."); } finally { dispatch(setLoading(false)); } @@ -70,8 +70,8 @@ export function logout() { try { dispatch(setToken(null)); dispatch(setIslogin(null)); - localStorage.getItem("token", ""); - toast.success("Log Out"); + localStorage.removeItem("token"); + toast.success("You've been logged out successfully."); } catch (error) { console.log(error); toast.error("Internal Server Error While Log out");