Frontend: replaced user options with sidebar

main
TZGyn 2 years ago
parent 3849643f7d
commit 77e89ad55b
Signed by: TZGyn
GPG Key ID: 122EAF77AE81FD4A

@ -1,74 +1,20 @@
<script setup lang="ts"> <script setup lang="ts">
const userOptionsCard = ref()
const userIcon = ref() const userIcon = ref()
const showUserOptions = ref<Boolean>(false)
const toggleUserOptions = () => { const toggleUserOptions = () => {
showUserOptions.value = !showUserOptions.value openSidebar()
} }
onClickOutside(
userOptionsCard,
() => {
toggleUserOptions()
},
{ ignore: [userIcon] }
)
const logout = async () => {
await userLogout()
useRouter().push('/login')
}
type UserOption = {
title: string
onClick: () => void
}
const userOptions: Array<UserOption> = [
{
title: 'Github',
onClick: () => {
openUrl('https://github.com/TZGyn')
toggleUserOptions()
},
},
{
title: 'Log Out',
onClick: async () => {
await logout()
toggleUserOptions()
},
},
{
title: 'Profile',
onClick: () => {
useRouter().push('/profile')
},
},
]
</script> </script>
<template> <template>
<div <div
class="flex h-14 w-screen items-center justify-between bg-primary px-4"> class="flex h-14 w-screen items-center justify-between bg-primary px-4">
<div class="relative"> <div>
<Icon <Icon
name="user" name="user"
size="36" size="36"
ref="userIcon" ref="userIcon"
@click="toggleUserOptions()" /> @click="toggleUserOptions()" />
<div
v-if="showUserOptions"
ref="userOptionsCard"
class="absolute left-0 top-8 w-max border border-lightgray bg-secondary">
<div
v-for="userOption in userOptions"
class="w-full min-w-[120px] border border-lightgray p-4 text-center hover:bg-lightgray"
@click="userOption.onClick()">
{{ userOption.title }}
</div>
</div>
</div> </div>
<div class="flex gap-4"> <div class="flex gap-4">
<Icon <Icon

@ -0,0 +1,91 @@
<script setup lang="ts">
const isSidebarActive = useSidebar()
const user = useUser()
const sidebar = ref<HTMLElement | undefined>()
type UserOption = {
title: string
icon?: string
onClick: () => void
}
const userOptions: Array<UserOption> = [
{
title: 'Github',
icon: 'github',
onClick: () => {
openUrl('https://github.com/TZGyn')
},
},
{
title: 'Log Out',
icon: 'mdi:logout',
onClick: async () => {
await userLogout()
useRouter().push('/login')
},
},
{
title: 'Profile',
icon: 'user',
onClick: () => {
useRouter().push('/profile')
},
},
]
onClickOutside(sidebar, () => {
closeSidebar()
})
</script>
<template>
<div>
<div
ref="sidebar"
class="absolute z-50 h-screen w-80 max-w-full border-r-2 border-r-secondary bg-primary font-bold transition-transform"
:class="{
'-translate-x-full': !isSidebarActive,
'translate-x-0': isSidebarActive,
}">
<div class="mb-4 flex flex-col gap-4 p-4">
<div class="flex justify-between">
<div>Account Info</div>
<Icon
@click="closeSidebar()"
name="close"
class="hover:cursor-pointer" />
</div>
<Icon
name="user"
size="36"
ref="userIcon" />
<div>
{{ user }}
</div>
</div>
<div ref="userOptionsCard">
<div
v-for="userOption in userOptions"
class="flex w-full items-center p-4 text-xl hover:bg-lightgray"
@click="userOption.onClick()">
<Icon
v-if="userOption.icon"
:name="userOption.icon"
class="mr-6" />
<div>
{{ userOption.title }}
</div>
</div>
</div>
</div>
<div
class="absolute z-40 h-screen w-screen bg-white/5"
:class="{
'-translate-x-full': !isSidebarActive,
'translate-x-0': isSidebarActive,
}">
</div>
</div>
</template>

@ -2,4 +2,8 @@ const openUrl = (url: string) => {
window.open(url, '_blank') window.open(url, '_blank')
} }
export { openUrl } const useSidebar = () => useState<Boolean>('isSidebarActive', () => false)
const openSidebar = () => [(useSidebar().value = true)]
const closeSidebar = () => [(useSidebar().value = false)]
export { closeSidebar, openSidebar, openUrl, useSidebar }

@ -47,6 +47,7 @@ onMounted(() => {
<template> <template>
<div class="h-screen overflow-hidden"> <div class="h-screen overflow-hidden">
<Sidebar />
<Header /> <Header />
<div class="sticky top-0 flex bg-primary text-center"> <div class="sticky top-0 flex bg-primary text-center">
<div <div

Loading…
Cancel
Save