From 46af1feb948c178dfc79fd99f92bb2c24cbc311c Mon Sep 17 00:00:00 2001 From: christina-baldwin Date: Thu, 21 Aug 2025 09:53:24 +0200 Subject: [PATCH 01/13] validation checks for registration form --- src/pages/Register.jsx | 50 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/pages/Register.jsx b/src/pages/Register.jsx index 0d5d825d..2ae746cc 100644 --- a/src/pages/Register.jsx +++ b/src/pages/Register.jsx @@ -10,18 +10,64 @@ const Register = () => { const handleRegister = async (e) => { e.preventDefault(); + // Trim input to remove accidental spaces + const trimmedUsername = username.trim(); + const trimmedEmail = email.trim(); + const trimmedPassword = password.trim(); + + // Validate username + const usernameRegex = /^[A-Za-z]+$/; // only letters + if (!trimmedUsername) { + setError("Username is required."); + return; + } + if (!usernameRegex.test(trimmedUsername)) { + setError("Username can only contain letters."); + return; + } + if (trimmedUsername.length < 3) { + setError("Username must be at least 3 characters long."); + return; + } + + // Validate email + const emailRegex = /^\S+@\S+\.\S+$/; + if (!trimmedEmail) { + setError("Email is required."); + return; + } + if (!emailRegex.test(trimmedEmail)) { + setError("Please enter a valid email address."); + return; + } + + // Validate password + if (!trimmedPassword) { + setError("Password is required."); + return; + } + if (trimmedPassword.length < 6) { + setError("Password must be at least 6 characters long."); + return; + } + try { const response = await fetch( "https://api-project-ns11.onrender.com/auth/signup", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ username, email, password }), + body: JSON.stringify({ + username: trimmedUsername, + email: trimmedEmail, + password: trimmedPassword, + }), } ); if (!response.ok) { - throw new Error("Registration failed"); + const data = await response.json(); + throw new Error(data.message || "Registration failed"); } alert("Registration successful!"); From 0409871fa5e83907ced9fdde5d34059f4b6b5623 Mon Sep 17 00:00:00 2001 From: christina-baldwin Date: Thu, 21 Aug 2025 09:55:09 +0200 Subject: [PATCH 02/13] removing notes --- src/pages/Register.jsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/pages/Register.jsx b/src/pages/Register.jsx index 2ae746cc..94b1e16b 100644 --- a/src/pages/Register.jsx +++ b/src/pages/Register.jsx @@ -10,12 +10,10 @@ const Register = () => { const handleRegister = async (e) => { e.preventDefault(); - // Trim input to remove accidental spaces const trimmedUsername = username.trim(); const trimmedEmail = email.trim(); const trimmedPassword = password.trim(); - // Validate username const usernameRegex = /^[A-Za-z]+$/; // only letters if (!trimmedUsername) { setError("Username is required."); @@ -30,7 +28,6 @@ const Register = () => { return; } - // Validate email const emailRegex = /^\S+@\S+\.\S+$/; if (!trimmedEmail) { setError("Email is required."); @@ -41,7 +38,6 @@ const Register = () => { return; } - // Validate password if (!trimmedPassword) { setError("Password is required."); return; From af03fe47f508e1b8d0c81c4da7cbfc8153247fc2 Mon Sep 17 00:00:00 2001 From: christina-baldwin Date: Thu, 21 Aug 2025 09:55:42 +0200 Subject: [PATCH 03/13] login validation --- src/pages/Login.jsx | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index f36b79bf..113b277b 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -10,6 +10,25 @@ const Login = () => { const handleLogin = async (e) => { e.preventDefault(); + + const trimmedEmail = email.trim(); + const trimmedPassword = password.trim(); + + const emailRegex = /^\S+@\S+\.\S+$/; + if (!trimmedEmail) { + setError("Email is required."); + return; + } + if (!emailRegex.test(trimmedEmail)) { + setError("Please enter a valid email address."); + return; + } + if (!trimmedPassword) { + setError("Password is required."); + return; + } + + setError(""); setIsLoading(true); try { @@ -18,7 +37,10 @@ const Login = () => { { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ email, password }), + body: JSON.stringify({ + email: trimmedEmail, + password: trimmedPassword, + }), } ); @@ -29,7 +51,6 @@ const Login = () => { } localStorage.setItem("token", data.token); - navigate("/app"); } catch (error) { setError(error.message); @@ -40,7 +61,7 @@ const Login = () => { return (
-
+

Log in

@@ -60,6 +81,7 @@ const Login = () => { id="email" className="mt-1 w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-pink-500 focus:outline-none focus:ring-1 focus:ring-pink-500" placeholder="you@example.com" + value={email} onChange={(e) => setEmail(e.target.value)} />
@@ -75,12 +97,13 @@ const Login = () => { id="password" className="mt-1 w-full rounded-md border border-gray-300 px-3 py-2 shadow-sm focus:border-pink-500 focus:outline-none focus:ring-1 focus:ring-pink-500" placeholder="••••••••" + value={password} onChange={(e) => setPassword(e.target.value)} />
From 96d450629d2bbefcc5d2da5062e956feefc3d4e7 Mon Sep 17 00:00:00 2001 From: christina-baldwin Date: Thu, 21 Aug 2025 11:15:44 +0200 Subject: [PATCH 04/13] getting the delete and update handlers to work --- src/components/Message.jsx | 38 +++++++++++++++++--------------------- src/pages/Main.jsx | 13 ++++++++++++- src/pages/Register.jsx | 2 +- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/components/Message.jsx b/src/components/Message.jsx index a820d446..0449eb92 100644 --- a/src/components/Message.jsx +++ b/src/components/Message.jsx @@ -64,36 +64,30 @@ const Message = ({ id, message, time, likes, onDelete, onUpdate }) => { } }; - const handleDelete = async () => { - try { - const response = await fetch( - `https://api-project-ns11.onrender.com/thoughts/${id}`, - { - method: "DELETE", - } - ); - - if (!response.ok) { - const data = await response.json(); - alert("Delete failed: " + data.message); - return; - } + const handleDelete = () => { + const confirmDelete = window.confirm( + "Are you sure you want to delete this message?" + ); + if (!confirmDelete) return; - onDelete(id); - } catch (error) { - console.error(error); - alert("Delete request failed"); - } + onDelete(id); }; const handleUpdate = async (newMessage) => { + if (!newMessage || newMessage.trim() === "") return; + try { + const token = localStorage.getItem("token"); + const response = await fetch( `https://api-project-ns11.onrender.com/thoughts/${id}`, { method: "PATCH", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ message: newMessage }), + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify({ newMessage }), } ); @@ -160,6 +154,8 @@ const Message = ({ id, message, time, likes, onDelete, onUpdate }) => {