| | import React, { useContext, useState } from 'react'; |
| | import { Link, useNavigate } from 'react-router-dom'; |
| | import { UserContext } from '../context/User'; |
| |
|
| | import { Button, Container, Dropdown, Icon, Menu, Segment } from 'semantic-ui-react'; |
| | import { API, getLogo, getSystemName, isAdmin, isMobile, showSuccess } from '../helpers'; |
| | import '../index.css'; |
| |
|
| | |
| | let headerButtons = [ |
| | { |
| | name: '首页', |
| | to: '/', |
| | icon: 'home' |
| | }, |
| | { |
| | name: '渠道', |
| | to: '/channel', |
| | icon: 'sitemap', |
| | admin: true |
| | }, |
| | { |
| | name: '令牌', |
| | to: '/token', |
| | icon: 'key' |
| | }, |
| | { |
| | name: '兑换', |
| | to: '/redemption', |
| | icon: 'dollar sign', |
| | admin: true |
| | }, |
| | { |
| | name: '充值', |
| | to: '/topup', |
| | icon: 'cart' |
| | }, |
| | { |
| | name: '用户', |
| | to: '/user', |
| | icon: 'user', |
| | admin: true |
| | }, |
| | { |
| | name: '日志', |
| | to: '/log', |
| | icon: 'book' |
| | }, |
| | { |
| | name: '设置', |
| | to: '/setting', |
| | icon: 'setting' |
| | }, |
| | { |
| | name: '关于', |
| | to: '/about', |
| | icon: 'info circle' |
| | } |
| | ]; |
| |
|
| | if (localStorage.getItem('chat_link')) { |
| | headerButtons.splice(1, 0, { |
| | name: '聊天', |
| | to: '/chat', |
| | icon: 'comments' |
| | }); |
| | } |
| |
|
| | const Header = () => { |
| | const [userState, userDispatch] = useContext(UserContext); |
| | let navigate = useNavigate(); |
| |
|
| | const [showSidebar, setShowSidebar] = useState(false); |
| | const systemName = getSystemName(); |
| | const logo = getLogo(); |
| |
|
| | async function logout() { |
| | setShowSidebar(false); |
| | await API.get('/api/user/logout'); |
| | showSuccess('注销成功!'); |
| | userDispatch({ type: 'logout' }); |
| | localStorage.removeItem('user'); |
| | navigate('/login'); |
| | } |
| |
|
| | const toggleSidebar = () => { |
| | setShowSidebar(!showSidebar); |
| | }; |
| |
|
| | const renderButtons = (isMobile) => { |
| | return headerButtons.map((button) => { |
| | if (button.admin && !isAdmin()) return <></>; |
| | if (isMobile) { |
| | return ( |
| | <Menu.Item |
| | onClick={() => { |
| | navigate(button.to); |
| | setShowSidebar(false); |
| | }} |
| | > |
| | {button.name} |
| | </Menu.Item> |
| | ); |
| | } |
| | return ( |
| | <Menu.Item key={button.name} as={Link} to={button.to}> |
| | <Icon name={button.icon} /> |
| | {button.name} |
| | </Menu.Item> |
| | ); |
| | }); |
| | }; |
| |
|
| | if (isMobile()) { |
| | return ( |
| | <> |
| | <Menu |
| | borderless |
| | size='large' |
| | style={ |
| | showSidebar |
| | ? { |
| | borderBottom: 'none', |
| | marginBottom: '0', |
| | borderTop: 'none', |
| | height: '51px' |
| | } |
| | : { borderTop: 'none', height: '52px' } |
| | } |
| | > |
| | <Container> |
| | <Menu.Item as={Link} to='/'> |
| | <img |
| | src={logo} |
| | alt='logo' |
| | style={{ marginRight: '0.75em' }} |
| | /> |
| | <div style={{ fontSize: '20px' }}> |
| | <b>{systemName}</b> |
| | </div> |
| | </Menu.Item> |
| | <Menu.Menu position='right'> |
| | <Menu.Item onClick={toggleSidebar}> |
| | <Icon name={showSidebar ? 'close' : 'sidebar'} /> |
| | </Menu.Item> |
| | </Menu.Menu> |
| | </Container> |
| | </Menu> |
| | {showSidebar ? ( |
| | <Segment style={{ marginTop: 0, borderTop: '0' }}> |
| | <Menu secondary vertical style={{ width: '100%', margin: 0 }}> |
| | {renderButtons(true)} |
| | <Menu.Item> |
| | {userState.user ? ( |
| | <Button onClick={logout}>注销</Button> |
| | ) : ( |
| | <> |
| | <Button |
| | onClick={() => { |
| | setShowSidebar(false); |
| | navigate('/login'); |
| | }} |
| | > |
| | 登录 |
| | </Button> |
| | <Button |
| | onClick={() => { |
| | setShowSidebar(false); |
| | navigate('/register'); |
| | }} |
| | > |
| | 注册 |
| | </Button> |
| | </> |
| | )} |
| | </Menu.Item> |
| | </Menu> |
| | </Segment> |
| | ) : ( |
| | <></> |
| | )} |
| | </> |
| | ); |
| | } |
| |
|
| | return ( |
| | <> |
| | <Menu borderless style={{ borderTop: 'none' }}> |
| | <Container> |
| | <Menu.Item as={Link} to='/' className={'hide-on-mobile'}> |
| | <img src={logo} alt='logo' style={{ marginRight: '0.75em' }} /> |
| | <div style={{ fontSize: '20px' }}> |
| | <b>{systemName}</b> |
| | </div> |
| | </Menu.Item> |
| | {renderButtons(false)} |
| | <Menu.Menu position='right'> |
| | {userState.user ? ( |
| | <Dropdown |
| | text={userState.user.username} |
| | pointing |
| | className='link item' |
| | > |
| | <Dropdown.Menu> |
| | <Dropdown.Item onClick={logout}>注销</Dropdown.Item> |
| | </Dropdown.Menu> |
| | </Dropdown> |
| | ) : ( |
| | <Menu.Item |
| | name='登录' |
| | as={Link} |
| | to='/login' |
| | className='btn btn-link' |
| | /> |
| | )} |
| | </Menu.Menu> |
| | </Container> |
| | </Menu> |
| | </> |
| | ); |
| | }; |
| |
|
| | export default Header; |
| |
|