90 lines
2.8 KiB
TypeScript
90 lines
2.8 KiB
TypeScript
'use client'
|
|
|
|
import axios from 'axios'
|
|
|
|
|
|
//let accessToken = localStorage.getItem('access') ? localStorage.getItem('access') : null
|
|
function setCookieFn(name:string, value:string, daysToExpire:number) {
|
|
const expires = new Date();
|
|
expires.setTime(expires.getTime() + (daysToExpire * 24 * 60 * 60 * 1000));
|
|
document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/`;
|
|
}
|
|
|
|
const axiosInstance = axios.create({
|
|
baseURL: `${process.env.NEXT_PUBLIC_API_URL}/`,
|
|
timeout: 10000,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
//'Authorization': `Bearer ${accessToken}`,
|
|
}
|
|
});
|
|
|
|
axiosInstance.interceptors.request.use(async req => {
|
|
const accessT = localStorage.getItem('admin_at')
|
|
req.headers.Authorization = `Bearer ${accessT}`
|
|
return req
|
|
})
|
|
|
|
axiosInstance.interceptors.response.use((response)=> {
|
|
return response
|
|
}, async (error) =>{
|
|
|
|
const originalRequest = error.config;
|
|
|
|
if (error.response.status === 401 && !originalRequest._retry) {
|
|
|
|
originalRequest._retry = true; // Prevent infinite loops
|
|
|
|
try {
|
|
|
|
if (localStorage.getItem('admin_rt') != 'undefined'){
|
|
const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/auth/refresh-token/`, {
|
|
method: "POST",
|
|
headers: {
|
|
'Content-Type': 'application/json; charset=UTF-8',
|
|
},
|
|
body: JSON.stringify({
|
|
'refresh': localStorage.getItem('admin_rt')
|
|
})
|
|
});
|
|
|
|
if(res.status==200){
|
|
setCookieFn('isAuth', 'true', 365)
|
|
const tokenData = await res.json()
|
|
localStorage.setItem('admin_at', tokenData.access)
|
|
localStorage.setItem('admin_rt',tokenData.refresh)
|
|
originalRequest.headers.Authorization = `Bearer ${tokenData.access}`
|
|
return axiosInstance(originalRequest)
|
|
}else{
|
|
|
|
}
|
|
} else {
|
|
|
|
localStorage.removeItem('admin_at');
|
|
localStorage.removeItem('admin_rt');
|
|
document.cookie = "isAuth=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
|
setTimeout(()=>{
|
|
window.location.replace('/login')
|
|
}, 200)
|
|
|
|
}
|
|
|
|
} catch(refreshError) {
|
|
|
|
localStorage.removeItem('admin_at');
|
|
localStorage.removeItem('admin_rt');
|
|
document.cookie = "isAuth=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
|
|
setTimeout(()=>{
|
|
window.location.replace('/login')
|
|
}, 200)
|
|
|
|
throw refreshError;
|
|
}
|
|
}
|
|
|
|
// Return a Promise rejection if the status code is not 401
|
|
return Promise.reject(error);
|
|
|
|
});
|
|
|
|
export default axiosInstance |