diff --git a/src/api/ansibleApi.js b/src/api/ansibleApi.js index 35b78fa..37d5a98 100644 --- a/src/api/ansibleApi.js +++ b/src/api/ansibleApi.js @@ -1,6 +1,8 @@ // src/api/todoApi.js import axios from 'axios'; import { attachAuthInterceptors } from './attachInterceptors'; +import { createApi } from './createApi'; +export const initAnsibleApi = (logout) => createApi(process.env.REACT_APP_API_ANSIBLE, logout); const ansibleApi = axios.create({ baseURL: process.env.REACT_APP_API_ANSIBLE, diff --git a/src/api/authApi.js b/src/api/authApi.js index 9513f0f..0d31a4e 100644 --- a/src/api/authApi.js +++ b/src/api/authApi.js @@ -1,6 +1,8 @@ // src/api/authApi.js import axios from "axios"; import { attachAuthInterceptors } from "./attachInterceptors"; +import { createApi } from './createApi'; +export const initAuthApi = (logout) => createApi(process.env.REACT_APP_API_AUTH, logout); const authApi = axios.create({ baseURL: process.env.REACT_APP_API_AUTH, diff --git a/src/api/blogApi.js b/src/api/blogApi.js index e8dbeab..881c4c0 100644 --- a/src/api/blogApi.js +++ b/src/api/blogApi.js @@ -1,6 +1,8 @@ // src/api/blogApi.js import axios from 'axios'; import { attachAuthInterceptors } from './attachInterceptors'; +import { createApi } from './createApi'; +export const initBlogApi = (logout) => createApi(process.env.REACT_APP_API_BLOG, logout); const blogApi = axios.create({ baseURL: process.env.REACT_APP_API_BLOG, diff --git a/src/api/boardApi.js b/src/api/boardApi.js index 6839e17..39aaa5a 100644 --- a/src/api/boardApi.js +++ b/src/api/boardApi.js @@ -1,5 +1,8 @@ +// src/api/boardApi.js import axios from "axios"; import { attachAuthInterceptors } from "./attachInterceptors"; +import { createApi } from './createApi'; +export const initBoardApi = (logout) => createApi(process.env.REACT_APP_API_BOARD, logout); const boardApi = axios.create({ baseURL: process.env.REACT_APP_API_BOARD, // ex) http://localhost:8801/api diff --git a/src/api/createApi.js b/src/api/createApi.js new file mode 100644 index 0000000..3d8d492 --- /dev/null +++ b/src/api/createApi.js @@ -0,0 +1,14 @@ +// src/api/createApi.js +import axios from 'axios'; +import { attachAuthInterceptors } from './attachInterceptors'; + + +export const createApi = (baseURL, logout = null) => { + const instance = axios.create({ + baseURL, + headers: { 'Content-Type': 'application/json' }, + }); + + attachAuthInterceptors(instance, logout); + return instance; +}; diff --git a/src/api/todoApi.js b/src/api/todoApi.js index 6f5a120..0cf7ad5 100644 --- a/src/api/todoApi.js +++ b/src/api/todoApi.js @@ -1,6 +1,8 @@ // src/api/todoApi.js import axios from 'axios'; import { attachAuthInterceptors } from './attachInterceptors'; +import { createApi } from './createApi'; +export const initTodoApi = (logout) => createApi(process.env.REACT_APP_API_TODO, logout); const todoApi = axios.create({ baseURL: process.env.REACT_APP_API_TODO, diff --git a/src/api/tokenUtils.js b/src/api/tokenUtils.js index d620ba3..4b4fe27 100644 --- a/src/api/tokenUtils.js +++ b/src/api/tokenUtils.js @@ -1,3 +1,4 @@ +// src/api/tokenUtils.js import axios from 'axios'; export const refreshAccessToken = async () => { diff --git a/src/context/AuthContext.js b/src/context/AuthContext.js index 3a91f98..0d53bab 100644 --- a/src/context/AuthContext.js +++ b/src/context/AuthContext.js @@ -1,36 +1,48 @@ -// src/context/AuthContext.js +// ✅ 8. src/context/AuthContext.js import { createContext, useContext, useState, useEffect } from 'react'; -import { decodeToken } from '../utils/jwt'; // ✅ JWT 디코딩 유틸 사용 +import { decodeToken } from '../utils/jwt'; +import { initAuthApi } from '../api/authApi'; +import { initBlogApi } from '../api/blogApi'; +import { initBoardApi } from '../api/boardApi'; +import { initTodoApi } from '../api/todoApi'; +import { initAnsibleApi } from '../api/ansibleApi'; const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [isLoggedIn, setIsLoggedIn] = useState(false); - const [user, setUser] = useState(null); // ✅ 추가 + const [user, setUser] = useState(null); - useEffect(() => { - const token = localStorage.getItem('access'); - if (token) { - const decoded = decodeToken(token); // payload 추출 - setUser(decoded); - setIsLoggedIn(true); - } - }, []); + const logout = () => { + localStorage.removeItem('access'); + localStorage.removeItem('refresh'); + setUser(null); + setIsLoggedIn(false); + }; const login = (tokenObj) => { localStorage.setItem('access', tokenObj.access); localStorage.setItem('refresh', tokenObj.refresh); const decoded = decodeToken(tokenObj.access); - setUser(decoded); // ✅ 로그인 시 user 저장 + setUser(decoded); setIsLoggedIn(true); }; - const logout = () => { - localStorage.removeItem('access'); - localStorage.removeItem('refresh'); - setUser(null); // ✅ 로그아웃 시 제거 - setIsLoggedIn(false); - }; + useEffect(() => { + const token = localStorage.getItem('access'); + if (token) { + const decoded = decodeToken(token); + setUser(decoded); + setIsLoggedIn(true); + } + + // ✅ API 초기화 시 logout 주입 + initAuthApi(logout); + initBlogApi(logout); + initBoardApi(logout); + initTodoApi(logout); + initAnsibleApi(logout); + }, []); return ( @@ -39,4 +51,4 @@ export const AuthProvider = ({ children }) => { ); }; -export const useAuth = () => useContext(AuthContext); +export const useAuth = () => useContext(AuthContext); \ No newline at end of file diff --git a/version b/version index 0e365fb..e92a7b7 100644 --- a/version +++ b/version @@ -1 +1 @@ -0.0.17-rc2 \ No newline at end of file +0.0.17-rc3 \ No newline at end of file