You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.0 KiB
70 lines
2.0 KiB
import AuthAPI from "@/api/modules/auth";
|
|
import { store } from "@/store";
|
|
import { cache } from "@/utils/cache";
|
|
import { defineStore } from "pinia";
|
|
import { computed, ref, watch } from "vue";
|
|
|
|
export const useAuthStore = defineStore("auth", () => {
|
|
const ACCESS_TOKEN_KEY = "accessToken";
|
|
const REFRESH_TOKEN_KEY = "refreshToken";
|
|
const accessToken = ref(cache(ACCESS_TOKEN_KEY) ?? "");
|
|
const refreshToken = ref(cache(REFRESH_TOKEN_KEY) ?? "");
|
|
const isLoggedIn = computed(() => !!accessToken.value);
|
|
|
|
watch(accessToken, (newValue) => cache(ACCESS_TOKEN_KEY, newValue || null));
|
|
watch(refreshToken, (newValue) => cache(REFRESH_TOKEN_KEY, newValue || null));
|
|
|
|
// 注册
|
|
async function signUp(payload) {
|
|
const response = await AuthAPI.signUp(payload);
|
|
const prefix = response.tokenType ? `${response.tokenType} ` : "";
|
|
accessToken.value = prefix + response.accessToken;
|
|
refreshToken.value = prefix + response.refreshToken;
|
|
return response;
|
|
}
|
|
|
|
// 登录
|
|
async function signIn(payload) {
|
|
const response = await AuthAPI.signIn(payload);
|
|
const prefix = response.tokenType ? `${response.tokenType} ` : "";
|
|
accessToken.value = prefix + response.accessToken;
|
|
refreshToken.value = prefix + response.refreshToken;
|
|
return response;
|
|
}
|
|
|
|
// 登出
|
|
function signOut() {
|
|
accessToken.value = "";
|
|
refreshToken.value = "";
|
|
}
|
|
|
|
// 刷新token
|
|
async function refresh(payload) {
|
|
const response = await AuthAPI.refreshToken(payload);
|
|
const prefix = response.tokenType ? `${response.tokenType} ` : "";
|
|
accessToken.value = prefix + response.accessToken;
|
|
return response;
|
|
}
|
|
|
|
function setAccessToken(payload) {
|
|
accessToken.value = payload;
|
|
}
|
|
|
|
return {
|
|
accessToken,
|
|
refreshToken,
|
|
isLoggedIn,
|
|
signUp,
|
|
signIn,
|
|
signOut,
|
|
refresh,
|
|
setAccessToken
|
|
};
|
|
});
|
|
|
|
// 手动提供给 useStore() 函数 pinia 实例
|
|
// https://pinia.vuejs.org/zh/core-concepts/outside-component-usage.html#using-a-store-outside-of-a-component
|
|
export function useAuthStoreHook() {
|
|
return useAuthStore(store);
|
|
}
|