'use client'; import { useEffect, useState } from 'react'; import { useAuthContext } from '@/contexts/authProvider'; import { useMemberContext } from '@/contexts/memberProvider'; import { useSignalRContext } from '@/contexts/signalrProvider'; import { fetchMemberInfo } from '@/lib/api/account'; import { getAccessToken } from '@/lib/utils/server'; import { decodeAccessToken, throwError } from '@/lib/utils/client'; export default function useAuth() { const { isAuthenticated, isLoading, setIsAuthenticated, checkAuth } = useAuthContext(); const { member, setMember } = useMemberContext(); const { stopConnection } = useSignalRContext(); const [rememberMe, setRememberMe] = useState(false); const [memberLoaded, setMemberLoaded] = useState(false); useEffect(() => { if (memberLoaded && member) { setMemberState(true); setMemberLoaded(false); } }, [memberLoaded]); // 로그인 const login = async (rememberMe: boolean) => { const accessToken = await getAccessToken(); if (!accessToken) { return; } const tokenData = decodeAccessToken(accessToken); if (!tokenData) { return; } setRememberMe(rememberMe); fetchMemberInfo().then((res) => { if (!res.ok) { throwError(res); } setMember(res.data); setMemberLoaded(true); }); }; // 로그아웃 const logout = async () => { const res = await fetch('/api/auth/logout', { method: 'POST', credentials: 'include' }); if (res.ok) { setMemberState(false); } }; const setMemberState = async (state: boolean) => { setIsAuthenticated(state); if (state) { // 로그인 localStorage.setItem('rememberMe', rememberMe.toString()); localStorage.setItem("member", JSON.stringify(member)); // 회원 정보 보관 } else { // 로그아웃 alert('로그아웃 되었습니다.'); localStorage.setItem('rememberMe', "false"); localStorage.removeItem('member'); await stopConnection(); } location.replace('/'); }; // 로그인 여부 확인 const isLogined = async () => { const res = await checkAuth(); if (!res) { if (confirm('로그인 후 이용해주세요.\n\n로그인 하시겠습니까?')) { location.href = '/login'; } else { return false; } } else { return true; } }; return { isAuthenticated, isLoading, login, logout, member, isLogined }; }