@@ -20,6 +20,7 @@ const Messages = ({ messages, onDelete, onUpdate }) => {
likes={message.hearts}
onDelete={onDelete}
onUpdate={onUpdate}
+ onUpdateLike={onUpdateLike}
/>
))}
diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx
index f36b79bf..e866bf6a 100644
--- a/src/pages/Login.jsx
+++ b/src/pages/Login.jsx
@@ -1,6 +1,9 @@
import { useState } from "react";
import { Link, useNavigate } from "react-router-dom";
+const url = "https://api-project-ns11.onrender.com";
+// const url = "http://localhost:8080";
+
const Login = () => {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
@@ -10,17 +13,36 @@ 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 {
- const response = await fetch(
- "https://api-project-ns11.onrender.com/auth/login",
- {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ email, password }),
- }
- );
+ const response = await fetch(`${url}/auth/login`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ email: trimmedEmail,
+ password: trimmedPassword,
+ }),
+ });
const data = await response.json();
@@ -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)}
/>
diff --git a/src/pages/Main.jsx b/src/pages/Main.jsx
index d59721c7..77a5b65a 100644
--- a/src/pages/Main.jsx
+++ b/src/pages/Main.jsx
@@ -5,6 +5,9 @@ import Form from "../components/Form";
import LikedMessages from "../components/LikedMessages";
import Messages from "../components/Messages";
+const url = "https://api-project-ns11.onrender.com";
+// const url = "http://localhost:8080";
+
const Main = () => {
const [messages, setMessages] = useState([]);
const navigate = useNavigate();
@@ -15,11 +18,12 @@ const Main = () => {
navigate("/login");
return;
}
+
+ console.log("Hello from the useEffect:", token);
+
const fetchMessages = async () => {
try {
- const response = await fetch(
- "https://api-project-ns11.onrender.com/thoughts"
- );
+ const response = await fetch(`${url}/thoughts`);
if (!response.ok) {
throw new Error("Failed to fetch messages");
}
@@ -40,41 +44,49 @@ const Main = () => {
try {
const token = localStorage.getItem("token");
- const response = await fetch(
- `https://api-project-ns11.onrender.com/thoughts/${thoughtId}`,
- {
- method: "DELETE",
- headers: {
- Authorization: `Bearer ${token}`,
- },
- }
- );
+ console.log("Token before DELETE:", token);
+
+ const response = await fetch(`${url}/thoughts/${thoughtId}`, {
+ method: "DELETE",
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ credentials: "include",
+ });
if (!response.ok) {
- throw new Error("Failed to delete message");
+ let errorMessage = "Failed to delete message";
+ try {
+ const data = await response.json();
+ if (data?.message) errorMessage = data.message;
+ } catch (err) {
+ console.warn("No JSON returned from delete response:", err);
+ }
+ alert(errorMessage);
+ return;
}
setMessages((prev) => prev.filter((msg) => msg._id !== thoughtId));
} catch (error) {
console.error("Error deleting message:", error);
+ alert("Delete request failed");
}
};
const handleUpdate = async (thoughtId, newMessage) => {
- try {
- const token = localStorage.getItem("token");
+ const token = localStorage.getItem("token");
+ console.log("Token before PATCH:", token);
- const response = await fetch(
- `https://api-project-ns11.onrender.com/thoughts/${thoughtId}`,
- {
- method: "PATCH",
- headers: {
- "Content-Type": "application/json",
- Authorization: `Bearer ${token}`,
- },
- body: JSON.stringify({ message: newMessage }),
- }
- );
+ try {
+ const response = await fetch(`${url}/thoughts/${thoughtId}`, {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify({ message: newMessage }),
+ credentials: "include",
+ });
if (!response.ok) {
throw new Error("Failed to update message");
@@ -99,6 +111,16 @@ const Main = () => {
navigate("/");
};
+ const handleUpdateLike = (thoughtId, newLikedBy, newHearts) => {
+ setMessages((prev) =>
+ prev.map((msg) =>
+ msg._id === thoughtId
+ ? { ...msg, likedBy: newLikedBy, hearts: newHearts }
+ : msg
+ )
+ );
+ };
+
return (
@@ -117,9 +139,10 @@ const Main = () => {
messages={messages}
onDelete={handleDelete}
onUpdate={handleUpdate}
+ onUpdateLike={handleUpdateLike}
/>
-
+
);
diff --git a/src/pages/Register.jsx b/src/pages/Register.jsx
index 0d5d825d..f9aa0603 100644
--- a/src/pages/Register.jsx
+++ b/src/pages/Register.jsx
@@ -1,5 +1,8 @@
import { useState } from "react";
-import { Link } from "react-router-dom";
+import { Link, useNavigate } from "react-router-dom";
+
+const url = "https://api-project-ns11.onrender.com";
+// const url = "http://localhost:8080";
const Register = () => {
const [username, setUsername] = useState("");
@@ -7,21 +10,62 @@ const Register = () => {
const [email, setEmail] = useState("");
const [error, setError] = useState("");
+ const navigate = useNavigate();
+
const handleRegister = async (e) => {
e.preventDefault();
+ const trimmedUsername = username.trim();
+ const trimmedEmail = email.trim();
+ const trimmedPassword = password.trim();
+
+ const usernameRegex = /^[A-Za-z]+$/;
+ 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;
+ }
+
+ 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;
+ }
+ 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 }),
- }
- );
+ const response = await fetch(`${url}/auth/signup`, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ 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!");
@@ -29,6 +73,8 @@ const Register = () => {
setEmail("");
setPassword("");
setError("");
+
+ navigate("/login");
} catch (error) {
setError(error.message);
}