useAuth.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. 'use client';
  2. import { useAuthContext } from '@/contexts/authProvider';
  3. import { useMemberContext } from '@/contexts/memberProvider';
  4. import { getAccessToken } from '@/lib/utils/server';
  5. import { fetchApi, decodeAccessToken } from '@/lib/utils/client';
  6. import { MemberResponse } from '@/types/response/account/member';
  7. export default function useAuth()
  8. {
  9. const { isAuthenticated, isLoading, setIsAuthenticated } = useAuthContext();
  10. const { member, setMember } = useMemberContext();
  11. // 로그인
  12. const login = async (rememberMe: boolean) => {
  13. const accessToken = await getAccessToken();
  14. if (!accessToken) {
  15. return;
  16. }
  17. const tokenData = decodeAccessToken(accessToken);
  18. if (!tokenData) {
  19. return;
  20. }
  21. fetchApi<MemberResponse>('/api/auth/profile', {
  22. method: 'GET'
  23. }).then((res) => {
  24. setIsAuthenticated(true);
  25. setMember(res.data);
  26. localStorage.setItem('rememberMe', rememberMe.toString());
  27. localStorage.setItem("member", JSON.stringify(res.data));
  28. document.cookie = `member=${encodeURIComponent(JSON.stringify(res.data))}; path=/; max-age=${60 * 60 * 24 * 30}`;
  29. location.replace('/');
  30. }).catch(err => {
  31. console.error('로그인 처리 중 오류:', err);
  32. });
  33. };
  34. // 로그아웃
  35. const logout = async () => {
  36. fetchApi('/api/auth/logout', {
  37. method: 'POST',
  38. silent: true
  39. }).finally(() => {
  40. setIsAuthenticated(false);
  41. setMember(null);
  42. localStorage.setItem('rememberMe', "false");
  43. localStorage.removeItem('member');
  44. document.cookie = 'member=; path=/; max-age=0';
  45. location.replace('/');
  46. });
  47. };
  48. // 로그인 여부 확인
  49. const loginCheck = (): boolean => {
  50. // SSR 가드: 서버 렌더링 시 localStorage 접근 불가. 실제 권한 검증은 middleware 가 담당.
  51. if (typeof window === 'undefined') {
  52. return true;
  53. }
  54. if (!localStorage.getItem('member')) {
  55. if (confirm('로그인 후 이용 가능합니다.\n로그인하시겠습니까?')) {
  56. window.dispatchEvent(new CustomEvent('auth:unauthorized'));
  57. }
  58. return false;
  59. }
  60. return true;
  61. };
  62. return { isAuthenticated, isLoading, login, logout, member, loginCheck };
  63. }