You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

97 lines
2.7 KiB

import React, { useEffect, FC } from 'react'
import { useHistory } from 'react-router-dom'
import { Menu, Dropdown, Layout } from 'antd'
import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons'
import Breadcrumb from '@/components/BreadCrumb'
import { connect } from 'react-redux'
import * as actions from '@/store/actions'
import style from './Header.module.less'
interface Props extends ReduxProps { }
const Header: FC<Props> = ({
storeData: { collapsed, theme, userInfo },
setStoreData
}) => {
const history = useHistory()
const { userName = '-' } = userInfo
const firstWord = userName.slice(0, 1)
const logout = async () => {
await setStoreData('SET_USERINFO', {})
history.replace({ pathname: '/login' })
}
const changeTheme = (themes: string) => {
setStoreData('SET_THEME', themes)
}
const menu = (
<Menu>
<Menu.Item onClick={logout}>
<span>退</span>
</Menu.Item>
</Menu>
)
const changeMenu = (
<Menu>
<Menu.Item onClick={() => changeTheme('')}>
<span></span>
</Menu.Item>
<Menu.Item onClick={() => changeTheme('default')}>
<span></span>
</Menu.Item>
</Menu>
)
const toggle = (): void => {
setStoreData('SET_COLLAPSED', !collapsed)
}
// 更换主题
useEffect(() => {
if (theme === 'default') {
const script = document.createElement('script')
script.id = 'themeJs'
script.src = '/static/less.min.js'
document.body.appendChild(script)
setTimeout(() => {
const themeStyle = document.getElementById('less:color')
if (themeStyle) localStorage.setItem('themeStyle', themeStyle.innerText)
}, 500)
} else {
const themeJs = document.getElementById('themeJs')
const themeStyle = document.getElementById('less:color')
if (themeJs) themeJs.remove()
if (themeStyle) themeStyle.remove()
localStorage.removeItem('themeStyle')
}
}, [theme])
return (
<Layout.Header className={style.header}>
<div className={style.toggleMenu} onClick={toggle}>
{collapsed ? (
<MenuUnfoldOutlined className={style.trigger} />
) : (
<MenuFoldOutlined className={style.trigger} />
)}
</div>
<Breadcrumb />
<Dropdown className={`fr ${style.content}`} overlay={menu}>
<span className={style.user}>
<span className="avart">{firstWord}</span>
<span>{userName}</span>
</span>
</Dropdown>
<Dropdown overlay={changeMenu}>
<div title="更换主题" className="fr webTheme" />
</Dropdown>
</Layout.Header>
)
}
export default connect(
(state) => state,
actions
)(Header)