| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- import React, { useContext, useEffect, useMemo, useState } from 'react';
- import { Link, useNavigate } from 'react-router-dom';
- import { UserContext } from '../context/User';
- import { StatusContext } from '../context/Status';
- import {
- API,
- getLogo,
- getSystemName,
- isAdmin,
- isMobile,
- showError,
- } from '../helpers';
- import '../index.css';
- import {
- IconCalendarClock,
- IconComment,
- IconCreditCard,
- IconGift,
- IconHistogram,
- IconHome,
- IconImage,
- IconKey,
- IconLayers,
- IconPriceTag,
- IconSetting,
- IconUser,
- } from '@douyinfe/semi-icons';
- import { Layout, Nav } from '@douyinfe/semi-ui';
- import { setStatusData } from '../helpers/data.js';
- // HeaderBar Buttons
- const SiderBar = () => {
- const [userState, userDispatch] = useContext(UserContext);
- const [statusState, statusDispatch] = useContext(StatusContext);
- const defaultIsCollapsed =
- isMobile() || localStorage.getItem('default_collapse_sidebar') === 'true';
- let navigate = useNavigate();
- const [selectedKeys, setSelectedKeys] = useState(['home']);
- const systemName = getSystemName();
- const logo = getLogo();
- const [isCollapsed, setIsCollapsed] = useState(defaultIsCollapsed);
- const routerMap = {
- home: '/',
- channel: '/channel',
- token: '/token',
- redemption: '/redemption',
- topup: '/topup',
- user: '/user',
- log: '/log',
- midjourney: '/midjourney',
- setting: '/setting',
- about: '/about',
- chat: '/chat',
- detail: '/detail',
- pricing: '/pricing',
- };
- const headerButtons = useMemo(
- () => [
- {
- text: '首页',
- itemKey: 'home',
- to: '/',
- icon: <IconHome />,
- },
- {
- text: '渠道',
- itemKey: 'channel',
- to: '/channel',
- icon: <IconLayers />,
- className: isAdmin() ? 'semi-navigation-item-normal' : 'tableHiddle',
- },
- {
- text: '聊天',
- itemKey: 'chat',
- to: '/chat',
- icon: <IconComment />,
- className: localStorage.getItem('chat_link')
- ? 'semi-navigation-item-normal'
- : 'tableHiddle',
- },
- {
- text: '令牌',
- itemKey: 'token',
- to: '/token',
- icon: <IconKey />,
- },
- {
- text: '兑换码',
- itemKey: 'redemption',
- to: '/redemption',
- icon: <IconGift />,
- className: isAdmin() ? 'semi-navigation-item-normal' : 'tableHiddle',
- },
- {
- text: '钱包',
- itemKey: 'topup',
- to: '/topup',
- icon: <IconCreditCard />,
- },
- {
- text: '模型价格',
- itemKey: 'pricing',
- to: '/pricing',
- icon: <IconPriceTag />,
- },
- {
- text: '用户管理',
- itemKey: 'user',
- to: '/user',
- icon: <IconUser />,
- className: isAdmin() ? 'semi-navigation-item-normal' : 'tableHiddle',
- },
- {
- text: '日志',
- itemKey: 'log',
- to: '/log',
- icon: <IconHistogram />,
- },
- {
- text: '数据看板',
- itemKey: 'detail',
- to: '/detail',
- icon: <IconCalendarClock />,
- className:
- localStorage.getItem('enable_data_export') === 'true'
- ? 'semi-navigation-item-normal'
- : 'tableHiddle',
- },
- {
- text: '绘图',
- itemKey: 'midjourney',
- to: '/midjourney',
- icon: <IconImage />,
- className:
- localStorage.getItem('enable_drawing') === 'true'
- ? 'semi-navigation-item-normal'
- : 'tableHiddle',
- },
- {
- text: '设置',
- itemKey: 'setting',
- to: '/setting',
- icon: <IconSetting />,
- },
- // {
- // text: '关于',
- // itemKey: 'about',
- // to: '/about',
- // icon: <IconAt/>
- // }
- ],
- [
- localStorage.getItem('enable_data_export'),
- localStorage.getItem('enable_drawing'),
- localStorage.getItem('chat_link'),
- isAdmin(),
- ],
- );
- const loadStatus = async () => {
- const res = await API.get('/api/status');
- if (res === undefined) {
- return;
- }
- const { success, data } = res.data;
- if (success) {
- statusDispatch({ type: 'set', payload: data });
- setStatusData(data);
- } else {
- showError('无法正常连接至服务器!');
- }
- };
- useEffect(() => {
- loadStatus().then(() => {
- setIsCollapsed(
- isMobile() ||
- localStorage.getItem('default_collapse_sidebar') === 'true',
- );
- });
- let localKey = window.location.pathname.split('/')[1];
- if (localKey === '') {
- localKey = 'home';
- }
- setSelectedKeys([localKey]);
- }, []);
- return (
- <>
- <Layout>
- <div style={{ height: '100%' }}>
- <Nav
- // bodyStyle={{ maxWidth: 200 }}
- style={{ maxWidth: 200 }}
- defaultIsCollapsed={
- isMobile() ||
- localStorage.getItem('default_collapse_sidebar') === 'true'
- }
- isCollapsed={isCollapsed}
- onCollapseChange={(collapsed) => {
- setIsCollapsed(collapsed);
- }}
- selectedKeys={selectedKeys}
- renderWrapper={({ itemElement, isSubNav, isInSubNav, props }) => {
- return (
- <Link
- style={{ textDecoration: 'none' }}
- to={routerMap[props.itemKey]}
- >
- {itemElement}
- </Link>
- );
- }}
- items={headerButtons}
- onSelect={(key) => {
- setSelectedKeys([key.itemKey]);
- }}
- header={{
- logo: (
- <img src={logo} alt='logo' style={{ marginRight: '0.75em' }} />
- ),
- text: systemName,
- }}
- // footer={{
- // text: '© 2021 NekoAPI',
- // }}
- >
- <Nav.Footer collapseButton={true}></Nav.Footer>
- </Nav>
- </div>
- </Layout>
- </>
- );
- };
- export default SiderBar;
|