11import { getApi } from '@/app/api/config/appConfig' ;
22import { create } from 'zustand' ;
3- import { persist } from 'zustand/middleware' ;
43
54export interface User {
65 id : string ;
@@ -13,41 +12,44 @@ export interface User {
1312
1413interface AuthState {
1514 user : User | null ;
16- accessToken : string | null ;
1715 isLoggedIn : boolean ;
18- setUser : ( user : User , token : string ) => void ;
16+ setUser : ( user : User ) => void ;
1917 logout : ( ) => Promise < void > ;
2018 loginWithProvider : ( provider : User [ 'provider' ] ) => void ;
2119
2220 updateUser : ( ) => Promise < User | null > ;
21+ checkAuth : ( ) => Promise < User | null > ;
2322}
2423
2524export const useAuthStore = create < AuthState > ( ) ( ( set ) => ( {
2625 user : null ,
27- accessToken : null ,
2826 isLoggedIn : false ,
2927
3028 loginWithProvider : ( provider ) => {
3129 window . location . href = `${ getApi } /oauth2/authorization/${ provider } ` ;
3230 } ,
3331
34- setUser : ( user , token ) => {
35- const updatedUser = { ...user , abv_degree : 5.0 } ;
36- set ( { user : updatedUser , accessToken : token , isLoggedIn : true } ) ;
32+ setUser : ( user ) => {
33+ const updatedUser = { ...user , abv_degree : user . abv_degree ?? 5.0 } ;
34+ set ( { user : updatedUser , isLoggedIn : true } ) ;
3735 } ,
3836
37+ // 로그아웃
3938 logout : async ( ) => {
4039 try {
4140 await fetch ( `${ getApi } /user/auth/logout` , {
4241 method : 'POST' ,
4342 credentials : 'include' ,
4443 } ) ;
45- set ( { user : null , accessToken : null , isLoggedIn : false } ) ;
44+ set ( { user : null , isLoggedIn : false } ) ;
4645 } catch ( err ) {
4746 console . error ( '로그아웃 실패' , err ) ;
47+ } finally {
48+ set ( { user : null , isLoggedIn : false } ) ;
4849 }
4950 } ,
5051
52+ // idle + refresh 시 호출
5153 updateUser : async ( ) => {
5254 try {
5355 const res = await fetch ( `${ getApi } /user/auth/refresh` , {
@@ -57,18 +59,40 @@ export const useAuthStore = create<AuthState>()((set) => ({
5759 } ) ;
5860
5961 if ( ! res . ok ) throw new Error ( '토큰 갱신 실패' ) ;
62+
6063 const data = await res . json ( ) ;
6164 const userInfo = data ?. data ?. user ;
62- const accessToken = data ?. data ?. accessToken ;
6365
64- if ( userInfo && accessToken ) {
65- set ( { user : userInfo , accessToken , isLoggedIn : true } ) ;
66+ if ( userInfo ) {
67+ set ( { user : userInfo , isLoggedIn : true } ) ;
6668 return userInfo ;
6769 }
6870 return null ;
6971 } catch ( err ) {
7072 console . error ( 'updateUser 실패' , err ) ;
71- set ( { accessToken : null , user : null , isLoggedIn : false } ) ;
73+ set ( { user : null , isLoggedIn : false } ) ;
74+ return null ;
75+ }
76+ } ,
77+
78+ // 시작 시 로그인 상태 확인
79+ checkAuth : async ( ) => {
80+ try {
81+ const res = await fetch ( `${ getApi } /user/auth/me` , {
82+ method : 'GET' ,
83+ credentials : 'include' ,
84+ } ) ;
85+ if ( ! res . ok ) throw new Error ( '인증 실패' ) ;
86+
87+ const data = await res . json ( ) ;
88+ const userInfo = data ?. data ?. user ;
89+ if ( userInfo ) {
90+ set ( { user : userInfo , isLoggedIn : true } ) ;
91+ return userInfo ;
92+ }
93+ return null ;
94+ } catch {
95+ set ( { user : null , isLoggedIn : false } ) ;
7296 return null ;
7397 }
7498 } ,
0 commit comments