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
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)
|