AvatarDropdown.tsx 2.3 KB

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