source: frontend/src/Register.tsx@ 0c86e77

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

add axios, auth context, simple working register form on frontend

  • Property mode set to 100644
File size: 3.2 KB
Line 
1import { useState } from "react";
2import { useNavigate } from "react-router";
3import axiosInstance, { scheduleTokenRefresh } from "./api/axiosInstance";
4import { useAuth } from "./context/authContext";
5import type { User, UserResponse } from "./types";
6
7const Register = () => {
8 const { setUser, user } = useAuth();
9 const [username, setUsername] = useState("");
10 const [password, setPassword] = useState("");
11 const [fullname, setFullname] = useState("");
12 const [email, setEmail] = useState("");
13 const [profilePhoto, setProfilePhoto] = useState<string | null>(null);
14
15 const navigate = useNavigate();
16
17 const handleRegister = async () => {
18 const newUser: User = {
19 username,
20 fullName: fullname,
21 email: email,
22 profilePhoto: profilePhoto,
23 };
24 try {
25 const response = await axiosInstance.post<{
26 user: UserResponse;
27 tokenExpiresIn: number;
28 }>("/auth/register", {
29 username,
30 fullname,
31 email,
32 password,
33 profilePhoto,
34 });
35 scheduleTokenRefresh(response.data.tokenExpiresIn);
36 setUser(newUser);
37 // setUser(response.data.user);
38 navigate("/");
39 } catch (error) {
40 console.error("Registration failed:", error);
41 }
42 };
43
44 return (
45 <div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
46 <h2 className="text-2xl mb-4">Register</h2>
47 <form className="bg-white p-6 rounded shadow-md w-80">
48 <div className="mb-4">
49 <label className="block text-gray-700 mb-2" htmlFor="username">
50 Username
51 </label>
52 <input
53 type="text"
54 id="username"
55 className="w-full p-2 border border-gray-300 rounded"
56 value={username}
57 onChange={(e) => setUsername(e.target.value)}
58 />
59 </div>
60 <div className="mb-4">
61 <label className="block text-gray-700 mb-2" htmlFor="password">
62 Password
63 </label>
64 <input
65 type="password"
66 id="password"
67 className="w-full p-2 border border-gray-300 rounded"
68 value={password}
69 onChange={(e) => setPassword(e.target.value)}
70 />
71 </div>
72 <div className="mb-4">
73 <label className="block text-gray-700 mb-2" htmlFor="fullName">
74 Full Name
75 </label>
76 <input
77 type="text"
78 id="fullName"
79 className="w-full p-2 border border-gray-300 rounded"
80 value={fullname}
81 onChange={(e) => setFullname(e.target.value)}
82 />
83 </div>
84 <div className="mb-4">
85 <label className="block text-gray-700 mb-2" htmlFor="email">
86 Email
87 </label>
88 <input
89 type="email"
90 id="email"
91 className="w-full p-2 border border-gray-300 rounded"
92 value={email}
93 onChange={(e) => setEmail(e.target.value)}
94 />
95 </div>
96 <div className="mb-4">
97 <label className="block text-gray-700 mb-2" htmlFor="profilePhoto">
98 Profile Photo URL
99 </label>
100 <input
101 type="text"
102 id="profilePhoto"
103 className="w-full p-2 border border-gray-300 rounded"
104 value={profilePhoto || ""}
105 onChange={(e) => setProfilePhoto(e.target.value)}
106 />
107 </div>
108 <button
109 type="submit"
110 className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600"
111 onClick={(e) => {
112 e.preventDefault();
113 handleRegister();
114 }}
115 >
116 Register
117 </button>
118 </form>
119 </div>
120 );
121};
122
123export default Register;
Note: See TracBrowser for help on using the repository browser.