front-hub/src/stores/makeRequest.ts

90 lines
2.4 KiB
TypeScript
Raw Normal View History

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