mirror of https://github.com/wg-easy/wg-easy
7 changed files with 109 additions and 27 deletions
@ -0,0 +1,90 @@ |
|||||
|
<template> |
||||
|
<button |
||||
|
class="flex items-center pe-1 font-medium text-sm text-gray-400 rounded-full hover:text-red-800 dark:hover:text-red-800 md:me-0 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:text-neutral-400" |
||||
|
type="button" |
||||
|
@click.prevent="toggleMenu" |
||||
|
> |
||||
|
<IconsAvatar class="w-8 h-8 me-2 rounded-full" /> |
||||
|
{{ authStore.userData?.name }} |
||||
|
<svg |
||||
|
class="w-2.5 h-2.5 ms-3" |
||||
|
aria-hidden="true" |
||||
|
xmlns="http://www.w3.org/2000/svg" |
||||
|
fill="none" |
||||
|
viewBox="0 0 10 6" |
||||
|
> |
||||
|
<path |
||||
|
stroke="currentColor" |
||||
|
stroke-linecap="round" |
||||
|
stroke-linejoin="round" |
||||
|
stroke-width="2" |
||||
|
d="m1 1 4 4 4-4" |
||||
|
/> |
||||
|
</svg> |
||||
|
</button> |
||||
|
|
||||
|
<!-- Dropdown menu --> |
||||
|
<div |
||||
|
v-show="menuOpen" |
||||
|
class="z-10 bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-neutral-700 dark:divide-neutral-800" |
||||
|
> |
||||
|
<div class="px-4 py-3 text-sm text-gray-900 dark:text-white"> |
||||
|
<div class="truncate">{{ authStore.userData?.name }}</div> |
||||
|
<div class="truncate">@{{ authStore.userData?.username }}</div> |
||||
|
</div> |
||||
|
<ul class="py-2 text-sm text-gray-700 dark:text-gray-200"> |
||||
|
<li> |
||||
|
<NuxtLink |
||||
|
to="/" |
||||
|
class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white" |
||||
|
@click="closeMenu" |
||||
|
> |
||||
|
Clients |
||||
|
</NuxtLink> |
||||
|
</li> |
||||
|
<li v-if="authStore.userData?.role === 'ADMIN'"> |
||||
|
<NuxtLink |
||||
|
to="/admin" |
||||
|
class="block px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-600 dark:hover:text-white" |
||||
|
@click="closeMenu" |
||||
|
> |
||||
|
Admin Panel |
||||
|
</NuxtLink> |
||||
|
</li> |
||||
|
</ul> |
||||
|
<div class="py-2"> |
||||
|
<button |
||||
|
class="flex items-center gap-2 w-full px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white" |
||||
|
@click.prevent="logout" |
||||
|
> |
||||
|
<IconsLogout class="h-5" /> |
||||
|
{{ $t('logout') }} |
||||
|
</button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup lang="ts"> |
||||
|
const authStore = useAuthStore(); |
||||
|
const menuOpen = ref(false); |
||||
|
|
||||
|
function toggleMenu() { |
||||
|
menuOpen.value = !menuOpen.value; |
||||
|
} |
||||
|
|
||||
|
function closeMenu() { |
||||
|
menuOpen.value = false; |
||||
|
} |
||||
|
|
||||
|
async function logout() { |
||||
|
try { |
||||
|
await authStore.logout(); |
||||
|
navigateTo('/login'); |
||||
|
} catch (err) { |
||||
|
if (err instanceof Error) { |
||||
|
// TODO: better ui |
||||
|
alert(err.message || err.toString()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
Loading…
Reference in new issue