import axios from "axios"; import jwt_decode from "jwt-decode"; import { JWT_REFRESH_TOKEN, JWT_TOKEN } from "../../constants/localStorage"; import { attachBeforeRequestListener } from "../../request/index"; import { getData } from "../../service/asyncStorage"; import { logoutUser, refreshUserToken } from "../actions/login/loginActions"; export const accessTokensMiddlewareInterceptorName = "ACCESS_TOKEN_INTERCEPTOR"; export default ({ dispatch }) => (next) => (action) => { attachBeforeRequestListener(async (response) => { const jwtToken = await getData(JWT_TOKEN); const refresh = await getData(JWT_REFRESH_TOKEN); if (!jwtToken || !refresh) return Promise.resolve(response); const jwtTokenDecoded = jwt_decode(jwtToken); const refreshTokenDecoded = jwt_decode(refresh); if (!response.headers?.Authorization) { response.headers.Authorization = `Bearer ${jwtToken}`; } // If refresh token is expired, log out user if (new Date() > new Date(refreshTokenDecoded?.exp * 1000)) { dispatch(logoutUser()); return Promise.resolve(response); } // If access token is expired, refresh access token if (new Date() > new Date(jwtTokenDecoded.exp * 1000)) { const axiosResponse = await axios.post( "https://strapi.dilig.net/api/token/refresh", { refreshToken: refresh, }, { headers: { Authorization: `Bearer ${jwtToken}` }, } ); const newToken = axiosResponse.data; response.headers.Authorization = `Bearer ${newToken.jwt}`; dispatch(refreshUserToken(newToken)); } return Promise.resolve(response); }, accessTokensMiddlewareInterceptorName); next(action); };