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(null); const menus = ref([]); const permissions = ref([]); 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() { const profile = await api.getProfile(); applyProfile(profile); menus.value = await api.getRouters(); } 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, captchaId: string, captchaCode: string, rememberMe = false) { loading.value = true; try { const session = await api.login(email, password, captchaId, captchaCode, rememberMe); 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 }; });