diff --git a/frontend/src/pages/Login.tsx b/frontend/src/pages/Login.tsx new file mode 100644 index 0000000..2c67511 --- /dev/null +++ b/frontend/src/pages/Login.tsx @@ -0,0 +1,168 @@ +import { useEffect, useState } from "react"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; +import StatsStyling from "../styles/stats_styling"; + +const styles = StatsStyling; +const API_BASE_URL = "http://localhost:5000"; + +const LoginPage = () => { + const navigate = useNavigate(); + + const [isRegisterMode, setIsRegisterMode] = useState(false); + const [username, setUsername] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + const [info, setInfo] = useState(""); + + useEffect(() => { + const token = localStorage.getItem("access_token"); + if (!token) { + return; + } + + axios.defaults.headers.common.Authorization = `Bearer ${token}`; + axios + .get(`${API_BASE_URL}/profile`) + .then(() => { + navigate("/upload", { replace: true }); + }) + .catch(() => { + localStorage.removeItem("access_token"); + delete axios.defaults.headers.common.Authorization; + }); + }, [navigate]); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + setError(""); + setInfo(""); + setLoading(true); + + try { + if (isRegisterMode) { + await axios.post(`${API_BASE_URL}/register`, { username, email, password }); + setInfo("Account created. You can now sign in."); + setIsRegisterMode(false); + } else { + const response = await axios.post<{ access_token: string }>( + `${API_BASE_URL}/login`, + { username, password } + ); + + const token = response.data.access_token; + localStorage.setItem("access_token", token); + axios.defaults.headers.common.Authorization = `Bearer ${token}`; + navigate("/upload"); + } + } catch (requestError: unknown) { + if (axios.isAxiosError(requestError)) { + setError( + String(requestError.response?.data?.error || requestError.message || "Request failed") + ); + } else { + setError("Unexpected error occurred."); + } + } finally { + setLoading(false); + } + }; + + return ( +
+
+
+
+

+ {isRegisterMode ? "Create your account" : "Welcome back"} +

+

+ {isRegisterMode + ? "Register to start uploading and exploring your dataset insights." + : "Sign in to continue to your analytics workspace."} +

+
+ +
+ setUsername(event.target.value)} + required + /> + + {isRegisterMode && ( + setEmail(event.target.value)} + required + /> + )} + + setPassword(event.target.value)} + required + /> + + +
+ + {error && ( +

+ {error} +

+ )} + + {info && ( +

+ {info} +

+ )} + +
+ + {isRegisterMode ? "Already have an account?" : "New here?"} + + +
+
+
+
+ ); +}; + +export default LoginPage;