-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAuthentication.jsx
More file actions
176 lines (157 loc) · 5.37 KB
/
Authentication.jsx
File metadata and controls
176 lines (157 loc) · 5.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// Import necessary hooks and components
import { useState, useEffect } from "react";
import { registerLicense } from '@syncfusion/ej2-base';
import DocumentEditorMain from "./DocumentEditor";
// Register the Syncfusion license key
registerLicense("Ngo9BigBOggjHTQxAR8/V1NNaF5cXGhIfEx1RHxQdld5ZFRHallYTnNWUj0eQnxTdEBjWH1ecXxWRWVbUExyVklfag==");
const hostURL = "https://localhost:44310/api/authentication";
// Authenticating the users with the credentials like Email ID and password. Registering new users.
function Authentication() {
// State hooks for managing authentication
const [user, setUser] = useState(null);
const [isRegister, setIsRegister] = useState(false);
const [message, setMessage] = useState("");
const [username, setUsername] = useState("");
// Effect to load user from localStorage on component mount
useEffect(() => {
const saved = localStorage.getItem("user");
if (saved) {
setUser(JSON.parse(saved));
}
}, []);
// Logout user and clear state
const handleLogout = () => {
localStorage.removeItem("user");
setUser(null);
};
// Validate email format using a regular expression
const validateEmail = (email) => /\S+@\S+\.\S+/.test(email);
// Handle login form submission
const handleLogin = async (event) => {
event.preventDefault();
setMessage("");
const form = event.currentTarget;
const email = form.elements.email.value.trim();
const password = form.elements.password.value.trim();
if (!validateEmail(email)) {
setMessage("❌ Please enter a valid email.");
return;
}
try {
// Make a POST request to the login API
const response = await fetch(`${hostURL}/login`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, password }),
});
if (response.ok) {
const userData = await response.json();
localStorage.setItem("user", JSON.stringify(userData));
setUser(userData); // Update user state directly
} else {
setMessage("❌ Invalid email or password.");
}
} catch (error) {
setMessage("⚠️ Server error during login.");
}
};
// Handle registration form submission
const handleRegister = async (e) => {
e.preventDefault();
setMessage("");
const form = e.currentTarget;
const username = form.elements.username.value;
const email = form.elements.email.value;
const password = form.elements.password.value;
if (!validateEmail(email)) {
setMessage("❌ Please enter a valid email.");
return;
}
try {
// Make a POST request to the registration API
const register = await fetch(`${hostURL}/register`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ username, email, password }),
});
const data = await register.json();
if (register.ok) {
setMessage("✅ Registration successful. You can now log in.");
setIsRegister(false);
setUsername("");
} else {
setMessage(`❌ ${data.message || "Registration failed"}`);
}
} catch {
setMessage("⚠️ Server error during registration.");
}
};
// Render authentication form if not logged in
const renderAuthForm = () => {
return (
<div className="auth-container">
<h2 className="auth-title">{isRegister ? "Register" : "Login"}</h2>
<form onSubmit={isRegister ? handleRegister : handleLogin}>
{isRegister && (
<>
<label className="auth-label" htmlFor="username">Username:</label>
<input
id="username"
type="text"
name="username"
value={username}
onChange={(e) => setUsername(e.target.value)}
required
className="auth-input"
placeholder="Your username"
/>
</>
)}
<label className="auth-label" htmlFor="email">Email:</label>
<input
id="email"
type="email"
name="email"
required
className="auth-input"
placeholder="you@example.com"
/>
<label className="auth-label" htmlFor="password">Password:</label>
<input
id="password"
type="password"
name="password"
required
className="auth-input"
placeholder="Your password"
/>
<button
type="submit"
className="auth-button primary"
>
{isRegister ? "Register" : "Login"}
</button>
</form>
<button
className="auth-button secondary"
onClick={() => {
setIsRegister(!isRegister);
setMessage("");
setUsername("");
}}
style={{ marginTop: 12, cursor: "pointer" }}
>
{isRegister ? "Already have an account? Log in" : "Don't have an account? Register"}
</button>
{message && <p className="auth-message" style={{ marginTop: 12 }}>{message}</p>}
</div>
);
};
// Render DocumentEditorMain if user is authenticated, otherwise render auth form
return user ? (
<DocumentEditorMain user={user} onLogout={handleLogout} />
) : (
renderAuthForm()
);
}
export default Authentication;