Guest navigation state
This commit is contained in:
@@ -46,7 +46,8 @@ function blurAfter() {
|
|||||||
<RouterLink to="/">
|
<RouterLink to="/">
|
||||||
<img src="/17RBN_Logo.png" class="w-10 h-10 object-contain"></img>
|
<img src="/17RBN_Logo.png" class="w-10 h-10 object-contain"></img>
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
<div class="h-15 flex items-center justify-center">
|
<!-- Member navigation -->
|
||||||
|
<div v-if="auth.accountStatus == 'member'" class="h-15 flex items-center justify-center">
|
||||||
<NavigationMenu>
|
<NavigationMenu>
|
||||||
<NavigationMenuList class="gap-3">
|
<NavigationMenuList class="gap-3">
|
||||||
|
|
||||||
@@ -91,7 +92,8 @@ function blurAfter() {
|
|||||||
</NavigationMenuItem>
|
</NavigationMenuItem>
|
||||||
|
|
||||||
<!-- Administration (Dropdown) -->
|
<!-- Administration (Dropdown) -->
|
||||||
<NavigationMenuItem v-if="auth.hasAnyRole(['17th Administrator', '17th HQ', '17th Command', 'Recruiter'])">
|
<NavigationMenuItem
|
||||||
|
v-if="auth.hasAnyRole(['17th Administrator', '17th HQ', '17th Command', 'Recruiter'])">
|
||||||
<NavigationMenuTrigger>Administration</NavigationMenuTrigger>
|
<NavigationMenuTrigger>Administration</NavigationMenuTrigger>
|
||||||
<NavigationMenuContent
|
<NavigationMenuContent
|
||||||
class="grid gap-1 p-2 text-left [&_a]:w-full [&_a]:block [&_a]:whitespace-nowrap *:bg-transparent">
|
class="grid gap-1 p-2 text-left [&_a]:w-full [&_a]:block [&_a]:whitespace-nowrap *:bg-transparent">
|
||||||
@@ -145,6 +147,18 @@ function blurAfter() {
|
|||||||
</NavigationMenuList>
|
</NavigationMenuList>
|
||||||
</NavigationMenu>
|
</NavigationMenu>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Guest navigation -->
|
||||||
|
<div v-else class="h-15 flex items-center justify-center">
|
||||||
|
<NavigationMenu>
|
||||||
|
<NavigationMenuList>
|
||||||
|
<NavigationMenuItem>
|
||||||
|
<NavigationMenuLink as-child :class="navigationMenuTriggerStyle()">
|
||||||
|
<RouterLink to="/join" @click="blurAfter">Join</RouterLink>
|
||||||
|
</NavigationMenuLink>
|
||||||
|
</NavigationMenuItem>
|
||||||
|
</NavigationMenuList>
|
||||||
|
</NavigationMenu>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- right side -->
|
<!-- right side -->
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ import { Role } from "@shared/types/roles"
|
|||||||
export function useAuth() {
|
export function useAuth() {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
|
|
||||||
|
// Account status control
|
||||||
|
const accountStatus = userStore.state;
|
||||||
|
|
||||||
|
// RBAC
|
||||||
const roles = computed<string[]>(() => {
|
const roles = computed<string[]>(() => {
|
||||||
return userStore.user?.roleData?.map((r: Role) => r.name) ?? [];
|
return userStore.user?.roleData?.map((r: Role) => r.name) ?? [];
|
||||||
});
|
});
|
||||||
@@ -28,5 +32,5 @@ export function useAuth() {
|
|||||||
return roles.value.every(name => roleNames.includes(name))
|
return roles.value.every(name => roleNames.includes(name))
|
||||||
}
|
}
|
||||||
|
|
||||||
return { hasRole, hasAnyRole, hasAllRoles }
|
return { hasRole, hasAnyRole, hasAllRoles, accountStatus }
|
||||||
}
|
}
|
||||||
@@ -5,7 +5,7 @@ export const useUserStore = defineStore('user', () => {
|
|||||||
const user = ref(null)
|
const user = ref(null)
|
||||||
const roles = computed(() => new Set(user.value?.roleData?.map(r => r.name) ?? []));
|
const roles = computed(() => new Set(user.value?.roleData?.map(r => r.name) ?? []));
|
||||||
const loaded = ref(false);
|
const loaded = ref(false);
|
||||||
const state = computed(() => user.value.state);
|
const state = computed<string | undefined>(() => user.value?.state || undefined);
|
||||||
const isLoggedIn = computed(() => user.value !== null)
|
const isLoggedIn = computed(() => user.value !== null)
|
||||||
|
|
||||||
async function loadUser() {
|
async function loadUser() {
|
||||||
|
|||||||
Reference in New Issue
Block a user