Skip to content

Commit 6323e44

Browse files
authored
refactor(nav): convert user dropdown into generic reusable nav dropdown (#301)
1 parent cea6f04 commit 6323e44

File tree

2 files changed

+55
-33
lines changed

2 files changed

+55
-33
lines changed

src/components/Nav.vue

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<img
99
class="logo"
1010
:src="logoSrc"
11-
:alt="helpText.logoAlt"
11+
:alt="helpText.nav.logoAlt"
1212
>
1313
</router-link>
1414
<nav class="flex items-center links">
@@ -18,13 +18,22 @@
1818
class="mr-2 p-2 catalog-link"
1919
>
2020
<div class="background-color-wrapper" />
21-
{{ helpText.catalog }}
21+
{{ helpText.nav.catalog }}
2222
</router-link>
23-
24-
<UserDropdown
23+
<NavDropdown
2524
v-if="developer && !isPublic"
26-
:email="developer.email"
27-
@logout="logout"
25+
:label="developer.email"
26+
:items="[
27+
{
28+
label: helpText.userDropdown.myApps,
29+
routerLink: 'my-apps',
30+
}, {
31+
label: helpText.userDropdown.logout,
32+
onClick: () => logout(),
33+
testid: 'logout-item'
34+
}
35+
]"
36+
data-testid="user-dropdown"
2837
/>
2938
</nav>
3039
</div>
@@ -35,16 +44,16 @@
3544
import { defineComponent } from 'vue'
3645
import { mapState, storeToRefs } from 'pinia'
3746
import { useI18nStore, useAppStore } from '@/stores'
38-
import UserDropdown from './UserDropdown.vue'
47+
import NavDropdown from './NavDropdown.vue'
3948
import usePortalApi from '@/hooks/usePortalApi'
4049
4150
export default defineComponent({
4251
name: 'Nav',
43-
components: { UserDropdown },
52+
components: { NavDropdown },
4453
setup () {
4554
const appStore = useAppStore()
4655
const { globalLoading } = storeToRefs(appStore)
47-
const helpText = useI18nStore().state.helpText.nav
56+
const helpText = useI18nStore().state.helpText
4857
4958
const logout = async () => {
5059
globalLoading.value = true

src/components/UserDropdown.vue renamed to src/components/NavDropdown.vue

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<template>
22
<KToggle v-slot="{toggle, isToggled}">
33
<div
4-
data-testid="user-dropdown"
5-
class="inline user-dropdown relative"
4+
:data-testid="dataTestid"
5+
class="inline nav-dropdown relative"
66
>
77
<div
88
v-if="isToggled.value"
@@ -15,57 +15,70 @@
1515
appearance="btn-link"
1616
@click="toggle"
1717
>
18-
{{ email }}
18+
{{ label }}
1919
</KButton>
2020
<ul
2121
v-if="isToggled.value"
2222
class="list-none m-0 p-0 absolute w-40 shadow bg-white"
2323
>
2424
<li
25-
data-testid="my-apps-item"
25+
v-for="item of items"
26+
:key="item.label"
2627
class="type-md block"
2728
>
2829
<router-link
29-
:to="{ name: 'my-apps' }"
30+
v-if="item.routerLink"
31+
:data-testid="item.testid"
32+
:to="{ name: item.routerLink }"
3033
class="color-text_colors-primary block py-3 px-4"
31-
@click="toggle"
34+
@click="(e) => { toggle(e); item.onClick?.() }"
3235
>
33-
{{ helpText.myApps }}
36+
{{ item.label }}
3437
</router-link>
35-
</li>
36-
<li
37-
data-testid="logout-item"
38-
class="py-3 px-4 type-md cursor-pointer logout-btn block color-text_colors-primary"
39-
@click="$emit('logout')"
40-
>
41-
{{ helpText.logout }}
38+
<div
39+
v-else
40+
:data-testid="item.testid"
41+
class="color-text_colors-primary block py-3 px-4 cursor-pointer"
42+
@click="(e) => { toggle(e); item.onClick?.() }"
43+
>
44+
{{ item.label }}
45+
</div>
4246
</li>
4347
</ul>
4448
</div>
4549
</KToggle>
4650
</template>
4751

4852
<script lang="ts">
49-
import { useI18nStore } from '@/stores'
50-
import { defineComponent } from 'vue'
53+
import { defineComponent, PropType } from 'vue'
5154
5255
export default defineComponent({
53-
name: 'UserDropdown',
56+
name: 'NavDropdown',
5457
props: {
55-
email: {
58+
label: {
5659
type: String,
5760
required: true
61+
},
62+
items: {
63+
type: Array as PropType<{
64+
label: string
65+
routerLink?: string
66+
onClick?: () => void
67+
testid?: string
68+
}[]>,
69+
required: true
70+
},
71+
dataTestid: {
72+
type: String,
73+
required: false,
74+
default: ''
5875
}
59-
},
60-
emits: ['logout'],
61-
data: () => ({
62-
helpText: useI18nStore().state.helpText.userDropdown
63-
})
76+
}
6477
})
6578
</script>
6679

6780
<style lang="scss">
68-
.user-dropdown {
81+
.nav-dropdown {
6982
--KButtonLink: var(--text_colors-header);
7083
7184
.k-button {

0 commit comments

Comments
 (0)