|
import { create } from "zustand"; |
|
import { persist } from "zustand/middleware"; |
|
import { StoreKey } from "../constant"; |
|
|
|
export interface AccessControlStore { |
|
accessCode: string; |
|
token: string; |
|
|
|
needCode: boolean; |
|
|
|
updateToken: (_: string) => void; |
|
updateCode: (_: string) => void; |
|
enabledAccessControl: () => boolean; |
|
isAuthorized: () => boolean; |
|
fetch: () => void; |
|
} |
|
|
|
let fetchState = 0; |
|
|
|
export const useAccessStore = create<AccessControlStore>()( |
|
persist( |
|
(set, get) => ({ |
|
token: "", |
|
accessCode: "", |
|
needCode: true, |
|
enabledAccessControl() { |
|
get().fetch(); |
|
|
|
return get().needCode; |
|
}, |
|
updateCode(code: string) { |
|
set((state) => ({ accessCode: code })); |
|
}, |
|
updateToken(token: string) { |
|
set((state) => ({ token })); |
|
}, |
|
isAuthorized() { |
|
|
|
return ( |
|
!!get().token || !!get().accessCode || !get().enabledAccessControl() |
|
); |
|
}, |
|
fetch() { |
|
if (fetchState > 0) return; |
|
fetchState = 1; |
|
fetch("/api/config", { |
|
method: "post", |
|
body: null, |
|
}) |
|
.then((res) => res.json()) |
|
.then((res: DangerConfig) => { |
|
console.log("[Config] got config from server", res); |
|
set(() => ({ ...res })); |
|
}) |
|
.catch(() => { |
|
console.error("[Config] failed to fetch config"); |
|
}) |
|
.finally(() => { |
|
fetchState = 2; |
|
}); |
|
}, |
|
}), |
|
{ |
|
name: StoreKey.Access, |
|
version: 1, |
|
}, |
|
), |
|
); |
|
|