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