From 67bc310158699f642ee2eee969ab9c6d47546256 Mon Sep 17 00:00:00 2001 From: Vinicius Souza Date: Fri, 8 Nov 2024 11:50:57 +0000 Subject: [PATCH] feat: pass signOut function to api interceptor So it can logout the user when the token expires and refresh token fails --- src/contexts/AuthContext.tsx | 8 ++++++++ src/services/api.ts | 33 ++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/contexts/AuthContext.tsx b/src/contexts/AuthContext.tsx index 675b834..16656e2 100644 --- a/src/contexts/AuthContext.tsx +++ b/src/contexts/AuthContext.tsx @@ -102,6 +102,14 @@ export function AuthContextProvider({ children }: AuthContextProviderProps) { loadUserData(); }, []); + useEffect(() => { + const subscription = api.registerInterceptTokenManager(signOut); + + return () => { + subscription(); + }; + }, [signOut]); + return ( diff --git a/src/services/api.ts b/src/services/api.ts index eff5d19..025d28f 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -1,10 +1,15 @@ -import axios from 'axios'; +import axios, { AxiosInstance } from 'axios'; import { AppError } from '@utils/AppError'; +type SignOut = () => void; +type APIInstanceProps = AxiosInstance & { + registerInterceptTokenManager: (signOut: SignOut) => () => void; +}; + const api = axios.create({ baseURL: 'http://192.168.0.61:3333', -}); +}) as APIInstanceProps; api.interceptors.request.use( (config) => { @@ -15,14 +20,20 @@ api.interceptors.request.use( }, ); -api.interceptors.response.use( - (response) => response, - (error) => { - if (error.response && error.response.data) { - return Promise.reject(new AppError(error.response.data.message)); - } - return Promise.reject(error); - }, -); +api.registerInterceptTokenManager = (signOut: SignOut) => { + const interceptTokenManager = api.interceptors.response.use( + (response) => response, + (error) => { + if (error.response && error.response.data) { + return Promise.reject(new AppError(error.response.data.message)); + } + return Promise.reject(error); + }, + ); + + return () => { + api.interceptors.response.eject(interceptTokenManager); + }; +}; export { api };