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