From 8b90c74f9642cbdb29d1e8b9030a352013bc94fa Mon Sep 17 00:00:00 2001 From: Rimsha Shafique Date: Fri, 31 Jul 2026 17:02:05 +0500 Subject: [PATCH 1/2] Add form validation to login (fixes #102) --- devboard/client/src/pages/Login.jsx | 37 ++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/devboard/client/src/pages/Login.jsx b/devboard/client/src/pages/Login.jsx index 16c62e3..b51d1d0 100644 --- a/devboard/client/src/pages/Login.jsx +++ b/devboard/client/src/pages/Login.jsx @@ -19,6 +19,12 @@ const Login = () => { const handleSubmit = async () => { setError(""); + + if (isRegister && !form.name.trim()) return setError("Name is required"); + if (!form.email.includes("@")) return setError("Enter a valid email"); + if (form.password.length < 6) + return setError("Password must be at least 6 characters"); + if (!form.email || !form.password || (isRegister && !form.name)) { setError("Please fill in all required fields"); return; @@ -27,9 +33,13 @@ const Login = () => { setLoading(true); try { const endpoint = isRegister ? "/api/auth/register" : "/api/auth/login"; - + const payload = isRegister - ? { name: form.name.trim(), email: form.email.trim(), password: form.password } + ? { + name: form.name.trim(), + email: form.email.trim(), + password: form.password, + } : { email: form.email.trim(), password: form.password }; const { data } = await axios.post(endpoint, payload); @@ -42,9 +52,12 @@ const Login = () => { // 2. Clear error & Direct Navigate to Dashboard Route "/" setError(""); navigate("/", { replace: true }); // <-- 3. Router navigate call! - } catch (err) { - setError(err.response?.data?.message || err.response?.data?.error || "Something went wrong"); + setError( + err.response?.data?.message || + err.response?.data?.error || + "Something went wrong", + ); } finally { setLoading(false); } @@ -61,7 +74,9 @@ const Login = () => {
🗂️

DevBoard

-

Kanban built for developers

+

+ Kanban built for developers +

@@ -108,7 +123,11 @@ const Login = () => { disabled={loading} className="w-full py-2.5 bg-purple-600 hover:bg-purple-500 text-white rounded-lg text-sm font-medium transition disabled:opacity-40" > - {loading ? "Please wait..." : isRegister ? "Create Account" : "Sign In"} + {loading + ? "Please wait..." + : isRegister + ? "Create Account" + : "Sign In"}
@@ -124,4 +145,4 @@ const Login = () => { ); }; -export default Login; \ No newline at end of file +export default Login; From c1be47881f2618f5f1e60a993d0a43dd33284ac1 Mon Sep 17 00:00:00 2001 From: Rimsha Shafique Date: Fri, 31 Jul 2026 17:04:05 +0500 Subject: [PATCH 2/2] Update package-lock.json --- devboard/client/package-lock.json | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/devboard/client/package-lock.json b/devboard/client/package-lock.json index 3cbf7c2..1976f37 100644 --- a/devboard/client/package-lock.json +++ b/devboard/client/package-lock.json @@ -68,6 +68,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -895,8 +896,7 @@ "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.30", @@ -1096,6 +1096,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -1297,8 +1298,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", @@ -1895,6 +1895,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -2209,6 +2210,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -2415,6 +2417,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -2427,6 +2430,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -2567,6 +2571,7 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.9.2" } @@ -2852,6 +2857,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2941,6 +2947,7 @@ "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27",