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

10 months ago
5 months ago
10 months ago
  1. import React, { useEffect, FC } from 'react'
  2. import { useHistory } from 'react-router-dom'
  3. import { Menu, Dropdown, Layout } from 'antd'
  4. import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons'
  5. import Breadcrumb from '@/components/BreadCrumb'
  6. import { connect } from 'react-redux'
  7. import * as actions from '@/store/actions'
  8. import style from './Header.module.less'
  9. interface Props extends ReduxProps { }
  10. const Header: FC<Props> = ({
  11. storeData: { collapsed, theme, userInfo },
  12. setStoreData
  13. }) => {
  14. const history = useHistory()
  15. const { userName = '-' } = userInfo
  16. const firstWord = userName.slice(0, 1)
  17. const logout = async () => {
  18. await setStoreData('SET_USERINFO', {})
  19. history.replace({ pathname: '/login' })
  20. }
  21. const changeTheme = (themes: string) => {
  22. setStoreData('SET_THEME', themes)
  23. }
  24. const menu = (
  25. <Menu>
  26. <Menu.Item onClick={logout}>
  27. <span>退</span>
  28. </Menu.Item>
  29. </Menu>
  30. )
  31. const changeMenu = (
  32. <Menu>
  33. <Menu.Item onClick={() => changeTheme('')}>
  34. <span></span>
  35. </Menu.Item>
  36. <Menu.Item onClick={() => changeTheme('default')}>
  37. <span></span>
  38. </Menu.Item>
  39. </Menu>
  40. )
  41. const toggle = (): void => {
  42. setStoreData('SET_COLLAPSED', !collapsed)
  43. }
  44. // 更换主题
  45. useEffect(() => {
  46. if (theme === 'default') {
  47. const script = document.createElement('script')
  48. script.id = 'themeJs'
  49. script.src = '/static/less.min.js'
  50. document.body.appendChild(script)
  51. setTimeout(() => {
  52. const themeStyle = document.getElementById('less:color')
  53. if (themeStyle) localStorage.setItem('themeStyle', themeStyle.innerText)
  54. }, 500)
  55. } else {
  56. const themeJs = document.getElementById('themeJs')
  57. const themeStyle = document.getElementById('less:color')
  58. if (themeJs) themeJs.remove()
  59. if (themeStyle) themeStyle.remove()
  60. localStorage.removeItem('themeStyle')
  61. }
  62. }, [theme])
  63. return (
  64. <Layout.Header className={style.header}>
  65. <div className={style.toggleMenu} onClick={toggle}>
  66. {collapsed ? (
  67. <MenuUnfoldOutlined className={style.trigger} />
  68. ) : (
  69. <MenuFoldOutlined className={style.trigger} />
  70. )}
  71. </div>
  72. <Breadcrumb />
  73. <Dropdown className={`fr ${style.content}`} overlay={menu}>
  74. <span className={style.user}>
  75. <span className="avart">{firstWord}</span>
  76. <span>{userName}</span>
  77. </span>
  78. </Dropdown>
  79. <Dropdown overlay={changeMenu}>
  80. <div title="更换主题" className="fr webTheme" />
  81. </Dropdown>
  82. </Layout.Header>
  83. )
  84. }
  85. export default connect(
  86. (state) => state,
  87. actions
  88. )(Header)