AvatarDropdown.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React from 'react';
  2. import { Avatar, Menu, Spin, Icon } from 'antd';
  3. import { FormattedMessage } from 'umi-plugin-react/locale';
  4. import { ClickParam } from 'antd/lib/menu';
  5. import { ConnectProps, ConnectState } from '@/models/connect';
  6. import { CurrentUser } from '@/models/user';
  7. import { connect } from 'dva';
  8. import router from 'umi/router';
  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. dispatch!({
  21. type: 'login/logout',
  22. });
  23. return;
  24. }
  25. router.push(`/account/${key}`);
  26. };
  27. render() {
  28. const { currentUser = {}, menu } = this.props;
  29. if (!menu) {
  30. return (
  31. <span className={`${styles.action} ${styles.account}`}>
  32. <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
  33. <span className={styles.name}>{currentUser.name}</span>
  34. </span>
  35. );
  36. }
  37. const menuHeaderDropdown = (
  38. <Menu className={styles.menu} selectedKeys={[]} onClick={this.onMenuClick}>
  39. <Menu.Item key="center">
  40. <Icon type="user" />
  41. <FormattedMessage id="menu.account.center" defaultMessage="account center" />
  42. </Menu.Item>
  43. <Menu.Item key="settings">
  44. <Icon type="setting" />
  45. <FormattedMessage id="menu.account.settings" defaultMessage="account settings" />
  46. </Menu.Item>
  47. <Menu.Divider />
  48. <Menu.Item key="logout">
  49. <Icon type="logout" />
  50. <FormattedMessage id="menu.account.logout" defaultMessage="logout" />
  51. </Menu.Item>
  52. </Menu>
  53. );
  54. return currentUser && currentUser.name ? (
  55. <HeaderDropdown overlay={menuHeaderDropdown}>
  56. <span className={`${styles.action} ${styles.account}`}>
  57. <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
  58. <span className={styles.name}>{currentUser.name}</span>
  59. </span>
  60. </HeaderDropdown>
  61. ) : (
  62. <Spin size="small" style={{ marginLeft: 8, marginRight: 8 }} />
  63. );
  64. }
  65. }
  66. export default connect(({ user }: ConnectState) => ({
  67. currentUser: user.currentUser,
  68. }))(AvatarDropdown);