| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- '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<boolean>(false);
- const [memberLoaded, setMemberLoaded] = useState(<boolean>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 };
- }
|