auth_context.js 2.88 KB
Newer Older
Kim, Chaerin's avatar
Kim, Chaerin committed
1
2
import axios from "axios";
import { createContext, FC, useCallback, useContext, useState } from "react";
Kim, Chaerin's avatar
merge19    
Kim, Chaerin committed
3
import authApi from "../apis/user.api";
Kim, Chaerin's avatar
Kim, Chaerin committed
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { getLocalUser } from "../utils/auth";
import baseUrl from "../utils/baseUrl";
import catchErrors from "../utils/catchErrors";
import config from "../utils/clientConfig";

// type AuthContextType = {
//   error: string;
//   user: { userId: number; name: string; role: string } | null;
//   loading: boolean;
//   setUser: (user: any) => void;
//   login: (email: string, password: string) => Promise<boolean>;
//   logout: () => void;
//   catchErrorAuth: (error: any, displayError: Function) => void;
// };

const AuthContext = createContext<AuthContextType>({
  error: "",
  loading: false,
  user: null,
  setUser: () => {},
  login: () => Promise.resolve(false),
  logout: () => {},
  catchErrorAuth: (error, displayError) => {},
});

const AuthProvider = ({ children }) => {
  const [error, setError] = useState("");
  const [loading, setLoading] = useState(false);
  const [user, setUser] = useState(getLocalUser());

  const login = useCallback(async (email, password) => {
    try {
      setError("");
      setLoading(true);
      const user = await authApi.login(email, password);
이재연's avatar
이재연 committed
39
      sessionStorage.setItem(config.loginUser, JSON.stringify(user));
Kim, Chaerin's avatar
Kim, Chaerin committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
      setUser(user);

      return true;
    } catch (error) {
      catchErrors(error, setError);
      return false;
    } finally {
      setLoading(false);
    }
  }, []);

  const logout = useCallback(async () => {
    try {
      setError("");
      setUser(null);
      alert("로그아웃되었습니다.");
이재연's avatar
이재연 committed
56
      sessionStorage.removeItem(config.loginUser);
Kim, Chaerin's avatar
Kim, Chaerin committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
      setLoading(true);
      await axios.get(`${baseUrl}/api/auth/logout`);
    } catch (error) {
      catchErrors(error, setError);
    } finally {
      setLoading(false);
    }
  }, []);

  const catchErrorAuth = useCallback(async (error, displayError) => {
    let errorMsg;
    if (error.response) {
      if (typeof error.response.data === "string") {
        errorMsg = error.response.data;
        console.log("Error response:", errorMsg);
      } else {
        const { data } = error.response;
        if (data.redirectUrl) {
          errorMsg = data.message;
          console.log("Error response with redirected message:", errorMsg);
          console.log("redirect url", data.redirectUrl);
          return await logout();
        }
      }
    } else if (error.request) {
      errorMsg = error.request;
      console.log("Error request:", errorMsg);
    } else {
      errorMsg = error.message;
      console.log("Error message:", errorMsg);
    }

    displayError(errorMsg);
  }, []);

  return (
    <AuthContext.Provider
      value={{ error, loading, user, setUser, login, logout, catchErrorAuth }}
    >
      {children}
    </AuthContext.Provider>
  );
};

const useAuth = () => useContext(AuthContext);

export { AuthProvider, useAuth };