| | 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, |
| | }, |
| | ), |
| | ); |
| |
|