37 lines
1015 B
TypeScript
37 lines
1015 B
TypeScript
import { ref, computed } from 'vue'
|
|
import { defineStore } from 'pinia'
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
const user = ref(null)
|
|
const roles = computed(() => new Set(user.value?.roleData?.map(r => r.name) ?? []));
|
|
const loaded = ref(false);
|
|
const state = computed(() => user.value.state);
|
|
const isLoggedIn = computed(() => user.value !== null)
|
|
|
|
async function loadUser() {
|
|
//@ts-ignore
|
|
const res = await fetch(`${import.meta.env.BASE_URL}/members/me`, {
|
|
credentials: 'include',
|
|
});
|
|
|
|
if (res.ok) {
|
|
const data = await res.json();
|
|
user.value = data;
|
|
}
|
|
|
|
loaded.value = true;
|
|
}
|
|
|
|
|
|
function hasRole(role: string): boolean {
|
|
return roles.value.has(role)
|
|
}
|
|
|
|
|
|
function hasAnyRole(requiredRoles: string[]): boolean {
|
|
return requiredRoles.some(r => roles.value.has(r))
|
|
}
|
|
|
|
return { user, isLoggedIn, roles, loadUser, loaded, hasAnyRole, hasRole, state }
|
|
})
|