diff --git a/src/pages/Signup/Signup.tsx b/src/pages/Signup/Signup.tsx index 2ac51dcc..b8102a9d 100644 --- a/src/pages/Signup/Signup.tsx +++ b/src/pages/Signup/Signup.tsx @@ -20,22 +20,32 @@ const SignUp: React.FC = () => { email: "", password: "", }); - const [message, setMessage] = useState(""); + + const [message, setMessage] = useState(""); + const [showPassword, setShowPassword] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [errors, setErrors] = useState({ username: "", email: "", password: "", }); - const [showPassword, setShowPassword] = useState(false); - const [isLoading, setIsLoading] = useState(false); + const navigate = useNavigate(); + const themeContext = useContext(ThemeContext) as ThemeContextType; const { mode } = themeContext; const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; - setFormData({ ...formData, [name]: value }); + + setFormData((prev) => ({ + ...prev, + [name]: value, + })); + let errorMessage = ""; + if (name === "username") { if (!value.trim()) { errorMessage = "Username is required"; @@ -43,6 +53,7 @@ const SignUp: React.FC = () => { errorMessage = "Only letters are allowed"; } } + if (name === "email") { if (!value.trim()) { errorMessage = "Email is required"; @@ -50,191 +61,320 @@ const SignUp: React.FC = () => { errorMessage = "Enter a valid email"; } } + 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 })); + + setErrors((prev) => ({ + ...prev, + [name]: errorMessage, + })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); + const usernameError = !formData.username.trim() ? "Username is required" : !/^[A-Za-z\s]+$/.test(formData.username) - ? "Only letters are allowed" - : ""; + ? "Only letters are allowed" + : ""; + 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, ); - setMessage(response.data.message); // Show success message from backend - // Navigate to login page after successful signup - if (response.data.message === 'User created successfully') { + setMessage(response.data.message); + + 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); } }; + const inputClass = ` + w-full + pl-12 + pr-4 + py-4 + rounded-xl + bg-slate-900 + border + border-slate-700 + text-white + placeholder-slate-500 + transition-all + duration-200 + focus:outline-none + focus:ring-2 + focus:ring-cyan-500 + focus:border-cyan-500 + focus:bg-slate-800 + `; + return (
-
-
-
-
-
+ {/* Background Grid */} +
+ + {/* Blue Glow Effects */} +
+
+
-
+
+ {/* Logo Section */} -
- Logo +
+ GitHub Tracker
-

GitHubTracker

-

Join your GitHub journey

+ +

GitHubTracker

+ +

+ Build insights from every contribution. +

+ {/* Signup Card */} - -

- Create Account +

+ Create Your Account

-
+

+ Track GitHub activity, analyze contribution trends, and gain + actionable insights into repository engagement and developer + productivity. +

+ + + {/* Username */}
-
-
- +
+
+
-
- {errors.username &&

{errors.username}

} + + {errors.username && ( +

{errors.username}

+ )}
+ {/* Email */}
-
-
- +
+
+
-
- {errors.email &&

{errors.email}

} + + {errors.email && ( +

{errors.email}

+ )}
+ {/* Password */}
-
-
- +
+
+
- -
- {errors.password &&

{errors.password}

} + + {errors.password && ( +

{errors.password}

+ )}
+ {/* Submit */} {message && ( -
+
{message}
)}
-

+

Already have an account?{" "} - + Sign in here

- -
); };