import { computed, ref } from 'vue' import { defineStore } from 'pinia' export interface AuthUser { id: string email?: string | null firstName?: string | null lastName?: string | null roles: string[] } export const useAuthStore = defineStore('auth', () => { const isInitialized = ref(false) const user = ref(null) const roles = computed(() => user.value?.roles ?? []) const isAuthenticated = computed(() => !!user.value) const displayName = computed(() => { if (!user.value) { return '' } const fullName = [user.value.firstName, user.value.lastName].filter(Boolean).join(' ').trim() return fullName || user.value.email || user.value.id }) function initialize(nextUser: AuthUser | null = null) { user.value = nextUser isInitialized.value = true } function setUser(nextUser: AuthUser) { user.value = nextUser isInitialized.value = true } function clearSession() { user.value = null isInitialized.value = true } function hasRole(role: string) { return roles.value.includes(role) } function hasAnyRole(requiredRoles: string[]) { return requiredRoles.some((role) => roles.value.includes(role)) } return { displayName, hasAnyRole, hasRole, initialize, isAuthenticated, isInitialized, roles, setUser, clearSession, user } })