AvatarDropdown.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
  2. import { Avatar, Menu, Spin } from 'antd';
  3. import { ClickParam } from 'antd/es/menu';
  4. import React from 'react';
  5. import { history, ConnectProps, connect } from 'umi';
  6. import { ConnectState } from '@/models/connect';
  7. import { CurrentUser } from '@/models/user';
  8. import HeaderDropdown from '../HeaderDropdown';
  9. import styles from './index.less';
  10. export interface GlobalHeaderRightProps extends Partial<ConnectProps> {
  11. currentUser?: CurrentUser;
  12. menu?: boolean;
  13. }
  14. class AvatarDropdown extends React.Component<GlobalHeaderRightProps> {
  15. onMenuClick = (event: ClickParam) => {
  16. const { key } = event;
  17. if (key === 'logout') {
  18. const { dispatch } = this.props;
  19. if (dispatch) {
  20. dispatch({
  21. type: 'login/logout',
  22. });
  23. }
  24. return;
  25. }
  26. history.push(`/account/${key}`);
  27. };
  28. render(): React.ReactNode {
  29. const {
  30. currentUser = {
  31. avatar: '',
  32. userName: '',
  33. },
  34. menu,
  35. } = this.props;
  36. const menuHeaderDropdown = (
  37. <Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}>
  38. {menu && (
  39. <Menu.Item key="center">
  40. <UserOutlined />
  41. 个人中心
  42. </Menu.Item>
  43. )}
  44. {menu && (
  45. <Menu.Item key="settings">
  46. <SettingOutlined />
  47. 个人设置
  48. </Menu.Item>
  49. )}
  50. {menu && <Menu.Divider />}
  51. <Menu.Item key="logout">
  52. <LogoutOutlined />
  53. 退出登录
  54. </Menu.Item>
  55. </Menu>
  56. );
  57. return currentUser && currentUser.userName ? (
  58. <HeaderDropdown overlay={menuHeaderDropdown}>
  59. <span className={`${styles.action} ${styles.account}`}>
  60. <Avatar size="small" className={styles.avatar} src="/avatar.png" alt="avatar" />
  61. <span className={styles.name}>{currentUser.userName}</span>
  62. </span>
  63. </HeaderDropdown>
  64. ) : (
  65. <span className={`${styles.action} ${styles.account}`}>
  66. <Spin
  67. size="small"
  68. style={{
  69. marginLeft: 8,
  70. marginRight: 8,
  71. }}
  72. />
  73. </span>
  74. );
  75. }
  76. }
  77. export default connect(({ user }: ConnectState) => ({
  78. currentUser: user.currentUser,
  79. }))(AvatarDropdown);