front-hub/src/stores/makeRequest.ts

81 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-03-20 11:40:19 +00:00
import axios from "axios";
import { create } from "zustand";
import { persist } from "zustand/middleware";
2023-03-20 11:40:19 +00:00
type Token = string;
interface AuthStore {
2023-03-20 11:40:19 +00:00
token: Token;
// setToken: () => Promise;
}
interface FirstRequest {
2023-03-20 11:40:19 +00:00
method?: string;
url: string;
body?: unknown;
useToken?: boolean;
contentType?: boolean;
}
export const authStore = create<any>()(
2023-03-20 11:40:19 +00:00
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 {
2023-03-20 11:40:19 +00:00
HC: (newToken: Token) => void;
token: Token;
}
2023-03-20 11:40:19 +00:00
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;
})
2023-03-20 11:40:19 +00:00
.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() {
2023-03-20 11:40:19 +00:00
return axios("https://admin.pena.digital/auth/refresh", {
headers: {
Authorization: localStorage.getItem("AT"),
"Content-Type": "application/json",
},
});
}