90 lines
2.4 KiB
TypeScript
90 lines
2.4 KiB
TypeScript
|
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"
|
|||
|
}
|
|||
|
})
|
|||
|
}
|