- Timestamp:
- 01/26/26 16:28:56 (6 months ago)
- Branches:
- main
- Children:
- 4022db1
- Parents:
- 0c86e77
- Location:
- frontend/src
- Files:
-
- 1 added
- 4 edited
-
App.tsx (modified) (2 diffs)
-
Login.tsx (modified) (1 diff)
-
Nav.tsx (added)
-
Register.tsx (modified) (3 diffs)
-
context/authContext.tsx (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
frontend/src/App.tsx
r0c86e77 r24a2a2a 2 2 import LandingPage from "./LandingPage"; 3 3 import Login from "./Login"; 4 import Nav from "./Nav"; 4 5 import Register from "./Register"; 5 6 … … 7 8 return ( 8 9 <div className="flex flex-col min-h-screen"> 9 {/* <Nav /> */}10 <Nav /> 10 11 <main className="grow"> 11 12 <Outlet /> -
frontend/src/Login.tsx
r0c86e77 r24a2a2a 1 import { useState } from "react"; 2 import { useNavigate } from "react-router-dom"; 3 import axiosInstance, { scheduleTokenRefresh } from "./api/axiosInstance"; 4 import { useAuth } from "./context/authContext"; 5 import type { UserResponse } from "./types"; 6 1 7 const Login = () => { 2 return <div>login</div>; 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 ); 3 74 }; 4 75 -
frontend/src/Register.tsx
r0c86e77 r24a2a2a 15 15 const navigate = useNavigate(); 16 16 17 const handleRegister = async () => { 17 const handleRegister = async (e: React.FormEvent) => { 18 e.preventDefault(); 18 19 const newUser: User = { 19 20 username, … … 35 36 scheduleTokenRefresh(response.data.tokenExpiresIn); 36 37 setUser(newUser); 38 // todo 37 39 // setUser(response.data.user); 38 40 navigate("/"); … … 109 111 type="submit" 110 112 className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600" 111 onClick={(e) => { 112 e.preventDefault(); 113 handleRegister(); 114 }} 113 onClick={(e: React.MouseEvent<HTMLButtonElement>) => 114 handleRegister(e) 115 } 115 116 > 116 117 Register -
frontend/src/context/authContext.tsx
r0c86e77 r24a2a2a 41 41 tokenExpiresIn: number; 42 42 user: User; 43 }>("/ user");43 }>("/auth/user"); 44 44 setUser(response.data.user); 45 45 scheduleTokenRefresh(response.data.tokenExpiresIn);
Note:
See TracChangeset
for help on using the changeset viewer.
