source: frontend/src/Login.tsx@ 24a2a2a

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

add login page

  • Property mode set to 100644
File size: 2.2 KB
Line 
1import { useState } from "react";
2import { useNavigate } from "react-router-dom";
3import axiosInstance, { scheduleTokenRefresh } from "./api/axiosInstance";
4import { useAuth } from "./context/authContext";
5import type { UserResponse } from "./types";
6
7const Login = () => {
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<{
18 user: UserResponse;
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 (
34 <div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
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"
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"
68 >
69 Login
70 </button>
71 </form>
72 </div>
73 );
74};
75
76export default Login;
Note: See TracBrowser for help on using the repository browser.