59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import axios from "axios";
|
||
interface MakeRequest {
|
||
method?: string;
|
||
url: string;
|
||
body?: unknown;
|
||
useToken?: boolean;
|
||
contentType?: boolean;
|
||
signal?: AbortSignal;
|
||
}
|
||
|
||
export default (props: MakeRequest) => {
|
||
return new Promise(async (resolve, reject) => {
|
||
await makeRequest(props)
|
||
.then((r) => resolve(r))
|
||
.catch((r) => reject(r));
|
||
});
|
||
};
|
||
|
||
function makeRequest({ method = "post", url, body, useToken = true, signal, contentType = false }: MakeRequest) {
|
||
//В случае 401 рефреш должен попробовать вызваться 1 раз
|
||
let counterRefresh = true;
|
||
let headers: any = {};
|
||
if (useToken) headers["Authorization"] = localStorage.getItem("AT");
|
||
if (contentType) headers["Content-Type"] = "application/json";
|
||
return axios({
|
||
url: url,
|
||
method: method,
|
||
headers: headers,
|
||
data: body,
|
||
signal,
|
||
})
|
||
.then((response) => {
|
||
if (response.data && response.data.accessToken) {
|
||
localStorage.setItem("AT", response.data.accessToken);
|
||
}
|
||
return response;
|
||
})
|
||
.catch((error) => {
|
||
if (error.response.status == 401 && counterRefresh) {
|
||
refresh().then((response) => {
|
||
if (response.data && response.data.accessToken) localStorage.setItem("AT", response.data.accessToken);
|
||
counterRefresh = false;
|
||
});
|
||
} else {
|
||
throw error;
|
||
}
|
||
throw error;
|
||
});
|
||
}
|
||
|
||
function refresh() {
|
||
return axios("https://admin.pena.digital/auth/refresh", {
|
||
headers: {
|
||
Authorization: localStorage.getItem("AT"),
|
||
"Content-Type": "application/json",
|
||
},
|
||
});
|
||
}
|