useAuth.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 'use client';
  2. import { useEffect, useState } from 'react';
  3. import { useAuthContext } from '@/contexts/authProvider';
  4. import { useMemberContext } from '@/contexts/memberProvider';
  5. import { useSignalRContext } from '@/contexts/signalrProvider';
  6. import { fetchMemberInfo } from '@/lib/api/account';
  7. import { getAccessToken } from '@/lib/utils/server';
  8. import { decodeAccessToken, throwError } from '@/lib/utils/client';
  9. export default function useAuth()
  10. {
  11. const { isAuthenticated, isLoading, setIsAuthenticated, checkAuth } = useAuthContext();
  12. const { member, setMember } = useMemberContext();
  13. const { stopConnection } = useSignalRContext();
  14. const [rememberMe, setRememberMe] = useState<boolean>(false);
  15. const [memberLoaded, setMemberLoaded] = useState(<boolean>false);
  16. useEffect(() => {
  17. if (memberLoaded && member) {
  18. setMemberState(true);
  19. setMemberLoaded(false);
  20. }
  21. }, [memberLoaded]);
  22. // 로그인
  23. const login = async (rememberMe: boolean) => {
  24. const accessToken = await getAccessToken();
  25. if (!accessToken) {
  26. return;
  27. }
  28. const tokenData = decodeAccessToken(accessToken);
  29. if (!tokenData) {
  30. return;
  31. }
  32. setRememberMe(rememberMe);
  33. fetchMemberInfo().then((res) => {
  34. if (!res.ok) {
  35. throwError(res);
  36. }
  37. setMember(res.data);
  38. setMemberLoaded(true);
  39. });
  40. };
  41. // 로그아웃
  42. const logout = async () => {
  43. const res = await fetch('/api/auth/logout', {
  44. method: 'POST',
  45. credentials: 'include'
  46. });
  47. if (res.ok) {
  48. setMemberState(false);
  49. }
  50. };
  51. const setMemberState = async (state: boolean) => {
  52. setIsAuthenticated(state);
  53. if (state) {
  54. // 로그인
  55. localStorage.setItem('rememberMe', rememberMe.toString());
  56. localStorage.setItem("member", JSON.stringify(member)); // 회원 정보 보관
  57. } else {
  58. // 로그아웃
  59. alert('로그아웃 되었습니다.');
  60. localStorage.setItem('rememberMe', "false");
  61. localStorage.removeItem('member');
  62. await stopConnection();
  63. }
  64. location.replace('/');
  65. };
  66. // 로그인 여부 확인
  67. const isLogined = async () => {
  68. const res = await checkAuth();
  69. if (!res) {
  70. if (confirm('로그인 후 이용해주세요.\n\n로그인 하시겠습니까?')) {
  71. location.href = '/login';
  72. } else {
  73. return false;
  74. }
  75. } else {
  76. return true;
  77. }
  78. };
  79. return { isAuthenticated, isLoading, login, logout, member, isLogined };
  80. }