| import { outLogin } from '@/services/ant-design-pro/api'; | 
| import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; | 
| import { history, useModel, FormattedMessage, useIntl } from '@umijs/max'; | 
| import { Spin } from 'antd'; | 
| import { createStyles } from 'antd-style'; | 
| import { stringify } from 'querystring'; | 
| import React, { useCallback } from 'react'; | 
| import { flushSync } from 'react-dom'; | 
| import HeaderDropdown from '../HeaderDropdown'; | 
| import { setRemoteMenu } from '@/services/route' | 
| import { removeToken } from '@/utils/token-util' | 
|   | 
| const useStyles = createStyles(({ token }) => { | 
|   return { | 
|     action: { | 
|       display: 'flex', | 
|       height: '48px', | 
|       marginLeft: 'auto', | 
|       overflow: 'hidden', | 
|       alignItems: 'center', | 
|       padding: '0 8px', | 
|       cursor: 'pointer', | 
|       borderRadius: token.borderRadius, | 
|       '&:hover': { | 
|         backgroundColor: token.colorBgTextHover, | 
|       }, | 
|     }, | 
|   }; | 
| }); | 
|   | 
| export const AvatarName = () => { | 
|   const { initialState } = useModel('@@initialState'); | 
|   const { currentUser } = initialState || {}; | 
|   return <span className="anticon">{currentUser?.name}</span>; | 
| }; | 
|   | 
| export const AvatarDropdown = ({ menu, children }) => { | 
|   const intl = useIntl(); | 
|   const { styles } = useStyles(); | 
|   const { initialState, setInitialState } = useModel('@@initialState'); | 
|   | 
|   // 退出登录,并且将当前的 url 保存 | 
|   const loginOut = async () => { | 
|     // await outLogin(); | 
|     removeToken(); | 
|     setRemoteMenu(null); | 
|     const { search, pathname } = window.location; | 
|     const urlParams = new URL(window.location.href).searchParams; | 
|     /** 此方法会跳转到 redirect 参数所在的位置 */ | 
|     const redirect = urlParams.get('redirect'); | 
|     // Note: There may be security issues, please note | 
|     if (window.location.pathname !== '/user/login' && !redirect) { | 
|       history.replace({ | 
|         pathname: '/user/login', | 
|         search: stringify({ | 
|           redirect: pathname + search, | 
|         }), | 
|       }); | 
|     } | 
|   }; | 
|   | 
|   const onMenuClick = useCallback((event) => { | 
|     const { key } = event; | 
|     if (key === 'logout') { | 
|       flushSync(() => { | 
|         setInitialState((s) => ({ ...s, currentUser: undefined })); | 
|       }); | 
|       loginOut(); | 
|       return; | 
|     } | 
|     history.push(`/user/${key}`); | 
|   }, [setInitialState]); | 
|   | 
|   const loading = ( | 
|     <span className={styles.action}> | 
|       <Spin | 
|         size="small" | 
|         style={{ | 
|           marginLeft: 8, | 
|           marginRight: 8, | 
|         }} | 
|       /> | 
|     </span> | 
|   ); | 
|   | 
|   if (!initialState) { | 
|     return loading; | 
|   } | 
|   | 
|   const { currentUser } = initialState; | 
|   | 
|   if (!currentUser || !currentUser.name) { | 
|     return loading; | 
|   } | 
|   | 
|   const menuItems = [ | 
|     // ...(menu | 
|     //   ? [ | 
|     //     { | 
|     //       key: 'center', | 
|     //       icon: <UserOutlined />, | 
|     //       label: '个人中心', | 
|     //     }, | 
|     //     { | 
|     //       key: 'settings', | 
|     //       icon: <SettingOutlined />, | 
|     //       label: '个人设置', | 
|     //     }, | 
|     //     { | 
|     //       type: 'divider' as const, | 
|     //     }, | 
|     //   ] | 
|     //   : []), | 
|     // { | 
|     //   type: 'divider' | 
|     // }, | 
|     { | 
|       key: 'logout', | 
|       icon: <LogoutOutlined />, | 
|       label: intl.formatMessage({ id: 'common.account.logout', defaultMessage: '退出登录' }), | 
|     }, | 
|   ]; | 
|   | 
|   return ( | 
|     <HeaderDropdown | 
|       menu={{ | 
|         selectedKeys: [], | 
|         onClick: onMenuClick, | 
|         items: menuItems, | 
|       }} | 
|     > | 
|       {children} | 
|     </HeaderDropdown> | 
|   ); | 
| }; |