Skip to content

Commit e0bd876

Browse files
committed
[feat] 소셜로그인 로직 수정 (api 대기중)
1 parent 01c8e5d commit e0bd876

File tree

5 files changed

+80
-43
lines changed

5 files changed

+80
-43
lines changed

src/app/login/SocialLogin.tsx

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,10 @@ import Naver from '@/shared/assets/icons/naver.svg';
44
import Kakao from '@/shared/assets/icons/kakao.svg';
55
import Google from '@/shared/assets/icons/google.svg';
66
import tw from '@/shared/utills/tw';
7-
import Welcome from './Welcome';
8-
import { useState } from 'react';
97
import { useAuthStore } from '@/shared/@store/auth';
108

119
function SocialLogin() {
12-
const [isModalOpen, setIsModalOpen] = useState(false);
13-
const { user } = useAuthStore();
10+
const { loginWithProvider } = useAuthStore();
1411

1512
const socialButtons = [
1613
{
@@ -35,10 +32,7 @@ function SocialLogin() {
3532

3633
// TODO: 백엔드 연동 로직 구현 필요
3734
const handleLogin = (id: string) => {
38-
const preLoginPath = sessionStorage.getItem('preLoginPath');
39-
console.log('경로, id', preLoginPath, id);
40-
41-
// useAuthStore.getState().loginWithProvider(id as 'naver' | 'kakao' | 'google');
35+
loginWithProvider(id as 'naver' | 'kakao' | 'google');
4236
};
4337

4438
return (
@@ -56,13 +50,6 @@ function SocialLogin() {
5650
</button>
5751
))}
5852
</div>
59-
60-
{/* 웰컴 모달 (임시) */}
61-
<Welcome
62-
open={isModalOpen}
63-
onClose={() => setIsModalOpen(false)}
64-
nickname={user?.nickname || '게스트'}
65-
/>
6653
</>
6754
);
6855
}

src/app/login/page.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ function Page() {
1515
className="absolute bottom-0 left-1/2 -translate-x-1/2 w-full max-w-[75rem] h-full -z-10"
1616
aria-hidden
1717
>
18-
<Image src={loginBg} alt="" fill className="object-cover md:object-contain object-bottom" />
18+
<Image
19+
src={loginBg}
20+
alt=""
21+
fill
22+
priority
23+
className="object-cover md:object-contain object-bottom"
24+
/>
1925
</div>
2026

2127
<div className="flex flex-col gap-3 text-center">

src/app/oauth/success/page.tsx

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,48 @@
33
import { useEffect } from 'react';
44
import { useRouter } from 'next/navigation';
55
import { useAuthStore } from '@/shared/@store/auth';
6+
import { useModalStore } from '@/shared/@store/modal';
67
import Spinner from '@/shared/components/spinner/Spinner';
78

89
function Page() {
910
const router = useRouter();
10-
const { user } = useAuthStore();
11+
const { setUser, updateUser } = useAuthStore();
12+
const { openWelcomeModal } = useModalStore();
1113

1214
useEffect(() => {
13-
if (user) {
14-
const prevPath = sessionStorage.getItem('preLoginPath') || '/';
15-
router.push(prevPath);
16-
sessionStorage.removeItem('preLoginPath');
17-
}
18-
}, [user, router]);
15+
const fetchUser = async () => {
16+
try {
17+
const data = await updateUser();
18+
19+
console.log(data);
20+
// if (data && data.user && data.accessToken) {
21+
// setUser(data.user, data.accessToken); // ✅ Zustand 상태 업데이트 + toast
22+
23+
// // 첫 로그인 시 웰컴 모달
24+
// if (data.user.is_first_login) {
25+
// openWelcomeModal(data.user.nickname);
26+
// }
27+
28+
// const prevPath = sessionStorage.getItem('preLoginPath') || '/';
29+
// router.push(prevPath);
30+
// sessionStorage.removeItem('preLoginPath');
31+
// } else {
32+
// router.push('/login');
33+
// }
34+
} catch (err) {
35+
console.error(err);
36+
router.push('/login');
37+
}
38+
};
39+
40+
fetchUser();
41+
}, [updateUser, setUser, openWelcomeModal, router]);
42+
1943
return (
2044
<div className="page-layout max-w-824 flex-center">
2145
<Spinner />
2246
</div>
2347
);
2448
}
49+
2550
export default Page;

src/shared/@store/auth.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface User {
55
id: string;
66
email: string;
77
nickname: string;
8+
is_first_login: boolean;
89
abv_degree?: number;
910
provider?: 'naver' | 'kakao' | 'google';
1011
}
@@ -15,8 +16,9 @@ interface AuthState {
1516
isLoggedIn: boolean;
1617
setUser: (user: User, token: string) => void;
1718
logout: () => Promise<void>;
18-
refreshToken: () => Promise<void>;
1919
loginWithProvider: (provider: User['provider']) => void;
20+
21+
updateUser: () => Promise<User | null>;
2022
}
2123

2224
export const useAuthStore = create<AuthState>((set) => ({
@@ -28,7 +30,12 @@ export const useAuthStore = create<AuthState>((set) => ({
2830
window.location.href = `http://localhost:8080/oauth2/authorization/${provider}`;
2931
},
3032

31-
setUser: (user, token) => set({ user, accessToken: token, isLoggedIn: true }),
33+
setUser: (user, token) => {
34+
const updatedUser = { ...user, abv_degree: 5.0 };
35+
set({ user: updatedUser, accessToken: token, isLoggedIn: true });
36+
37+
customToast.success(`${updatedUser.nickname}님, 로그인 성공 🎉`);
38+
},
3239

3340
logout: async () => {
3441
try {
@@ -45,24 +52,29 @@ export const useAuthStore = create<AuthState>((set) => ({
4552
}
4653
},
4754

48-
refreshToken: async () => {
55+
updateUser: async () => {
4956
try {
5057
const res = await fetch('http://localhost:8080/api/user/auth/refresh', {
5158
method: 'POST',
5259
credentials: 'include',
60+
headers: { 'Content-Type': 'application/json' },
5361
});
62+
5463
if (!res.ok) throw new Error('토큰 갱신 실패');
64+
const data = await res.json();
65+
66+
console.log(data);
67+
// if (data.accessToken && data.user) {
68+
// set({ accessToken: data.accessToken, user: data.user, isLoggedIn: true });
69+
// console.log('토큰 및 유저 정보 갱신 완료:', data.user);
70+
// return data.user;
71+
// }
5572

56-
const result = await res.json();
57-
if (result.code === 0) {
58-
set({ isLoggedIn: true, user: result.data.user });
59-
customToast.success(`환영합니다😊 \n ${result.data.user.nickname}님`);
60-
} else {
61-
throw new Error(result.message || '토큰 갱신 실패');
62-
}
73+
return null;
6374
} catch (err) {
64-
console.error(err);
65-
set({ user: null, accessToken: null, isLoggedIn: false });
75+
console.error('updateUser 실패', err);
76+
set({ accessToken: null, user: null, isLoggedIn: false });
77+
return null;
6678
}
6779
},
6880
}));

src/shared/@store/modal.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import { create } from 'zustand';
22

3-
interface ModalState {
4-
welcomeOpen: boolean;
5-
openModal: (modal: keyof ModalState) => void;
6-
closeModal: (modal: keyof ModalState) => void;
3+
interface WelcomeModalData {
4+
open: boolean;
5+
nickname: string;
76
}
87

9-
export const useModalStore = create<ModalState>((set) => ({
10-
welcomeOpen: false,
8+
interface ModalStore {
9+
welcomeModal: WelcomeModalData;
1110

12-
openModal: (modal) => set({ [modal]: true }),
13-
closeModal: (modal) => set({ [modal]: false }),
11+
openWelcomeModal: (nickname: string) => void;
12+
closeWelcomeModal: () => void;
13+
}
14+
15+
export const useModalStore = create<ModalStore>((set) => ({
16+
welcomeModal: { open: false, nickname: '' },
17+
18+
openWelcomeModal: (nickname: string) => set({ welcomeModal: { open: true, nickname } }),
19+
20+
closeWelcomeModal: () => set({ welcomeModal: { open: false, nickname: '' } }),
1421
}));

0 commit comments

Comments
 (0)