useAuth.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. const returnUrl = new URLSearchParams(location.search).get('returnUrl');
  30. location.replace(returnUrl && returnUrl.startsWith('/') && !returnUrl.startsWith('//') ? returnUrl : '/');
  31. }).catch(err => {
  32. console.error('로그인 처리 중 오류:', err);
  33. });
  34. };
  35. // 로그아웃
  36. const logout = async () => {
  37. fetchApi('/api/auth/logout', {
  38. method: 'POST',
  39. silent: true
  40. }).finally(() => {
  41. setIsAuthenticated(false);
  42. setMember(null);
  43. localStorage.setItem('rememberMe', "false");
  44. localStorage.removeItem('member');
  45. document.cookie = 'member=; path=/; max-age=0';
  46. location.replace('/');
  47. });
  48. };
  49. // 로그인 여부 확인
  50. const loginCheck = (): boolean => {
  51. // SSR 가드: 서버 렌더링 시 localStorage 접근 불가. 실제 권한 검증은 middleware 가 담당.
  52. if (typeof window === 'undefined') {
  53. return true;
  54. }
  55. if (!localStorage.getItem('member')) {
  56. if (confirm('로그인 후 이용 가능합니다.\n로그인하시겠습니까?')) {
  57. window.dispatchEvent(new CustomEvent('auth:unauthorized'));
  58. }
  59. return false;
  60. }
  61. return true;
  62. };
  63. return { isAuthenticated, isLoading, login, logout, member, loginCheck };
  64. }