diff --git a/frontend/src/apis/answer.api.ts b/frontend/src/apis/answer.api.ts index 66a847623d16f13a38e9d6802ced3110493f9384..f455fb253ba2cde304ae7b09641c8b7aeff46ecd 100644 --- a/frontend/src/apis/answer.api.ts +++ b/frontend/src/apis/answer.api.ts @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from "./axios.config"; import { IAnswer, IAnswerRequestData } from "../types"; import baseUrl from "./baseUrl"; diff --git a/frontend/src/apis/auth.api.ts b/frontend/src/apis/auth.api.ts index e3421ff117b1ae28810f9c8d6a45e22c988040cd..341708f5bd1b69031502d6fef7a569bcf64b3894 100644 --- a/frontend/src/apis/auth.api.ts +++ b/frontend/src/apis/auth.api.ts @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from "./axios.config"; import { SignupUser } from "../types"; import baseUrl from "./baseUrl"; diff --git a/frontend/src/apis/axios.config.ts b/frontend/src/apis/axios.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e145918894b770f4abc25398332bf6d3d1a7af0 --- /dev/null +++ b/frontend/src/apis/axios.config.ts @@ -0,0 +1,5 @@ +import axios from "axios"; + +const customAxios = axios.create(); + +export default customAxios; diff --git a/frontend/src/apis/index.ts b/frontend/src/apis/index.ts index a5725e59c949ba6e4e4bdcc1215ce18dd0f3088c..fe9b959f8de9876801f9f69e8ea33c6e2af88bd5 100644 --- a/frontend/src/apis/index.ts +++ b/frontend/src/apis/index.ts @@ -3,3 +3,5 @@ export * as questionApi from "./question.api"; export * as surveyApi from "./survey.api"; export * as answerApi from "./answer.api"; export { baseImageUrl } from "./baseUrl"; +export { default as customAxios } from "./axios.config"; +export { useAxiosInterceptor } from "./useAxiosInterceptor"; diff --git a/frontend/src/apis/question.api.ts b/frontend/src/apis/question.api.ts index f35cffa0c023c1b14434ae37b3009da9db2e80b6..280eba876a3dad806ed44c05aa1c7e88527e9dda 100644 --- a/frontend/src/apis/question.api.ts +++ b/frontend/src/apis/question.api.ts @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from "./axios.config"; import { IQuestionData } from "../types"; import baseUrl from "./baseUrl"; diff --git a/frontend/src/apis/survey.api.ts b/frontend/src/apis/survey.api.ts index 42348d049bb73f6d706f35f8d6d05e0bf00d7e38..54e2690003ae71f74eb9c2e138ad7b58ab67d5b8 100644 --- a/frontend/src/apis/survey.api.ts +++ b/frontend/src/apis/survey.api.ts @@ -1,4 +1,4 @@ -import axios from "axios"; +import axios from "./axios.config"; import { CreateQuestionData, IQuestionData, ISurvey } from "../types"; import baseUrl from "./baseUrl"; diff --git a/frontend/src/apis/useAxiosInterceptor.ts b/frontend/src/apis/useAxiosInterceptor.ts new file mode 100644 index 0000000000000000000000000000000000000000..858f59b84892733aee44833be500ceb41ec65fb2 --- /dev/null +++ b/frontend/src/apis/useAxiosInterceptor.ts @@ -0,0 +1,26 @@ +import { useEffect } from "react"; +import { NavigateFunction, useLocation } from "react-router-dom"; +import customAxios from "./axios.config"; + +export const useAxiosInterceptor = (navigate: NavigateFunction) => { + const location = useLocation(); + + useEffect(() => { + const responseInterceptor = customAxios.interceptors.response.use( + (response) => response, + (error) => { + if (error.response.status === 401) { + navigate("/login", { + replace: true, + state: { from: location.pathname }, + }); + } + return Promise.reject(error); + } + ); + + return () => { + customAxios.interceptors.response.eject(responseInterceptor); + }; + }, []); +}; diff --git a/frontend/src/layouts/BaseLayout.tsx b/frontend/src/layouts/BaseLayout.tsx index 73ef198b727c2ff1778e39299dac0facebe1edc2..f6f1b141d964efd2de72a7134a6975dfeb7411a0 100644 --- a/frontend/src/layouts/BaseLayout.tsx +++ b/frontend/src/layouts/BaseLayout.tsx @@ -1,9 +1,13 @@ import React from "react"; -import { Outlet } from "react-router-dom"; +import { Outlet, useNavigate } from "react-router-dom"; +import { useAxiosInterceptor } from "../apis"; import { AuthProvider } from "../auth"; import { Header } from "../commons"; export const BaseLayout = () => { + const navigate = useNavigate(); + useAxiosInterceptor(navigate); + return (