Blame view

src/layouts/default/header/UserDropdown.tsx 2.63 KB
陈文彬 authored
1
2
3
4
5
6
7
8
9
10
11
12
13
// components
import { Dropdown, Menu, Divider } from 'ant-design-vue';

import { defineComponent, computed, unref } from 'vue';

// res
import headerImg from '/@/assets/images/header.jpg';

import Icon from '/@/components/Icon/index';

import { userStore } from '/@/store/modules/user';

import { DOC_URL } from '/@/settings/siteSetting';
vben authored
14
15
16
17

import { openWindow } from '/@/utils';

import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
vben authored
18
import { FunctionalComponent } from 'vue';
vben authored
19
vben authored
20
21
type MenuEvent = 'loginOut' | 'doc';
interface MenuItemProps {
vben authored
22
23
  icon: string;
  text: string;
vben authored
24
  key: MenuEvent;
vben authored
25
}
陈文彬 authored
26
27

const prefixCls = 'user-dropdown';
vben authored
28
vben authored
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const MenuItem: FunctionalComponent<MenuItemProps> = (props) => {
  const { key, icon, text } = props;
  return (
    <Menu.Item key={key}>
      {() => (
        <span class="flex items-center">
          <Icon icon={icon} class="mr-1" />
          <span>{text}</span>
        </span>
      )}
    </Menu.Item>
  );
};
陈文彬 authored
43
44
45
export default defineComponent({
  name: 'UserDropdown',
  setup() {
vben authored
46
    const { getShowDoc } = useHeaderSetting();
陈文彬 authored
47
48
49
50
51
52
    const getUserInfo = computed(() => {
      const { realName = '', desc } = userStore.getUserInfoState || {};
      return { realName, desc };
    });
53
    //  login out
陈文彬 authored
54
55
56
57
    function handleLoginOut() {
      userStore.confirmLoginOut();
    }
58
    // open doc
陈文彬 authored
59
    function openDoc() {
vben authored
60
      openWindow(DOC_URL);
陈文彬 authored
61
62
    }
vben authored
63
64
65
66
67
68
69
70
    function handleMenuClick(e: { key: MenuEvent }) {
      switch (e.key) {
        case 'loginOut':
          handleLoginOut();
          break;
        case 'doc':
          openDoc();
          break;
陈文彬 authored
71
72
      }
    }
73
vben authored
74
    function renderSlotsDefault() {
陈文彬 authored
75
      const { realName } = unref(getUserInfo);
vben authored
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
      return (
        <section class={prefixCls}>
          <img class={`${prefixCls}__header`} src={headerImg} />
          <section class={`${prefixCls}__info`}>
            <section class={`${prefixCls}__name`}>{realName}</section>
          </section>
        </section>
      );
    }

    function renderSlotOverlay() {
      const showDoc = unref(getShowDoc);
      return (
        <Menu onClick={handleMenuClick}>
          {() => (
            <>
vben authored
92
              {showDoc && <MenuItem key="doc" text="文档" icon="gg:loadbar-doc" />}
vben authored
93
              {showDoc && <Divider />}
vben authored
94
              <MenuItem key="loginOut" text="退出系统" icon="ant-design:poweroff-outlined" />
vben authored
95
96
97
98
99
100
101
            </>
          )}
        </Menu>
      );
    }

    return () => {
陈文彬 authored
102
103
104
      return (
        <Dropdown placement="bottomLeft">
          {{
vben authored
105
106
            default: () => renderSlotsDefault(),
            overlay: () => renderSlotOverlay(),
陈文彬 authored
107
108
109
110
111
112
          }}
        </Dropdown>
      );
    };
  },
});