Header.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import React, { useContext, useState } from 'react';
  2. import { Link, useNavigate } from 'react-router-dom';
  3. import { UserContext } from '../context/User';
  4. import { Button, Container, Dropdown, Icon, Menu, Segment } from 'semantic-ui-react';
  5. import { API, getLogo, getSystemName, isAdmin, isMobile, showSuccess } from '../helpers';
  6. import '../index.css';
  7. // Header Buttons
  8. const headerButtons = [
  9. {
  10. name: '首页',
  11. to: '/',
  12. icon: 'home',
  13. },
  14. {
  15. name: '渠道',
  16. to: '/channel',
  17. icon: 'sitemap',
  18. admin: true,
  19. },
  20. {
  21. name: '令牌',
  22. to: '/token',
  23. icon: 'key',
  24. },
  25. {
  26. name: '兑换',
  27. to: '/redemption',
  28. icon: 'dollar sign',
  29. admin: true,
  30. },
  31. {
  32. name: '充值',
  33. to: '/topup',
  34. icon: 'cart',
  35. admin: true,
  36. },
  37. {
  38. name: '用户',
  39. to: '/user',
  40. icon: 'user',
  41. admin: true,
  42. },
  43. {
  44. name: '设置',
  45. to: '/setting',
  46. icon: 'setting',
  47. },
  48. {
  49. name: '关于',
  50. to: '/about',
  51. icon: 'info circle',
  52. },
  53. ];
  54. const Header = () => {
  55. const [userState, userDispatch] = useContext(UserContext);
  56. let navigate = useNavigate();
  57. const [showSidebar, setShowSidebar] = useState(false);
  58. const systemName = getSystemName();
  59. const logo = getLogo();
  60. async function logout() {
  61. setShowSidebar(false);
  62. await API.get('/api/user/logout');
  63. showSuccess('注销成功!');
  64. userDispatch({ type: 'logout' });
  65. localStorage.removeItem('user');
  66. navigate('/login');
  67. }
  68. const toggleSidebar = () => {
  69. setShowSidebar(!showSidebar);
  70. };
  71. const renderButtons = (isMobile) => {
  72. return headerButtons.map((button) => {
  73. if (button.admin && !isAdmin()) return <></>;
  74. if (isMobile) {
  75. return (
  76. <Menu.Item
  77. onClick={() => {
  78. navigate(button.to);
  79. setShowSidebar(false);
  80. }}
  81. >
  82. {button.name}
  83. </Menu.Item>
  84. );
  85. }
  86. return (
  87. <Menu.Item key={button.name} as={Link} to={button.to}>
  88. <Icon name={button.icon} />
  89. {button.name}
  90. </Menu.Item>
  91. );
  92. });
  93. };
  94. if (isMobile()) {
  95. return (
  96. <>
  97. <Menu
  98. borderless
  99. size='large'
  100. style={
  101. showSidebar
  102. ? {
  103. borderBottom: 'none',
  104. marginBottom: '0',
  105. borderTop: 'none',
  106. height: '51px',
  107. }
  108. : { borderTop: 'none', height: '52px' }
  109. }
  110. >
  111. <Container>
  112. <Menu.Item as={Link} to='/'>
  113. <img
  114. src={logo}
  115. alt='logo'
  116. style={{ marginRight: '0.75em' }}
  117. />
  118. <div style={{ fontSize: '20px' }}>
  119. <b>{systemName}</b>
  120. </div>
  121. </Menu.Item>
  122. <Menu.Menu position='right'>
  123. <Menu.Item onClick={toggleSidebar}>
  124. <Icon name={showSidebar ? 'close' : 'sidebar'} />
  125. </Menu.Item>
  126. </Menu.Menu>
  127. </Container>
  128. </Menu>
  129. {showSidebar ? (
  130. <Segment style={{ marginTop: 0, borderTop: '0' }}>
  131. <Menu secondary vertical style={{ width: '100%', margin: 0 }}>
  132. {renderButtons(true)}
  133. <Menu.Item>
  134. {userState.user ? (
  135. <Button onClick={logout}>注销</Button>
  136. ) : (
  137. <>
  138. <Button
  139. onClick={() => {
  140. setShowSidebar(false);
  141. navigate('/login');
  142. }}
  143. >
  144. 登录
  145. </Button>
  146. <Button
  147. onClick={() => {
  148. setShowSidebar(false);
  149. navigate('/register');
  150. }}
  151. >
  152. 注册
  153. </Button>
  154. </>
  155. )}
  156. </Menu.Item>
  157. </Menu>
  158. </Segment>
  159. ) : (
  160. <></>
  161. )}
  162. </>
  163. );
  164. }
  165. return (
  166. <>
  167. <Menu borderless style={{ borderTop: 'none' }}>
  168. <Container>
  169. <Menu.Item as={Link} to='/' className={'hide-on-mobile'}>
  170. <img src={logo} alt='logo' style={{ marginRight: '0.75em' }} />
  171. <div style={{ fontSize: '20px' }}>
  172. <b>{systemName}</b>
  173. </div>
  174. </Menu.Item>
  175. {renderButtons(false)}
  176. <Menu.Menu position='right'>
  177. {userState.user ? (
  178. <Dropdown
  179. text={userState.user.username}
  180. pointing
  181. className='link item'
  182. >
  183. <Dropdown.Menu>
  184. <Dropdown.Item onClick={logout}>注销</Dropdown.Item>
  185. </Dropdown.Menu>
  186. </Dropdown>
  187. ) : (
  188. <Menu.Item
  189. name='登录'
  190. as={Link}
  191. to='/login'
  192. className='btn btn-link'
  193. />
  194. )}
  195. </Menu.Menu>
  196. </Container>
  197. </Menu>
  198. </>
  199. );
  200. };
  201. export default Header;