64 lines
1.4 KiB
TypeScript
64 lines
1.4 KiB
TypeScript
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<AuthUser | null>(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
|
|
}
|
|
})
|