useAuth.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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, throwError } 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. throwError(res);
  25. setIsAuthenticated(true);
  26. setMember(res.data);
  27. localStorage.setItem('rememberMe', rememberMe.toString());
  28. localStorage.setItem("member", JSON.stringify(res.data));
  29. document.cookie = `member=${encodeURIComponent(JSON.stringify(res.data))}; path=/; max-age=${60 * 60 * 24 * 30}`;
  30. location.replace('/');
  31. }).catch(err => {
  32. console.error('로그인 처리 중 오류:', err);
  33. });
  34. };
  35. // 로그아웃
  36. const logout = async () => {
  37. fetchApi('/api/auth/logout', {
  38. method: 'POST'
  39. }).then((res) => {
  40. throwError(res);
  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. }).catch(err => {
  48. console.error('로그인 처리 중 오류:', err);
  49. });
  50. };
  51. // 로그인 여부 확인
  52. const loginCheck = (): boolean => {
  53. if (!localStorage.getItem('member')) {
  54. if (confirm('로그인 후 이용 가능합니다.\n로그인하시겠습니까?')) {
  55. window.dispatchEvent(new CustomEvent('auth:unauthorized'));
  56. }
  57. return false;
  58. }
  59. return true;
  60. };
  61. return { isAuthenticated, isLoading, login, logout, member, loginCheck };
  62. }