HeaderBar.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 =
  37. (currentDate.getMonth() === 0 && currentDate.getDate() === 1) ||
  38. (currentDate.getMonth() === 1 &&
  39. currentDate.getDate() >= 9 &&
  40. currentDate.getDate() <= 24);
  41. async function logout() {
  42. setShowSidebar(false);
  43. await API.get('/api/user/logout');
  44. showSuccess('注销成功!');
  45. userDispatch({ type: 'logout' });
  46. localStorage.removeItem('user');
  47. navigate('/login');
  48. }
  49. const handleNewYearClick = () => {
  50. fireworks.init('root', {});
  51. fireworks.start();
  52. setTimeout(() => {
  53. fireworks.stop();
  54. setTimeout(() => {
  55. window.location.reload();
  56. }, 10000);
  57. }, 3000);
  58. };
  59. useEffect(() => {
  60. if (themeMode === 'dark') {
  61. switchMode(true);
  62. }
  63. if (isNewYear) {
  64. console.log('Happy New Year!');
  65. }
  66. }, []);
  67. const switchMode = (model) => {
  68. const body = document.body;
  69. if (!model) {
  70. body.removeAttribute('theme-mode');
  71. localStorage.setItem('theme-mode', 'light');
  72. } else {
  73. body.setAttribute('theme-mode', 'dark');
  74. localStorage.setItem('theme-mode', 'dark');
  75. }
  76. setDark(model);
  77. };
  78. return (
  79. <>
  80. <Layout>
  81. <div style={{ width: '100%' }}>
  82. <Nav
  83. mode={'horizontal'}
  84. // bodyStyle={{ height: 100 }}
  85. renderWrapper={({ itemElement, isSubNav, isInSubNav, props }) => {
  86. const routerMap = {
  87. about: '/about',
  88. login: '/login',
  89. register: '/register',
  90. };
  91. return (
  92. <Link
  93. style={{ textDecoration: 'none' }}
  94. to={routerMap[props.itemKey]}
  95. >
  96. {itemElement}
  97. </Link>
  98. );
  99. }}
  100. selectedKeys={[]}
  101. // items={headerButtons}
  102. onSelect={(key) => {}}
  103. footer={
  104. <>
  105. {isNewYear && (
  106. // happy new year
  107. <Dropdown
  108. position='bottomRight'
  109. render={
  110. <Dropdown.Menu>
  111. <Dropdown.Item onClick={handleNewYearClick}>
  112. Happy New Year!!!
  113. </Dropdown.Item>
  114. </Dropdown.Menu>
  115. }
  116. >
  117. <Nav.Item itemKey={'new-year'} text={'🏮'} />
  118. </Dropdown>
  119. )}
  120. <Nav.Item itemKey={'about'} icon={<IconHelpCircle />} />
  121. <Switch
  122. checkedText='🌞'
  123. size={'large'}
  124. checked={dark}
  125. uncheckedText='🌙'
  126. onChange={switchMode}
  127. />
  128. {userState.user ? (
  129. <>
  130. <Dropdown
  131. position='bottomRight'
  132. render={
  133. <Dropdown.Menu>
  134. <Dropdown.Item onClick={logout}>退出</Dropdown.Item>
  135. </Dropdown.Menu>
  136. }
  137. >
  138. <Avatar
  139. size='small'
  140. color={stringToColor(userState.user.username)}
  141. style={{ margin: 4 }}
  142. >
  143. {userState.user.username[0]}
  144. </Avatar>
  145. <span>{userState.user.username}</span>
  146. </Dropdown>
  147. </>
  148. ) : (
  149. <>
  150. <Nav.Item
  151. itemKey={'login'}
  152. text={'登录'}
  153. icon={<IconKey />}
  154. />
  155. <Nav.Item
  156. itemKey={'register'}
  157. text={'注册'}
  158. icon={<IconUser />}
  159. />
  160. </>
  161. )}
  162. </>
  163. }
  164. ></Nav>
  165. </div>
  166. </Layout>
  167. </>
  168. );
  169. };
  170. export default HeaderBar;