import { outLogin } from '@/services/ant-design-pro/api'; import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons'; import { useEmotionCss } from '@ant-design/use-emotion-css'; import { history, useModel } from '@umijs/max'; import { Avatar, Spin } from 'antd'; import { setAlpha } from '@ant-design/pro-components'; import { stringify } from 'querystring'; import type { MenuInfo } from 'rc-menu/lib/interface'; import React, { useCallback } from 'react'; import { flushSync } from 'react-dom'; import HeaderDropdown from '../HeaderDropdown'; export type GlobalHeaderRightProps = { menu?: boolean; }; const Name = () => { const { initialState } = useModel('@@initialState'); const { currentUser } = initialState || {}; const nameClassName = useEmotionCss(({ token }) => { return { width: '70px', height: '48px', overflow: 'hidden', lineHeight: '48px', whiteSpace: 'nowrap', textOverflow: 'ellipsis', [`@media only screen and (max-width: ${token.screenMD}px)`]: { display: 'none', }, }; }); return {currentUser?.name}; }; const AvatarLogo = () => { const { initialState } = useModel('@@initialState'); const { currentUser } = initialState || {}; const avatarClassName = useEmotionCss(({ token }) => { return { marginRight: '8px', color: token.colorPrimary, verticalAlign: 'top', background: setAlpha(token.colorBgContainer, 0.85), [`@media only screen and (max-width: ${token.screenMD}px)`]: { margin: 0, }, }; }); return ; }; const AvatarDropdown: React.FC = ({ menu }) => { /** * 退出登录,并且将当前的 url 保存 */ const loginOut = async () => { await outLogin(); 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 actionClassName = useEmotionCss(({ token }) => { return { display: 'flex', height: '48px', marginLeft: 'auto', overflow: 'hidden', alignItems: 'center', padding: '0 8px', cursor: 'pointer', borderRadius: token.borderRadius, '&:hover': { backgroundColor: token.colorBgTextHover, }, }; }); const { initialState, setInitialState } = useModel('@@initialState'); const onMenuClick = useCallback( (event: MenuInfo) => { const { key } = event; if (key === 'logout') { flushSync(() => { setInitialState((s) => ({ ...s, currentUser: undefined })); }); loginOut(); return; } history.push(`/account/${key}`); }, [setInitialState], ); const loading = ( ); if (!initialState) { return loading; } const { currentUser } = initialState; if (!currentUser || !currentUser.name) { return loading; } const menuItems = [ ...(menu ? [ { key: 'center', icon: , label: '个人中心', }, { key: 'settings', icon: , label: '个人设置', }, { type: 'divider' as const, }, ] : []), { key: 'logout', icon: , label: '退出登录', }, ]; return ( ); }; export default AvatarDropdown;