diff --git a/frontend/src/pages/login-page.tsx b/frontend/src/pages/login-page.tsx
index 515f8f6..b4c203a 100644
--- a/frontend/src/pages/login-page.tsx
+++ b/frontend/src/pages/login-page.tsx
@@ -3,14 +3,24 @@ import { Link, useNavigate } from "react-router-dom";
import { motion } from "framer-motion";
import HostContext from "../HostContext";
+type LoginResponse = {
+ token: string,
+ message: string
+}
+
+type ErrorResponse = {
+ message: string
+}
+
export const LoginPage = () => {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
+ const [error, setError] = useState("");
const navigate = useNavigate();
const hostURL = useContext(HostContext);
- const handleLogin = (e: React.FormEvent) => {
+ const handleLogin = async (e: React.FormEvent) => {
e.preventDefault();
const requestBody = {
@@ -18,29 +28,31 @@ export const LoginPage = () => {
password: password,
};
- fetch(`${hostURL}/api/auth/login`, {
+ const response = await fetch(`${hostURL}/api/auth/login`, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(requestBody),
})
- .then((response) => {
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- return response.json();
- })
- .then((response) => {
- localStorage.setItem("token", response.token);
- localStorage.setItem('username', username);
- navigate("/quizzes");
- })
- .catch((error) => {
- // TODO: Display error in the UI.
- console.log("Error:");
- console.log(error);
- });
+
+ if (!response.ok) {
+ try {
+ const errorBody = (await response.json()) as ErrorResponse;
+ setError(errorBody.message);
+ } catch (e) {
+ console.log(e);
+ setError("Invalid username or password.");
+ }
+ return;
+ }
+
+ const loginResponse = (await response.json()) as LoginResponse;
+
+ localStorage.setItem("token", loginResponse.token);
+ localStorage.setItem('username', username);
+ setError("");
+ navigate("/quizzes");
};
return (
@@ -90,6 +102,12 @@ export const LoginPage = () => {
Register
+
+ {error && (
+
+ {error}
+
+ )}
);
diff --git a/frontend/src/pages/sign-up.tsx b/frontend/src/pages/sign-up.tsx
index ee20512..6f9da33 100644
--- a/frontend/src/pages/sign-up.tsx
+++ b/frontend/src/pages/sign-up.tsx
@@ -4,6 +4,11 @@ import { motion } from "framer-motion";
import HostContext from "../HostContext";
import { ProfileResponse } from "../types/profile";
+type RegisterResponse = {
+ token: string,
+ message: string
+}
+
export const SignUpPage = () => {
const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState("");
@@ -15,11 +20,18 @@ export const SignUpPage = () => {
useState("A1");
const navigate = useNavigate();
+ const [error, setError] = useState("");
+
const hostURL = useContext(HostContext);
- const handleSignUp = (e: React.FormEvent) => {
+ const handleSignUp = async (e: React.FormEvent) => {
e.preventDefault();
+ if (password !== confirmPassword) {
+ setError("Passwords do not match.");
+ return;
+ }
+
const requestBody = {
username: username,
name: firstName + lastName,
@@ -28,7 +40,7 @@ export const SignUpPage = () => {
englishProficiency: englishProficiency,
};
- fetch(`${hostURL}/api/auth/register`, {
+ const response = await fetch(`${hostURL}/api/auth/register`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -36,23 +48,19 @@ export const SignUpPage = () => {
body: JSON.stringify(requestBody),
})
- .then((response) => {
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- return response.json();
- })
- .then((response) => {
- console.log("Registration successfull.");
- localStorage.setItem("token", response.token);
- localStorage.setItem("username", username);
- navigate("/");
- })
- .catch((error) => {
- // TODO: Display error in the UI.
- console.log("Error:");
- console.log(error);
- });
+
+ if (!response.ok) {
+ const errorMessage = await response.json();
+ setError(errorMessage.message);
+ return;
+ }
+
+ const registerResponse = (await response.json()) as RegisterResponse;
+
+ localStorage.setItem("token", registerResponse.token);
+ localStorage.setItem('username', username);
+ setError("");
+ navigate("/quizzes");
};
return (
@@ -153,6 +161,12 @@ export const SignUpPage = () => {
Sign in
+
+ {error && (
+
+ {error}
+
+ )}
);