added user dropdown component

This commit is contained in:
Mamalizz
2025-02-06 22:57:02 +03:30
parent e79a0556a1
commit 3c8e6e2548
+140
View File
@@ -0,0 +1,140 @@
<script setup lang="ts">
// imports
import useGetAccount from "~/composables/api/account/useGetAccount";
import { useAuth } from "~/composables/api/auth/useAuth";
import { useToast } from "~/composables/global/useToast";
// state
const { logout } = useAuth();
const { addToast } = useToast();
const router = useRouter();
const profileDropdownItems = ref<DropdownItem[]>([
{
title: "خرید ها و سفارش ها",
icon: "ci:cart",
onClick: () => router.push({ name: "profile-purchases-and-orders" }),
},
{
title: "پشتیبانی",
icon: "ci:headphones",
onClick: () => router.push({ name: "profile-ticket" }),
},
{
title: "خروج از حساب",
icon: "bi:arrow-bar-left",
itemClass: "!text-red-500",
iconClass: "**:stroke-red-500 **:fill-transparent",
onClick: () => {
logout();
nextTick(() => {
addToast({
message: "با موفقیت از حساب خارج شدید",
options: {
status: "success",
},
});
});
},
},
]);
// queries
const { data: account } = useGetAccount();
</script>
<template>
<Dropdown>
<template #trigger>
<button
v-if="!!account"
class="size-[1.6rem] flex items-center justify-center relative overflow-hidden rounded-full border border-black"
>
<Avatar
:src="account.profile_photo"
:alt="
account.first_name && account.last_name
? `${account.first_name.charAt(
0
)} ${account.last_name.charAt(0)}`
: ''
"
/>
</button>
</template>
<template #content>
<DropdownMenuContent
class="min-w-[220px] w-full outline-none bg-gray-50 border border-gray-400 rounded-2xl font-iran-yekan-x shadow-2xl will-change-[opacity,transform] data-[side=top]:animate-slide-up-fade data-[side=right]:animate-slide-left-fade data-[side=bottom]:animate-slide-down-fade data-[side=left]:animate-slide-right-fade z-10000"
:side-offset="5"
>
<div
class="w-full flex items-center justify-between gap-2 px-2 border-b border-gray-400"
>
<div
v-if="!!account"
class="flex items-center justify-start py-2"
>
<Avatar
:src="account.profile_photo"
class="!size-8"
:alt="
account.first_name && account.last_name
? `${account.first_name.charAt(
0
)} ${account.last_name.charAt(0)}`
: 'بدون نام کاربری'
"
/>
<span class="typo-label-xs text-black">{{
`${account.first_name} ${account.last_name}`
}}</span>
</div>
<NuxtLink
:to="{ name: 'profile' }"
class="aspect-square rounded-sm size-7 flex-center"
>
<Icon
name="bi:pencil"
class="**:fill-black"
size="14"
/>
</NuxtLink>
</div>
<div class="flex-col flex p-2">
<DropdownMenuItem
v-for="(item, index) in profileDropdownItems"
:key="index"
@click="item.onClick"
:class="
item.itemClass
? item.itemClass
: 'hover:!text-black'
"
class="group text-xs leading-none text-black hover:!bg-gray-200 cursor-pointer border-none rounded-md flex items-center justify-start py-1 relative select-none outline-none data-[disabled]:opacity-50 data-[disabled]:pointer-events-none data-[highlighted]:bg-black data-[highlighted]:text-white"
>
<div class="size-8 flex-center">
<Icon
:name="item.icon"
:class="item.iconClass"
size="16"
class="**:stroke-black"
/>
</div>
<span>
{{ item.title }}
</span>
</DropdownMenuItem>
</div>
<DropdownMenuArrow class="fill-gray-50 stroke-gray-400" />
</DropdownMenuContent>
</template>
</Dropdown>
</template>
<style scoped></style>