source: frontend/src/Login.tsx@ 3727852

main
Last change on this file since 3727852 was 3727852, checked in by Filip Gavrilovski <filipgavrilovski28@…>, 6 months ago

modify user response dto to store other relevant user data

  • Property mode set to 100644
File size: 2.2 KB
RevLine 
[24a2a2a]1import { useState } from "react";
2import { useNavigate } from "react-router-dom";
3import axiosInstance, { scheduleTokenRefresh } from "./api/axiosInstance";
4import { useAuth } from "./context/authContext";
[3727852]5import type { User } from "./types";
[24a2a2a]6
[0c86e77]7const Login = () => {
[24a2a2a]8 const [username, setUsername] = useState("");
9 const [password, setPassword] = useState("");
10 const [error, setError] = useState<string | null>(null);
11 const { setUser } = useAuth();
12 const navigate = useNavigate();
13
14 const handleLogin = async (e: React.FormEvent) => {
15 e.preventDefault();
16 try {
17 const response = await axiosInstance.post<{
[3727852]18 user: User;
[24a2a2a]19 tokenExpiresIn: number;
20 }>("/auth/login", { username, password });
21 scheduleTokenRefresh(response.data.tokenExpiresIn);
22 setUser({
23 username: response.data.user.username,
24 fullName: "demo",
25 email: "demo@demo.com",
26 role: response.data.user.role,
27 });
28 navigate("/");
29 } catch (error) {
30 setError("Login failed. Please check your credentials.");
31 }
32 };
33 return (
[4022db1]34 <div className="flex flex-col items-center justify-center min-h-[90vh] bg-gray-100">
[24a2a2a]35 <h2 className="text-2xl mb-4">Login</h2>
36 <form
37 onSubmit={handleLogin}
38 className="bg-white p-6 rounded shadow-md w-80"
39 >
40 {error && <p className="text-red-500 mb-4">{error}</p>}
41 <div className="mb-4">
42 <label className="block text-gray-700 mb-2" htmlFor="username">
43 Username
44 </label>
45 <input
46 type="text"
47 id="username"
48 className="w-full p-2 border border-gray-300 rounded"
49 value={username}
50 onChange={(e) => setUsername(e.target.value)}
51 />
52 </div>
53 <div className="mb-4">
54 <label className="block text-gray-700 mb-2" htmlFor="password">
55 Password
56 </label>
57 <input
58 type="password"
59 id="password"
60 className="w-full p-2 border border-gray-300 rounded"
61 value={password}
62 onChange={(e) => setPassword(e.target.value)}
63 />
64 </div>
65 <button
66 type="submit"
[3727852]67 className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-lg text-sm font-medium transition-colors duration-200 w-full cursor-pointer"
[24a2a2a]68 >
69 Login
70 </button>
71 </form>
72 </div>
73 );
[0c86e77]74};
75
76export default Login;
Note: See TracBrowser for help on using the repository browser.