Header.js 4.8 KB

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