import axios from 'axios' import { create } from "zustand"; import { persist } from "zustand/middleware"; type Token = string interface AuthStore { token: Token // setToken: () => Promise; } interface FirstRequest { method?: string url: string body?: unknown useToken?: boolean contentType?: boolean } export const authStore = create()( persist( (set, get) => ({ token: "", makeRequest: (props:FirstRequest) => { const newProps = {...props, HC: (newToken:Token) => set({ token: newToken }),token: get().token} return ( new Promise(async (resolve, reject) => { await makeRequest(newProps) .then(r => resolve(r)) .catch(r => reject(r)) }) ) }, clearToken: () => set({token: ""}) }), { name: "token" } ) ); interface MakeRequest extends FirstRequest { HC: (newToken:Token) => void token:Token } function makeRequest({ method = "post", url, body, useToken = true, contentType = false, HC, token }: MakeRequest) { //В случае 401 рефреш должен попробовать вызваться 1 раз let counterRefresh = true let headers: any = {} if (useToken) headers["Authorization"] = token if (contentType) headers["Content-Type"] = "application/json" return axios({ url: url, method: method, headers: headers, data: body }) .then(response => { if (response.data && response.data.accessToken) { HC(response.data.accessToken) } return response }) .catch(error => { if (error.response.status == 401 && counterRefresh) { refresh().then(response => { if (response.data && response.data.accessToken) HC(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" } }) }