Move profile button to own component

This commit is contained in:
Ramon Wenger 2024-10-17 15:44:36 +02:00
parent ebdd175082
commit b833fa34b1
2 changed files with 63 additions and 61 deletions

View File

@ -1,12 +1,8 @@
<script setup lang="ts"> <script setup lang="ts">
import AccountMenu from "@/components/header/AccountMenu.vue";
import NotificationPopover from "@/components/notifications/NotificationPopover.vue"; import NotificationPopover from "@/components/notifications/NotificationPopover.vue";
import NotificationPopoverContent from "@/components/notifications/NotificationPopoverContent.vue"; import NotificationPopoverContent from "@/components/notifications/NotificationPopoverContent.vue";
import ItFullScreenModal from "@/components/ui/ItFullScreenModal.vue";
import { getLoginURL } from "@/router/utils";
import { useCourseSessionsStore } from "@/stores/courseSessions"; import { useCourseSessionsStore } from "@/stores/courseSessions";
import { useNotificationsStore } from "@/stores/notifications"; import { useNotificationsStore } from "@/stores/notifications";
import { useUserStore } from "@/stores/user";
import { useNavigationAttributes } from "@/utils/navigation"; import { useNavigationAttributes } from "@/utils/navigation";
import { useRouteLookups } from "@/utils/route"; import { useRouteLookups } from "@/utils/route";
import { import {
@ -16,18 +12,15 @@ import {
getLearningPathUrl, getLearningPathUrl,
getMediaCenterUrl, getMediaCenterUrl,
} from "@/utils/utils"; } from "@/utils/utils";
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
import { breakpointsTailwind, useBreakpoints } from "@vueuse/core";
import { useTranslation } from "i18next-vue"; import { useTranslation } from "i18next-vue";
import log from "loglevel"; import log from "loglevel";
import { computed, onMounted, reactive } from "vue"; import { computed, onMounted } from "vue";
import DefaultNavigation from "./DefaultNavigation.vue"; import DefaultNavigation from "./DefaultNavigation.vue";
import MobileMenuButton from "./MobileMenuButton.vue"; import MobileMenuButton from "./MobileMenuButton.vue";
import ProfileMenuButton from "./ProfileMenuButton.vue";
log.debug("MainNavigationBar created"); log.debug("MainNavigationBar created");
const breakpoints = useBreakpoints(breakpointsTailwind);
const userStore = useUserStore();
const courseSessionsStore = useCourseSessionsStore(); const courseSessionsStore = useCourseSessionsStore();
const notificationsStore = useNotificationsStore(); const notificationsStore = useNotificationsStore();
const { const {
@ -51,17 +44,6 @@ const {
} = useNavigationAttributes(); } = useNavigationAttributes();
const { t } = useTranslation(); const { t } = useTranslation();
const state = reactive({
showMobileNavigationMenu: false,
showMobileProfileMenu: false,
});
function popoverClick(event: Event) {
if (breakpoints.smaller("lg").value) {
event.preventDefault();
state.showMobileProfileMenu = true;
}
}
const selectedCourseSessionTitle = computed(() => { const selectedCourseSessionTitle = computed(() => {
return courseSessionsStore.currentCourseSession?.title; return courseSessionsStore.currentCourseSession?.title;
@ -88,15 +70,6 @@ const mentorTabTitle = computed(() =>
</script> </script>
<template> <template>
<Teleport to="body">
<ItFullScreenModal
v-if="userStore.loggedIn"
:show="state.showMobileProfileMenu"
@closemodal="state.showMobileProfileMenu = false"
>
<AccountMenu @close="state.showMobileProfileMenu = false" />
</ItFullScreenModal>
</Teleport>
<nav class="bg-blue-900 text-white"> <nav class="bg-blue-900 text-white">
<div class="mx-auto px-4 lg:px-8"> <div class="mx-auto px-4 lg:px-8">
<div class="relative flex h-16 justify-between"> <div class="relative flex h-16 justify-between">
@ -234,38 +207,7 @@ const mentorTabTitle = computed(() =>
</div> </div>
<div class="nav-item"> <div class="nav-item">
<div <ProfileMenuButton />
v-if="userStore.loggedIn"
class="flex items-center"
data-cy="header-profile"
>
<Popover class="relative">
<PopoverButton @click="popoverClick($event)">
<div v-if="userStore.avatar_url">
<img
class="inline-block h-8 w-8 rounded-full"
:src="userStore.avatar_url"
alt=""
/>
</div>
<div v-else>
{{ userStore.getFullName }}
</div>
</PopoverButton>
<PopoverPanel
v-slot="{ close }"
class="absolute -right-2 top-8 z-50 w-[500px] bg-white shadow-lg"
>
<div class="p-4">
<AccountMenu @close="close" />
</div>
</PopoverPanel>
</Popover>
</div>
<div v-else>
<a class="" :href="getLoginURL({ lang: userStore.language })">Login</a>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,60 @@
<script setup lang="ts">
import AccountMenu from "@/components/header/AccountMenu.vue";
import ItFullScreenModal from "@/components/ui/ItFullScreenModal.vue";
import { getLoginURL } from "@/router/utils";
import { useUserStore } from "@/stores/user";
import { Popover, PopoverButton, PopoverPanel } from "@headlessui/vue";
import { breakpointsTailwind, useBreakpoints } from "@vueuse/core";
import { ref } from "vue";
const userStore = useUserStore();
const breakpoints = useBreakpoints(breakpointsTailwind);
const showMenu = ref(false);
function popoverClick(event: Event) {
if (breakpoints.smaller("lg").value) {
event.preventDefault();
showMenu.value = true;
}
}
</script>
<template>
<Teleport to="body">
<ItFullScreenModal
v-if="userStore.loggedIn"
:show="showMenu"
@closemodal="showMenu = false"
>
<AccountMenu @close="showMenu = false" />
</ItFullScreenModal>
</Teleport>
<div v-if="userStore.loggedIn" class="flex items-center" data-cy="header-profile">
<Popover class="relative">
<PopoverButton @click="popoverClick($event)">
<div v-if="userStore.avatar_url">
<img
class="inline-block h-8 w-8 rounded-full"
:src="userStore.avatar_url"
alt=""
/>
</div>
<div v-else>
{{ userStore.getFullName }}
</div>
</PopoverButton>
<PopoverPanel
v-slot="{ close }"
class="absolute -right-2 top-8 z-50 w-[500px] bg-white shadow-lg"
>
<div class="p-4">
<AccountMenu @close="close" />
</div>
</PopoverPanel>
</Popover>
</div>
<div v-else>
<a class="" :href="getLoginURL({ lang: userStore.language })">Login</a>
</div>
</template>