AvatarDropdown.jsx 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React, { useCallback } from 'react';
  2. import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
  3. import { Avatar, Menu, Spin } from 'antd';
  4. import { history, useModel } from 'umi';
  5. import { stringify } from 'querystring';
  6. import HeaderDropdown from '../HeaderDropdown';
  7. import styles from './index.less';
  8. import { outLogin } from '@/services/ant-design-pro/api';
  9. /**
  10. * 退出登录,并且将当前的 url 保存
  11. */
  12. const loginOut = async () => {
  13. await outLogin();
  14. const { query = {}, search, pathname } = history.location;
  15. const { redirect } = query; // Note: There may be security issues, please note
  16. if (window.location.pathname !== '/user/login' && !redirect) {
  17. history.replace({
  18. pathname: '/user/login',
  19. search: stringify({
  20. redirect: pathname + search,
  21. }),
  22. });
  23. }
  24. };
  25. const AvatarDropdown = ({ menu }) => {
  26. const { initialState, setInitialState } = useModel('@@initialState');
  27. const onMenuClick = useCallback(
  28. (event) => {
  29. const { key } = event;
  30. if (key === 'logout') {
  31. setInitialState((s) => ({ ...s, currentUser: undefined }));
  32. loginOut();
  33. return;
  34. }
  35. history.push(`/account/${key}`);
  36. },
  37. [setInitialState],
  38. );
  39. const loading = (
  40. <span className={`${styles.action} ${styles.account}`}>
  41. <Spin
  42. size="small"
  43. style={{
  44. marginLeft: 8,
  45. marginRight: 8,
  46. }}
  47. />
  48. </span>
  49. );
  50. if (!initialState) {
  51. return loading;
  52. }
  53. const { currentUser } = initialState;
  54. if (!currentUser || !currentUser.name) {
  55. return loading;
  56. }
  57. const menuHeaderDropdown = (
  58. <Menu className={styles.menu} selectedKeys={[]} onClick={onMenuClick}>
  59. {menu && (
  60. <Menu.Item key="center">
  61. <UserOutlined />
  62. 个人中心
  63. </Menu.Item>
  64. )}
  65. {menu && (
  66. <Menu.Item key="settings">
  67. <SettingOutlined />
  68. 个人设置
  69. </Menu.Item>
  70. )}
  71. {menu && <Menu.Divider />}
  72. <Menu.Item key="logout">
  73. <LogoutOutlined />
  74. 退出登录
  75. </Menu.Item>
  76. </Menu>
  77. );
  78. return (
  79. <HeaderDropdown overlay={menuHeaderDropdown}>
  80. <span className={`${styles.action} ${styles.account}`}>
  81. <Avatar size="small" className={styles.avatar} src={currentUser.avatar} alt="avatar" />
  82. <span className={`${styles.name} anticon`}>{currentUser.name}</span>
  83. </span>
  84. </HeaderDropdown>
  85. );
  86. };
  87. export default AvatarDropdown;