useAuth.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. }).then(() => {
  39. setIsAuthenticated(false);
  40. setMember(null);
  41. localStorage.setItem('rememberMe', "false");
  42. localStorage.removeItem('member');
  43. document.cookie = 'member=; path=/; max-age=0';
  44. location.replace('/');
  45. }).catch(err => {
  46. console.error('로그인 처리 중 오류:', err);
  47. });
  48. };
  49. // 로그인 여부 확인
  50. const loginCheck = (): boolean => {
  51. if (!localStorage.getItem('member')) {
  52. if (confirm('로그인 후 이용 가능합니다.\n로그인하시겠습니까?')) {
  53. window.dispatchEvent(new CustomEvent('auth:unauthorized'));
  54. }
  55. return false;
  56. }
  57. return true;
  58. };
  59. return { isAuthenticated, isLoading, login, logout, member, loginCheck };
  60. }