source: frontend/src/pages/Register/Register.jsx@ c4c43f3

Last change on this file since c4c43f3 was 3ebe47c, checked in by Andrej <asumanovski@…>, 5 months ago

Made authentication on frontend and backend

  • Property mode set to 100644
File size: 3.0 KB
RevLine 
[3ebe47c]1import React, { useEffect, useState } from "react";
2import { Link, useNavigate } from "react-router-dom";
3
4import api from "../../api/axios";
5
6const Register = () => {
7 const navigate = useNavigate();
8 const [email, setEmail] = useState("");
9 const [username, setUsername] = useState("");
10 const [password, setPassword] = useState("");
11 const [error, setError] = useState("");
12 const [isSubmitting, setIsSubmitting] = useState(false);
13
14 useEffect(() => {
15 const token = localStorage.getItem("authToken");
16 if (token) navigate("/dashboard", { replace: true });
17 }, [navigate]);
18
19 const onSubmit = async (e) => {
20 e.preventDefault();
21 setError("");
22 setIsSubmitting(true);
23 try {
24 const res = await api.post("/auth/register", {
25 email,
26 username,
27 password,
28 });
29 localStorage.setItem("authToken", res.data.token);
30 localStorage.setItem(
31 "authUser",
32 JSON.stringify({
33 userId: res.data.userId,
34 username: res.data.username,
35 email: res.data.email,
36 }),
37 );
38 navigate("/dashboard");
39 } catch (err) {
40 const message =
41 err?.response?.data?.message ||
42 Object.values(err?.response?.data?.errors ?? {})[0] ||
43 "Registration failed";
44 setError(message);
45 } finally {
46 setIsSubmitting(false);
47 }
48 };
49
50 return (
51 <div className="min-h-screen flex items-center justify-center p-4">
52 <form
53 onSubmit={onSubmit}
54 className="fieldset bg-base-200 border-base-300 rounded-box w-xs border p-4"
55 >
56 <legend className="fieldset-legend">Register</legend>
57
58 <label className="label">Email</label>
59 <input
60 type="email"
61 className="input"
62 placeholder="Email"
63 value={email}
64 onChange={(e) => setEmail(e.target.value)}
65 autoComplete="email"
66 required
67 />
68
69 <label className="label">Username</label>
70 <input
71 type="text"
72 className="input"
73 placeholder="Username"
74 value={username}
75 onChange={(e) => setUsername(e.target.value)}
76 autoComplete="username"
77 required
78 />
79
80 <label className="label">Password</label>
81 <input
82 type="password"
83 className="input"
84 placeholder="Password"
85 value={password}
86 onChange={(e) => setPassword(e.target.value)}
87 autoComplete="new-password"
88 required
89 />
90
91 {error ? <p className="text-error mt-2 text-sm">{error}</p> : null}
92
93 <button
94 className="btn btn-neutral mt-4"
95 type="submit"
96 disabled={isSubmitting}
97 >
98 {isSubmitting ? "Creating account..." : "Register"}
99 </button>
100
101 <p className="mt-3 text-sm">
102 Already have an account?{" "}
103 <Link className="link link-primary" to="/login">
104 Login
105 </Link>
106 </p>
107 </form>
108 </div>
109 );
110};
111
112export default Register;
Note: See TracBrowser for help on using the repository browser.