-
Notifications
You must be signed in to change notification settings - Fork 46
Expand file tree
/
Copy pathAuthGuard.tsx
More file actions
105 lines (93 loc) · 3.1 KB
/
Copy pathAuthGuard.tsx
File metadata and controls
105 lines (93 loc) · 3.1 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
import { useState, useEffect, useCallback } from "react";
import { message } from "antd";
import { LoginDialog } from "@/pages/Layout/LoginDialog";
import { SignupDialog } from "@/pages/Layout/SignupDialog";
import { post } from "@/utils/request";
import { useTranslation } from "react-i18next";
function loginUsingPost(data: { username: string; password: string }) {
return post("/api/user/login", data);
}
function signupUsingPost(data: { username: string; email: string; password: string }) {
return post("/api/user/signup", data);
}
export function AuthGuard() {
const { t } = useTranslation();
const [loginOpen, setLoginOpen] = useState(false);
const [signupOpen, setSignupOpen] = useState(false);
const [loading, setLoading] = useState(false);
const openLoginDialog = useCallback(() => {
console.log('[AuthGuard] openLoginDialog called, setting loginOpen to true');
setLoginOpen(true);
}, []);
const openSignupDialog = useCallback(() => {
console.log('[AuthGuard] openSignupDialog called');
setSignupOpen(true);
}, []);
useEffect(() => {
console.log('[AuthGuard] Registering show-login event listener');
window.addEventListener("show-login", openLoginDialog);
return () => {
console.log('[AuthGuard] Removing show-login event listener');
window.removeEventListener("show-login", openLoginDialog);
};
}, [openLoginDialog]);
const handleLogin = async (values: { username: string; password: string }) => {
try {
setLoading(true);
const response = await loginUsingPost(values);
localStorage.setItem("session", JSON.stringify(response.data));
message.success(t("user.messages.loginSuccess"));
setLoginOpen(false);
window.location.reload();
} catch (error) {
console.error("Login error:", error);
message.error(t("user.messages.loginFailed"));
} finally {
setLoading(false);
}
};
const handleSignup = async (values: {
username: string;
email: string;
password: string;
confirmPassword: string;
}) => {
if (values.password !== values.confirmPassword) {
message.error(t("user.messages.passwordMismatch"));
return;
}
try {
setLoading(true);
const { username, email, password } = values;
const response = await signupUsingPost({ username, email, password });
message.success(t("user.messages.signupSuccess"));
localStorage.setItem("session", JSON.stringify(response.data));
setSignupOpen(false);
window.location.reload();
} catch (error) {
console.error("Registration error:", error);
message.error(t("user.messages.signupFailed"));
} finally {
setLoading(false);
}
};
return (
<>
<LoginDialog
open={loginOpen}
onOpenChange={setLoginOpen}
onLogin={handleLogin}
loading={loading}
onSignupClick={openSignupDialog}
/>
<SignupDialog
open={signupOpen}
onOpenChange={setSignupOpen}
onSignup={handleSignup}
loading={loading}
onLoginClick={openLoginDialog}
/>
</>
);
}
export default AuthGuard;