feat: add vue admin transition shell
This commit is contained in:
1 parent
2cdf7f9d7a
commit
f07a61f3a8
30 files changed
+2127
-7
No files matched your search
@@ -0,0 +1,70 @@
|
||||
import { computed, ref } from "vue";
|
||||
import { defineStore } from "pinia";
|
||||
import * as api from "@/api/client";
|
||||
import type { AdminMenu, AdminProfile, AdminUser } from "@/types";
|
||||
|
||||
export const useAuthStore = defineStore("auth", () => {
|
||||
const user = ref<AdminUser | null>(null);
|
||||
const menus = ref<AdminMenu[]>([]);
|
||||
const permissions = ref<string[]>([]);
|
||||
const initialized = ref(false);
|
||||
const loading = ref(false);
|
||||
const isAuthenticated = computed(() => Boolean(user.value && api.getAccessToken()));
|
||||
|
||||
function applyProfile(profile: AdminProfile) {
|
||||
user.value = profile.user;
|
||||
menus.value = profile.menus;
|
||||
permissions.value = profile.permissions;
|
||||
}
|
||||
|
||||
async function loadProfile() {
|
||||
applyProfile(await api.getProfile());
|
||||
}
|
||||
|
||||
async function bootstrap() {
|
||||
if (initialized.value) return;
|
||||
loading.value = true;
|
||||
try {
|
||||
const session = await api.refreshAccessToken();
|
||||
user.value = session.user;
|
||||
await loadProfile();
|
||||
} catch {
|
||||
api.setAccessToken(null);
|
||||
user.value = null;
|
||||
menus.value = [];
|
||||
permissions.value = [];
|
||||
} finally {
|
||||
initialized.value = true;
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function login(email: string, password: string) {
|
||||
loading.value = true;
|
||||
try {
|
||||
const session = await api.login(email, password);
|
||||
api.setAccessToken(session.accessToken || session.token);
|
||||
user.value = session.user;
|
||||
await loadProfile();
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function logout() {
|
||||
try {
|
||||
await api.logout();
|
||||
} finally {
|
||||
api.setAccessToken(null);
|
||||
user.value = null;
|
||||
menus.value = [];
|
||||
permissions.value = [];
|
||||
}
|
||||
}
|
||||
|
||||
function hasPermission(permission: string) {
|
||||
return permissions.value.includes("*") || permissions.value.includes(permission);
|
||||
}
|
||||
|
||||
return { user, menus, permissions, initialized, loading, isAuthenticated, bootstrap, login, logout, hasPermission };
|
||||
});
|
||||
Reference in new issue
Block a user