source: frontend/src/Register.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: 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 } from "./types";
6
7const Register = () => {
8 const { setUser } = 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 (e: React.FormEvent) => {
18 e.preventDefault();
19 try {
20 const response = await axiosInstance.post<{
21 user: User;
22 tokenExpiresIn: number;
23 }>("/auth/register", {
24 username,
25 fullname,
26 email,
27 password,
28 profilePhoto,
29 });
30 scheduleTokenRefresh(response.data.tokenExpiresIn);
31 setUser(response.data.user);
32 navigate("/");
33 } catch (error) {
34 console.error("Registration failed:", error);
35 }
36 };
37
38 return (
39 <div className="flex flex-col items-center justify-center min-h-[90vh] bg-gray-100">
40 <h2 className="text-2xl mb-4">Register</h2>
41 <form className="bg-white p-6 rounded shadow-md w-80">
42 <div className="mb-4">
43 <label className="block text-gray-700 mb-2" htmlFor="username">
44 Username
45 </label>
46 <input
47 type="text"
48 id="username"
49 className="w-full p-2 border border-gray-300 rounded"
50 value={username}
51 onChange={(e) => setUsername(e.target.value)}
52 />
53 </div>
54 <div className="mb-4">
55 <label className="block text-gray-700 mb-2" htmlFor="password">
56 Password
57 </label>
58 <input
59 type="password"
60 id="password"
61 className="w-full p-2 border border-gray-300 rounded"
62 value={password}
63 onChange={(e) => setPassword(e.target.value)}
64 />
65 </div>
66 <div className="mb-4">
67 <label className="block text-gray-700 mb-2" htmlFor="fullName">
68 Full Name
69 </label>
70 <input
71 type="text"
72 id="fullName"
73 className="w-full p-2 border border-gray-300 rounded"
74 value={fullname}
75 onChange={(e) => setFullname(e.target.value)}
76 />
77 </div>
78 <div className="mb-4">
79 <label className="block text-gray-700 mb-2" htmlFor="email">
80 Email
81 </label>
82 <input
83 type="email"
84 id="email"
85 className="w-full p-2 border border-gray-300 rounded"
86 value={email}
87 onChange={(e) => setEmail(e.target.value)}
88 />
89 </div>
90 <div className="mb-4">
91 <label className="block text-gray-700 mb-2" htmlFor="profilePhoto">
92 Profile Photo URL
93 </label>
94 <input
95 placeholder="todo"
96 type="text"
97 id="profilePhoto"
98 className="w-full p-2 border border-gray-300 rounded"
99 value={profilePhoto || ""}
100 onChange={(e) => setProfilePhoto(e.target.value)}
101 />
102 </div>
103 <button
104 type="submit"
105 className="w-full bg-blue-500 text-white p-2 rounded hover:bg-blue-600 cursor-pointer"
106 onClick={(e: React.MouseEvent<HTMLButtonElement>) =>
107 handleRegister(e)
108 }
109 >
110 Register
111 </button>
112 </form>
113 </div>
114 );
115};
116
117export default Register;
Note: See TracBrowser for help on using the repository browser.