import axios from 'axios';
const instance = axios.create({
timeout: 20000,
baseURL: ''
});
let isRefreshing = false;
let requests = [];
const refreshToken = () => {
return instance({
url: 'refreshTokenUrl',
method: 'post',
data: {
token: localStorage.getItem('token')
}
});
};
instance.interceptors.request.use(
config => {
return config;
},
error => {
Promise.reject(error);
}
);
instance.interceptors.response.use(
res => {
return res.data;
},
error => {
if (error.response?.status === 401 && !error.config.url.includes('refreshTokenUrl')) {
const { config } = error;
if (!isRefreshing) {
isRefreshing = true;
return refreshToken()
.then(res => {
if (res.token) {
localStorage.setItem('token', res.token);
requests.forEach(cb => cb(res.access_token));
requests = [];
return instance(config);
} else {
localStorage.clear();
}
})
.finally(() => {
isRefreshing = false;
});
} else {
return new Promise(resolve => {
requests.push(token => {
config.headers.token = token;
resolve(instance(config));
});
});
}
}
return Promise.resolve(error.response?.data);
}
);
export default {
get: (url = '', params = {}, option = {}) => {
return instance({
url,
method: 'GET',
params,
...option,
withCredentials: false
});
},
post: (url = '', params = {}, option = {}) => {
return instance({
url,
method: 'POST',
data: params,
...option,
withCredentials: false
});
},
put: (url = '', params = {}, option = {}) => {
return instance({
url,
method: 'PUT',
data: params,
...option,
withCredentials: false
});
},
delete: (url = '', params = {}, option = {}) => {
return instance({
url,
method: 'DELETE',
data: params,
...option,
withCredentials: false
});
},
fetch: (option = {}) => {
return instance(option);
}
};