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", }, }); }