-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseAuth.ts
More file actions
102 lines (93 loc) ยท 2.82 KB
/
useAuth.ts
File metadata and controls
102 lines (93 loc) ยท 2.82 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
import loginApi from '@/api/auth/login';
import logoutApi from '@/api/auth/logout';
import signupApi from '@/api/auth/signup';
import socialApi from '@/api/auth/social';
import { getMe as getMeApi } from '@/api/users/me';
import useAuthStore from '@/hooks/useAuthStore';
import type {
LoginRequest,
SignUpRequest,
SocialLoginRequest,
} from '@/types/auth';
import { useCallback } from 'react';
import { useNavigate } from 'react-router';
export default function useAuth() {
const navigate = useNavigate();
const user = useAuthStore((state) => state.user);
const isLoggedIn = useAuthStore((state) => state.isLoggedIn);
const login = useAuthStore((state) => state.login);
const logout = useAuthStore((state) => state.logout);
const updateUser = useAuthStore((state) => state.updateUser);
// 5. ๋ก๊ทธ์์ ๋ก์ง (handleLogout์ ๋จผ์ ์ ์ํจ)
const handleLogout = useCallback(async () => {
try {
await logoutApi();
} finally {
logout(); // Zustand ์ํ ์ด๊ธฐํ
navigate('/login');
}
}, [logout, navigate]);
// 1. ์ด๋ฉ์ผ ๋ก๊ทธ์ธ ๋ก์ง
const handleLogin = useCallback(
async (data: LoginRequest) => {
try {
const { token } = await loginApi(data);
const user = await getMeApi(token);
login(user, token); // Zustand ์คํ ์ด ์
๋ฐ์ดํธ
navigate('/'); // ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
} catch (error) {
console.error('Login failed:', error);
}
},
[login, navigate]
);
// 2. ์ด๋ฉ์ผ ํ์๊ฐ์
๋ก์ง
const handleSignUp = useCallback(async (data: SignUpRequest) => {
try {
const response = await signupApi(data);
// 204 No Content
if (response.status === 204) {
return true;
}
return false;
} catch (error) {
console.error('Signup failed:', error);
}
return false;
}, []);
// 3. ์์
๋ก๊ทธ์ธ ๋ก์ง
const handleSocialLogin = useCallback(
async (data: SocialLoginRequest) => {
try {
const { token } = await socialApi(data);
const user = await getMeApi(token);
login(user, token);
navigate('/');
} catch (error) {
console.error('Social login failed:', error);
}
},
[login, navigate]
);
// 4. ๋ด ์ ๋ณด ๋๊ธฐํ
const refreshUser = useCallback(async () => {
if (!isLoggedIn) return;
try {
const userData = await getMeApi();
// ์ ์ ์ ๋ณด์ ๊ทธ๋ฃน ์ ๋ณด ๋ฑ์ด ๋ด๊ธด ๋ฐ์ดํฐ๋ก ์คํ ์ด ๊ฐฑ์
updateUser(userData);
} catch (error) {
console.error('Refresh user failed:', error);
handleLogout(); // ํ ํฐ์ด ์ ํจํ์ง ์์ผ๋ฉด ๋ก๊ทธ์์ ์ฒ๋ฆฌ
}
}, [isLoggedIn, updateUser, handleLogout]);
return {
user,
isLoggedIn,
handleLogin,
handleSignUp,
handleSocialLogin,
refreshUser,
handleLogout,
};
}