2023-03-20 11:40:19 +00:00
|
|
|
|
import axios from "axios";
|
2023-03-19 15:26:39 +00:00
|
|
|
|
import { create } from "zustand";
|
|
|
|
|
import { persist } from "zustand/middleware";
|
|
|
|
|
|
2023-03-20 11:40:19 +00:00
|
|
|
|
type Token = string;
|
2023-03-19 15:26:39 +00:00
|
|
|
|
interface AuthStore {
|
2023-03-20 11:40:19 +00:00
|
|
|
|
token: Token;
|
|
|
|
|
// setToken: () => Promise;
|
2023-03-19 15:26:39 +00:00
|
|
|
|
}
|
|
|
|
|
interface FirstRequest {
|
2023-03-20 11:40:19 +00:00
|
|
|
|
method?: string;
|
|
|
|
|
url: string;
|
|
|
|
|
body?: unknown;
|
|
|
|
|
useToken?: boolean;
|
|
|
|
|
contentType?: boolean;
|
2023-03-19 15:26:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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",
|
|
|
|
|
}
|
|
|
|
|
)
|
2023-03-19 15:26:39 +00:00
|
|
|
|
);
|
|
|
|
|
interface MakeRequest extends FirstRequest {
|
2023-03-20 11:40:19 +00:00
|
|
|
|
HC: (newToken: Token) => void;
|
|
|
|
|
token: Token;
|
2023-03-19 15:26:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
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-19 15:26:39 +00:00
|
|
|
|
})
|
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;
|
|
|
|
|
});
|
2023-03-19 15:26:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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",
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
}
|