HeaderBar.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { Link, useNavigate } from 'react-router-dom';
  3. import { UserContext } from '../context/User';
  4. import { API, getLogo, getSystemName, showSuccess } from '../helpers';
  5. import '../index.css';
  6. import fireworks from 'react-fireworks';
  7. import { IconHelpCircle, IconKey, IconUser } from '@douyinfe/semi-icons';
  8. import { Avatar, Dropdown, Layout, Nav, Switch } from '@douyinfe/semi-ui';
  9. import { stringToColor } from '../helpers/render';
  10. // HeaderBar Buttons
  11. let headerButtons = [
  12. {
  13. text: '关于',
  14. itemKey: 'about',
  15. to: '/about',
  16. icon: <IconHelpCircle />
  17. }
  18. ];
  19. if (localStorage.getItem('chat_link')) {
  20. headerButtons.splice(1, 0, {
  21. name: '聊天',
  22. to: '/chat',
  23. icon: 'comments'
  24. });
  25. }
  26. const HeaderBar = () => {
  27. const [userState, userDispatch] = useContext(UserContext);
  28. let navigate = useNavigate();
  29. const [showSidebar, setShowSidebar] = useState(false);
  30. const [dark, setDark] = useState(false);
  31. const systemName = getSystemName();
  32. const logo = getLogo();
  33. var themeMode = localStorage.getItem('theme-mode');
  34. const currentDate = new Date();
  35. // enable fireworks on new year(1.1 and 2.9-2.24)
  36. const isNewYear = (currentDate.getMonth() === 0 && currentDate.getDate() === 1) || (currentDate.getMonth() === 1 && currentDate.getDate() >= 9 && currentDate.getDate() <= 24);
  37. async function logout() {
  38. setShowSidebar(false);
  39. await API.get('/api/user/logout');
  40. showSuccess('注销成功!');
  41. userDispatch({ type: 'logout' });
  42. localStorage.removeItem('user');
  43. navigate('/login');
  44. }
  45. const handleNewYearClick = () => {
  46. fireworks.init('root', {});
  47. fireworks.start();
  48. setTimeout(() => {
  49. fireworks.stop();
  50. setTimeout(() => {
  51. window.location.reload();
  52. }, 10000);
  53. }, 3000);
  54. };
  55. useEffect(() => {
  56. if (themeMode === 'dark') {
  57. switchMode(true);
  58. }
  59. if (isNewYear) {
  60. console.log('Happy New Year!');
  61. }
  62. }, []);
  63. const switchMode = (model) => {
  64. const body = document.body;
  65. if (!model) {
  66. body.removeAttribute('theme-mode');
  67. localStorage.setItem('theme-mode', 'light');
  68. } else {
  69. body.setAttribute('theme-mode', 'dark');
  70. localStorage.setItem('theme-mode', 'dark');
  71. }
  72. setDark(model);
  73. };
  74. return (
  75. <>
  76. <Layout>
  77. <div style={{ width: '100%' }}>
  78. <Nav
  79. mode={'horizontal'}
  80. // bodyStyle={{ height: 100 }}
  81. renderWrapper={({ itemElement, isSubNav, isInSubNav, props }) => {
  82. const routerMap = {
  83. about: '/about',
  84. login: '/login',
  85. register: '/register'
  86. };
  87. return (
  88. <Link
  89. style={{ textDecoration: 'none' }}
  90. to={routerMap[props.itemKey]}
  91. >
  92. {itemElement}
  93. </Link>
  94. );
  95. }}
  96. selectedKeys={[]}
  97. // items={headerButtons}
  98. onSelect={key => {
  99. }}
  100. footer={
  101. <>
  102. {isNewYear &&
  103. // happy new year
  104. <Dropdown
  105. position="bottomRight"
  106. render={
  107. <Dropdown.Menu>
  108. <Dropdown.Item onClick={handleNewYearClick}>Happy New Year!!!</Dropdown.Item>
  109. </Dropdown.Menu>
  110. }
  111. >
  112. <Nav.Item itemKey={'new-year'} text={'🏮'} />
  113. </Dropdown>
  114. }
  115. <Nav.Item itemKey={'about'} icon={<IconHelpCircle />} />
  116. <Switch checkedText="🌞" size={'large'} checked={dark} uncheckedText="🌙" onChange={switchMode} />
  117. {userState.user ?
  118. <>
  119. <Dropdown
  120. position="bottomRight"
  121. render={
  122. <Dropdown.Menu>
  123. <Dropdown.Item onClick={logout}>退出</Dropdown.Item>
  124. </Dropdown.Menu>
  125. }
  126. >
  127. <Avatar size="small" color={stringToColor(userState.user.username)} style={{ margin: 4 }}>
  128. {userState.user.username[0]}
  129. </Avatar>
  130. <span>{userState.user.username}</span>
  131. </Dropdown>
  132. </>
  133. :
  134. <>
  135. <Nav.Item itemKey={'login'} text={'登录'} icon={<IconKey />} />
  136. <Nav.Item itemKey={'register'} text={'注册'} icon={<IconUser />} />
  137. </>
  138. }
  139. </>
  140. }
  141. >
  142. </Nav>
  143. </div>
  144. </Layout>
  145. </>
  146. );
  147. };
  148. export default HeaderBar;