1+ import { useMutation } from '@tanstack/react-query' ;
2+ import { useAuthStore } from '../../stores/useAuthStore' ;
3+ import { useTokenStore } from '../../stores/useTokenStore' ;
4+ import { apiClient } from '../core/client' ;
5+ import { API_ENDPOINTS } from '../core/types' ;
6+ import { getRedirectUri } from '../../config/api' ;
7+ import type { UserData } from '../../types/user' ;
8+
9+ // 카카오 로그인
10+ interface KakaoLoginRequest {
11+ code : string ;
12+ redirect_uri : string ;
13+ }
14+
15+ interface KakaoLoginResponse {
16+ access_token : string ;
17+ refresh_token : string ;
18+ user ?: UserData ;
19+ }
20+
21+ export function useKakaoLogin ( ) {
22+ const { setTokens } = useTokenStore ( ) ;
23+ const { setAuthenticated, setUser, clearAuthState } = useAuthStore ( ) ;
24+ const { clearTokens } = useTokenStore ( ) ;
25+
26+ // 카카오 로그인 페이지로 이동하는 함수
27+ const initiateKakaoLogin = ( ) => {
28+ // 로그인 시작 전 기존 인증 정보 완전 제거
29+ clearTokens ( ) ;
30+ clearAuthState ( ) ;
31+ localStorage . removeItem ( "token-store" ) ;
32+ localStorage . removeItem ( "auth-store" ) ;
33+
34+ const KAKAO_AUTH_URL = "https://kauth.kakao.com/oauth/authorize" ;
35+ const KAKAO_CLIENT_ID = import . meta. env . VITE_KAKAO_CLIENT_ID ;
36+ const REDIRECT_URI = getRedirectUri ( ) ;
37+
38+ if ( ! KAKAO_CLIENT_ID ) {
39+ console . error ( "KAKAO_CLIENT_ID가 설정되지 않았습니다." ) ;
40+ alert ( "카카오 클라이언트 ID가 설정되지 않았습니다. 환경 변수를 확인해주세요." ) ;
41+ return ;
42+ }
43+
44+ const kakaoAuthUrl = `${ KAKAO_AUTH_URL } ?client_id=${ KAKAO_CLIENT_ID } &redirect_uri=${ REDIRECT_URI } &response_type=code&prompt=login` ;
45+
46+ // 카카오 로그인 페이지로 이동
47+ window . location . href = kakaoAuthUrl ;
48+ } ;
49+
50+ const mutation = useMutation ( {
51+ mutationFn : async ( data : KakaoLoginRequest ) => {
52+ const response = await apiClient . post < KakaoLoginResponse > (
53+ API_ENDPOINTS . AUTH . KAKAO_LOGIN ,
54+ data
55+ ) ;
56+
57+ return response ;
58+ } ,
59+ onSuccess : ( response ) => {
60+ if ( response . success && response . data ) {
61+ const { access_token, refresh_token, user } = response . data ;
62+
63+ // 토큰 저장
64+ setTokens ( access_token , refresh_token ) ;
65+
66+ // 사용자 정보가 있으면 저장
67+ if ( user ) {
68+ setUser ( user ) ;
69+ }
70+
71+ // 인증 상태 업데이트
72+ setAuthenticated ( true ) ;
73+ }
74+ } ,
75+ onError : ( error : Error ) => {
76+ console . error ( "카카오 로그인 실패:" , error ) ;
77+ } ,
78+ } ) ;
79+
80+ return {
81+ ...mutation ,
82+ initiateKakaoLogin, // 카카오 로그인 시작 함수 추가
83+ } ;
84+ }
0 commit comments