From 0068bc5dc6def15b49db4e6355334ed44a8b928f Mon Sep 17 00:00:00 2001 From: Kiran95021 Date: Sun, 11 Jan 2026 11:57:46 +0530 Subject: [PATCH] feat: implement secure user registration with validation and error handling #128 --- src/App.tsx | 10 ++-- src/pages/Register.tsx | 106 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 src/pages/Register.tsx diff --git a/src/App.tsx b/src/App.tsx index a7ce4ed6..e5fe288c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,25 +6,27 @@ import PostPage from './pages/PostPage.tsx' import CreateCommunityPage from './pages/CreateCommunityPage.tsx' import {CommunityPage} from './pages/CommunityPage.tsx' import { CommunitiesPage } from './pages/CommunitiesPage.tsx' +import Register from './pages/Register.tsx' // Import the new page function App() { return ( <> -
+
-
+
} /> + } /> {/* New Security-focused route */} } /> } /> } /> } /> } /> -
+
) } -export default App +export default App \ No newline at end of file diff --git a/src/pages/Register.tsx b/src/pages/Register.tsx new file mode 100644 index 00000000..fbd44b16 --- /dev/null +++ b/src/pages/Register.tsx @@ -0,0 +1,106 @@ +import { useState } from "react"; +import { useNavigate, Link } from "react-router-dom"; +import { supabase } from "../supabase-client"; +import { AlertCircle, CheckCircle2 } from "lucide-react"; + +const Register = () => { + const navigate = useNavigate(); + const [loading, setLoading] = useState(false); + const [errors, setErrors] = useState>({}); + const [serverError, setServerError] = useState(""); + + const [formData, setFormData] = useState({ + fullName: "", + email: "", + password: "", + }); + + const validate = () => { + const newErrors: Record = {}; + if (formData.fullName.length < 2) newErrors.fullName = "Name must be at least 2 characters."; + if (!/\S+@\S+\.\S+/.test(formData.email)) newErrors.email = "Valid email is required."; + if (formData.password.length < 6) newErrors.password = "Password must be at least 6 characters."; + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleRegister = async (e: React.FormEvent) => { + e.preventDefault(); + setServerError(""); + if (!validate()) return; + + setLoading(true); + const { data, error } = await supabase.auth.signUp({ + email: formData.email, + password: formData.password, + options: { + data: { full_name: formData.fullName } + } + }); + + if (error) { + // Handles the "Duplicate Check" requirement (400 error equivalent) + setServerError(error.message); + setLoading(false); + } else { + // Standardized success feedback + alert("Registration successful! Please check your email for verification."); + navigate("/"); + } + }; + + return ( +
+

Create Account

+ + {serverError && ( +
+ {serverError} +
+ )} + +
+
+ + setFormData({...formData, fullName: e.target.value})} + /> + {errors.fullName &&

{errors.fullName}

} +
+ +
+ + setFormData({...formData, email: e.target.value})} + /> + {errors.email &&

{errors.email}

} +
+ +
+ + setFormData({...formData, password: e.target.value})} + /> + {errors.password &&

{errors.password}

} +
+ + +
+
+ ); +}; + +export default Register;