From fbbffc9bd0eabd545a385b256d0f092b77fafd7c Mon Sep 17 00:00:00 2001 From: Harendra Godara Date: Sat, 30 May 2026 11:18:59 +0530 Subject: [PATCH] fix: allow valid GitHub usernames with hyphens and numbers --- src/pages/Signup/Signup.tsx | 126 +++++++++++++++++++++++++++--------- 1 file changed, 94 insertions(+), 32 deletions(-) diff --git a/src/pages/Signup/Signup.tsx b/src/pages/Signup/Signup.tsx index 2ac51dcc..1ddc2381 100644 --- a/src/pages/Signup/Signup.tsx +++ b/src/pages/Signup/Signup.tsx @@ -39,8 +39,8 @@ const SignUp: React.FC = () => { if (name === "username") { if (!value.trim()) { errorMessage = "Username is required"; - } else if (!/^[A-Za-z\s]+$/.test(value)) { - errorMessage = "Only letters are allowed"; + } else if (!/^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$/.test(value)) { + errorMessage = "Enter a valid GitHub username"; } } if (name === "email") { @@ -53,8 +53,11 @@ const SignUp: React.FC = () => { if (name === "password") { if (!value.trim()) { errorMessage = "Password is required"; - } else if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/.test(value)) { - errorMessage = "Password must be 8+ characters with letters and numbers"; + } else if ( + !/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/.test(value) + ) { + errorMessage = + "Password must be 8+ characters with letters and numbers"; } } setErrors((prev) => ({ ...prev, [name]: errorMessage })); @@ -64,36 +67,46 @@ const SignUp: React.FC = () => { e.preventDefault(); const usernameError = !formData.username.trim() ? "Username is required" - : !/^[A-Za-z\s]+$/.test(formData.username) - ? "Only letters are allowed" - : ""; + : !/^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$/.test(formData.username) + ? "Enter a valid GitHub username" + : ""; const emailError = !formData.email.trim() ? "Email is required" : !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email.trim()) - ? "Enter a valid email" - : ""; + ? "Enter a valid email" + : ""; const passwordError = !formData.password.trim() ? "Password is required" - : !/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/.test(formData.password) - ? "Password must be 8+ characters with letters and numbers" - : ""; + : !/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*#?&]{8,}$/.test( + formData.password, + ) + ? "Password must be 8+ characters with letters and numbers" + : ""; if (usernameError || emailError || passwordError) { - setErrors({ username: usernameError, email: emailError, password: passwordError }); + setErrors({ + username: usernameError, + email: emailError, + password: passwordError, + }); return; } setIsLoading(true); try { - const response = await axios.post(`${backendUrl}/api/auth/signup`, - formData // Include cookies for session + const response = await axios.post( + `${backendUrl}/api/auth/signup`, + formData, // Include cookies for session ); setMessage(response.data.message); // Show success message from backend // Navigate to login page after successful signup - if (response.data.message === 'User created successfully') { + if (response.data.message === "User created successfully") { navigate("/login"); } } catch (error: any) { - setMessage(error.response?.data?.message || "Something went wrong. Please try again."); + setMessage( + error.response?.data?.message || + "Something went wrong. Please try again.", + ); } finally { setIsLoading(false); } @@ -138,10 +151,22 @@ const SignUp: React.FC = () => { className="text-center mb-10" >
- Logo + Logo
-

GitHubTracker

-

Join your GitHub journey

+

+ GitHubTracker +

+

+ Join your GitHub journey +

{ : "bg-white border-gray-200 text-black" }`} > -

{
- - {errors.username &&

{errors.username}

} + {errors.username && ( +

{errors.username}

+ )}
@@ -181,11 +213,19 @@ const SignUp: React.FC = () => {
-
- {errors.email &&

{errors.email}

} + {errors.email && ( +

{errors.email}

+ )}
@@ -193,15 +233,32 @@ const SignUp: React.FC = () => {
- -
- {errors.password &&

{errors.password}

} + {errors.password && ( +

{errors.password}

+ )}