Changeset 24a2a2a for frontend


Ignore:
Timestamp:
01/26/26 16:28:56 (6 months ago)
Author:
Filip Gavrilovski <filipgavrilovski28@…>
Branches:
main
Children:
4022db1
Parents:
0c86e77
Message:

add login page

Location:
frontend/src
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • frontend/src/App.tsx

    r0c86e77 r24a2a2a  
    22import LandingPage from "./LandingPage";
    33import Login from "./Login";
     4import Nav from "./Nav";
    45import Register from "./Register";
    56
     
    78        return (
    89                <div className="flex flex-col min-h-screen">
    9                         {/* <Nav /> */}
     10                        <Nav />
    1011                        <main className="grow">
    1112                                <Outlet />
  • frontend/src/Login.tsx

    r0c86e77 r24a2a2a  
     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
    17const 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        );
    374};
    475
  • frontend/src/Register.tsx

    r0c86e77 r24a2a2a  
    1515        const navigate = useNavigate();
    1616
    17         const handleRegister = async () => {
     17        const handleRegister = async (e: React.FormEvent) => {
     18                e.preventDefault();
    1819                const newUser: User = {
    1920                        username,
     
    3536                        scheduleTokenRefresh(response.data.tokenExpiresIn);
    3637                        setUser(newUser);
     38                        // todo
    3739                        // setUser(response.data.user);
    3840                        navigate("/");
     
    109111                                        type="submit"
    110112                                        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                                        }
    115116                                >
    116117                                        Register
  • frontend/src/context/authContext.tsx

    r0c86e77 r24a2a2a  
    4141                                        tokenExpiresIn: number;
    4242                                        user: User;
    43                                 }>("/user");
     43                                }>("/auth/user");
    4444                                setUser(response.data.user);
    4545                                scheduleTokenRefresh(response.data.tokenExpiresIn);
Note: See TracChangeset for help on using the changeset viewer.