Files
2026-07-21 15:36:49 +07:00

91 lines
3.0 KiB
JavaScript
Vendored

const AxiosManager = (() => {
const axiosInstance = axios.create({
baseURL: '/api',
headers: {
'accept': 'application/json',
'Content-Type': 'application/json',
}
});
let isRefreshing = false;
let retryQueue = [];
axiosInstance.interceptors.request.use(
(config) => {
const token = StorageManager.getAccessToken();
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
axiosInstance.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response && error.response.status === 498) {
if (!isRefreshing) {
isRefreshing = true;
try {
const refreshToken = StorageManager.getRefreshToken();
const response = await axiosInstance.post('/Security/RefreshToken', { refreshToken });
if (response?.data?.code === 200) {
StorageManager.saveLoginResult(response?.data);
isRefreshing = false;
retryQueue.forEach((cb) => cb());
retryQueue = [];
return axiosInstance(originalRequest);
} else {
throw new Error('Refresh token failed');
}
} catch (refreshError) {
retryQueue.forEach((cb) => cb());
retryQueue = [];
isRefreshing = false;
throw refreshError;
}
}
return new Promise((resolve, reject) => {
retryQueue.push(() => {
resolve(axiosInstance(originalRequest));
});
});
}
return Promise.reject(error);
}
);
const request = async (method, url, data = {}, customHeaders = {}, responseType = 'json') => {
try {
const response = await axiosInstance({
method,
url,
data,
headers: {
...customHeaders,
},
responseType,
});
return response;
} catch (error) {
throw error;
}
};
return {
request,
get: (url, config = {}) => request('get', url, {}, config.headers, config.responseType),
post: (url, data, config = {}) => request('post', url, data, config.headers, config.responseType),
put: (url, data, config = {}) => request('put', url, data, config.headers, config.responseType),
delete: (url, config = {}) => request('delete', url, {}, config.headers, config.responseType),
};
})();