40 lines
1.0 KiB
JavaScript
40 lines
1.0 KiB
JavaScript
import axios from "axios";
|
|
import jwt_decode from "jwt-decode";
|
|
import dayjs from "dayjs";
|
|
import { useContext } from "react";
|
|
import AuthContext from "../context/AuthContext";
|
|
|
|
const baseURL = `http://${process.env.REACT_APP_DOMAIN}/api/auth`;
|
|
|
|
const useAxios = () => {
|
|
const { authTokens, setUser, setAuthTokens } = useContext(AuthContext);
|
|
|
|
const axiosInstance = axios.create({
|
|
baseURL,
|
|
headers: { Authorization: `Bearer ${authTokens?.access}` }
|
|
});
|
|
|
|
axiosInstance.interceptors.request.use(async req => {
|
|
const user = jwt_decode(authTokens.access);
|
|
const isExpired = dayjs.unix(user.exp).diff(dayjs()) < 1;
|
|
|
|
if (!isExpired) return req;
|
|
|
|
const response = await axios.post(`${baseURL}/token/`, {
|
|
refresh: authTokens.refresh
|
|
});
|
|
|
|
localStorage.setItem("authTokens", JSON.stringify(response.data));
|
|
|
|
setAuthTokens(response.data);
|
|
setUser(jwt_decode(response.data.access));
|
|
|
|
req.headers.Authorization = `Bearer ${response.data.access}`;
|
|
return req;
|
|
});
|
|
|
|
return axiosInstance;
|
|
};
|
|
|
|
export default useAxios;
|