index.ts 1.49 KB
import { defineStore } from "pinia";
import { clearToken } from "@/utils/auth";
import useAuthApi from "@/api/auth";
import { AuthorizedState } from "./type";
import { Message } from "@arco-design/web-vue";
import { removeRouteListener } from "@/utils/route-listener";
// eslint-disable-next-line import/no-cycle
import { useAppStore } from "@/store";

const useAuthorizedStore = defineStore("authorized", {
  state: (): AuthorizedState => ({
    id: undefined,
    nick_name: undefined,
    avatar: undefined,
    permissions: [],
    can_create_demo: 0
  }),
  getters: {
    authorizedInfo(state: AuthorizedState): AuthorizedState {
      return { ...state };
    },
    getKey(state: AuthorizedState): number {
      return state.id || 0;
    },
    isCreateDemo(state: AuthorizedState) {
      return state.can_create_demo;
    }
  },
  actions: {
    setInfo(partial: Partial<AuthorizedState>) {
      // @ts-ignore
      this.$patch(partial);
    },
    async syncInfo() {
      const { user, permissions, menus, can_create_demo } = await useAuthApi.info();
      this.setInfo({ ...user, can_create_demo, permissions });
      useAppStore().setPermissions(menus as any);
    },
    async logout() {
      this.$reset();
      clearToken();
      removeRouteListener();
      window.location.reload();
      Message.success("登出成功");
    },

    async syncToken() {
      // TODO
      // const { data } = await refreshToken();
      // setToken(data.access_token);
    }
  }
});

export default useAuthorizedStore;