| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- <script setup lang="ts">
- import type { AnyFunction } from '@vben/types';
- import { IcRoundLogout, IcRoundSettingsSuggest } from '@vben-core/iconify';
- import {
- Badge,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuLabel,
- DropdownMenuSeparator,
- DropdownMenuShortcut,
- DropdownMenuTrigger,
- VbenAlertDialog,
- VbenAvatar,
- VbenIcon,
- } from '@vben-core/shadcn-ui';
- import { isWindowsOs } from '@vben-core/toolkit';
- import type { Component } from 'vue';
- import { $t } from '@vben/locales';
- import { preference } from '@vben/preference';
- import { useMagicKeys, whenever } from '@vueuse/core';
- import { computed, ref } from 'vue';
- import { useOpenPreference } from '../preference/use-open-preference';
- interface Props {
- /**
- * 头像
- */
- avatar?: string;
- /**
- * @zh_CN 描述
- */
- description?: string;
- /**
- * 是否启用快捷键
- */
- enableShortcutKey?: boolean;
- /**
- * 菜单数组
- */
- menus?: Array<{ handler: AnyFunction; icon?: Component; text: string }>;
- /**
- * 标签文本
- */
- tagText?: string;
- /**
- * 文本
- */
- text?: string;
- }
- defineOptions({
- name: 'UserDropdown',
- });
- const props = withDefaults(defineProps<Props>(), {
- avatar: '',
- description: '',
- enableShortcutKey: true,
- menus: () => [],
- showShortcutKey: true,
- tagText: '',
- text: '',
- });
- const emit = defineEmits<{ logout: [] }>();
- const openPopover = ref(false);
- const openDialog = ref(false);
- const { handleOpenPreference } = useOpenPreference();
- const altView = computed(() => (isWindowsOs() ? 'Alt' : '⌥'));
- const shortcutKeys = computed(() => {
- return props.enableShortcutKey && preference.shortcutKeys;
- });
- function handleLogout() {
- // emit
- openDialog.value = true;
- openPopover.value = false;
- }
- function handleSubmitLogout() {
- emit('logout');
- openDialog.value = false;
- }
- if (shortcutKeys.value) {
- const keys = useMagicKeys();
- whenever(keys['Alt+KeyQ'], () => {
- if (shortcutKeys.value) {
- handleLogout();
- }
- });
- whenever(keys['Alt+Comma'], () => {
- if (shortcutKeys.value) {
- handleOpenPreference();
- }
- });
- }
- </script>
- <template>
- <VbenAlertDialog
- v-model:open="openDialog"
- :content="$t('widgets.logout-tip')"
- :title="$t('common.prompt')"
- :cancel-text="$t('common.cancel')"
- :submit-text="$t('common.confirm')"
- @submit="handleSubmitLogout"
- />
- <DropdownMenu>
- <DropdownMenuTrigger>
- <div class="hover:bg-accent ml-1 mr-2 cursor-pointer rounded-full p-1.5">
- <div class="hover:text-accent-foreground flex-center">
- <VbenAvatar :alt="text" :src="avatar" class="size-8" dot />
- <!-- <div v-if="text" class="ml-2 text-sm">{{ text }}</div> -->
- </div>
- </div>
- </DropdownMenuTrigger>
- <DropdownMenuContent class="mr-2 min-w-[240px] p-0 pb-1">
- <DropdownMenuLabel class="flex items-center p-3">
- <VbenAvatar
- :alt="text"
- :src="avatar"
- class="size-12"
- dot
- dot-class="bottom-0 right-1 border-2 size-4 bg-green-500"
- />
- <div class="ml-2 w-full">
- <div
- class="text-foreground mb-1 flex items-center text-sm font-medium"
- >
- {{ text }}
- <Badge class="ml-2 text-green-400">
- {{ tagText }}
- </Badge>
- </div>
- <div class="text-muted-foreground text-xs font-normal">
- {{ description }}
- </div>
- </div>
- </DropdownMenuLabel>
- <DropdownMenuSeparator />
- <DropdownMenuItem
- v-for="menu in menus"
- :key="menu.text"
- class="lineh mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
- @click="menu.handler"
- >
- <VbenIcon :icon="menu.icon" class="mr-2 size-5" />
- {{ menu.text }}
- </DropdownMenuItem>
- <DropdownMenuSeparator />
- <DropdownMenuItem
- v-if="preference"
- class="mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
- @click="handleOpenPreference"
- >
- <IcRoundSettingsSuggest class="mr-2 size-5" />
- {{ $t('preference.preferences') }}
- <DropdownMenuShortcut v-if="shortcutKeys">
- {{ altView }} ,
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- <DropdownMenuSeparator />
- <DropdownMenuItem
- class="mx-1 flex cursor-pointer items-center rounded-sm py-1 leading-8"
- @click="handleLogout"
- >
- <IcRoundLogout class="mr-2 size-5" />
- {{ $t('common.logout') }}
- <DropdownMenuShortcut v-if="shortcutKeys">
- {{ altView }} Q
- </DropdownMenuShortcut>
- </DropdownMenuItem>
- </DropdownMenuContent>
- </DropdownMenu>
- </template>
|