Header.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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, 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: '/user',
  28. icon: 'user',
  29. admin: true,
  30. },
  31. {
  32. name: '设置',
  33. to: '/setting',
  34. icon: 'setting',
  35. },
  36. {
  37. name: '关于',
  38. to: '/about',
  39. icon: 'info circle',
  40. },
  41. ];
  42. const Header = () => {
  43. const [userState, userDispatch] = useContext(UserContext);
  44. let navigate = useNavigate();
  45. const [showSidebar, setShowSidebar] = useState(false);
  46. async function logout() {
  47. setShowSidebar(false);
  48. await API.get('/api/user/logout');
  49. showSuccess('注销成功!');
  50. userDispatch({ type: 'logout' });
  51. localStorage.removeItem('user');
  52. navigate('/login');
  53. }
  54. const toggleSidebar = () => {
  55. setShowSidebar(!showSidebar);
  56. };
  57. const renderButtons = (isMobile) => {
  58. return headerButtons.map((button) => {
  59. if (button.admin && !isAdmin()) return <></>;
  60. if (isMobile) {
  61. return (
  62. <Menu.Item
  63. onClick={() => {
  64. navigate(button.to);
  65. setShowSidebar(false);
  66. }}
  67. >
  68. {button.name}
  69. </Menu.Item>
  70. );
  71. }
  72. return (
  73. <Menu.Item key={button.name} as={Link} to={button.to}>
  74. <Icon name={button.icon} />
  75. {button.name}
  76. </Menu.Item>
  77. );
  78. });
  79. };
  80. if (isMobile()) {
  81. return (
  82. <>
  83. <Menu
  84. borderless
  85. size='large'
  86. style={
  87. showSidebar
  88. ? {
  89. borderBottom: 'none',
  90. marginBottom: '0',
  91. borderTop: 'none',
  92. height: '51px',
  93. }
  94. : { borderTop: 'none', height: '52px' }
  95. }
  96. >
  97. <Container>
  98. <Menu.Item as={Link} to='/'>
  99. <img
  100. src='/logo.png'
  101. alt='logo'
  102. style={{ marginRight: '0.75em' }}
  103. />
  104. <div style={{ fontSize: '20px' }}>
  105. <b>One API</b>
  106. </div>
  107. </Menu.Item>
  108. <Menu.Menu position='right'>
  109. <Menu.Item onClick={toggleSidebar}>
  110. <Icon name={showSidebar ? 'close' : 'sidebar'} />
  111. </Menu.Item>
  112. </Menu.Menu>
  113. </Container>
  114. </Menu>
  115. {showSidebar ? (
  116. <Segment style={{ marginTop: 0, borderTop: '0' }}>
  117. <Menu secondary vertical style={{ width: '100%', margin: 0 }}>
  118. {renderButtons(true)}
  119. <Menu.Item>
  120. {userState.user ? (
  121. <Button onClick={logout}>注销</Button>
  122. ) : (
  123. <>
  124. <Button
  125. onClick={() => {
  126. setShowSidebar(false);
  127. navigate('/login');
  128. }}
  129. >
  130. 登录
  131. </Button>
  132. <Button
  133. onClick={() => {
  134. setShowSidebar(false);
  135. navigate('/register');
  136. }}
  137. >
  138. 注册
  139. </Button>
  140. </>
  141. )}
  142. </Menu.Item>
  143. </Menu>
  144. </Segment>
  145. ) : (
  146. <></>
  147. )}
  148. </>
  149. );
  150. }
  151. return (
  152. <>
  153. <Menu borderless style={{ borderTop: 'none' }}>
  154. <Container>
  155. <Menu.Item as={Link} to='/' className={'hide-on-mobile'}>
  156. <img src='/logo.png' alt='logo' style={{ marginRight: '0.75em' }} />
  157. <div style={{ fontSize: '20px' }}>
  158. <b>One API</b>
  159. </div>
  160. </Menu.Item>
  161. {renderButtons(false)}
  162. <Menu.Menu position='right'>
  163. {userState.user ? (
  164. <Dropdown
  165. text={userState.user.username}
  166. pointing
  167. className='link item'
  168. >
  169. <Dropdown.Menu>
  170. <Dropdown.Item onClick={logout}>注销</Dropdown.Item>
  171. </Dropdown.Menu>
  172. </Dropdown>
  173. ) : (
  174. <Menu.Item
  175. name='登录'
  176. as={Link}
  177. to='/login'
  178. className='btn btn-link'
  179. />
  180. )}
  181. </Menu.Menu>
  182. </Container>
  183. </Menu>
  184. </>
  185. );
  186. };
  187. export default Header;