import { Tooltip } from '@reach/tooltip'; import cx from 'clsx'; import * as React from 'react'; import { Info } from 'react-feather'; import { useTranslation } from 'react-i18next'; import { FcAreaChart, FcDocument, FcGlobe, FcLink, FcRuler, FcSettings } from 'react-icons/fc'; import { useQuery } from 'react-query'; import { Link, useLocation } from 'react-router-dom'; import { fetchVersion } from '~/api/version'; import { ThemeSwitcher } from '~/components/shared/ThemeSwitcher'; import { connect } from '~/components/StateProvider'; import { getClashAPIConfig } from '~/store/app'; import { ClashAPIConfig } from '~/types'; import s from './SideBar.module.scss'; type Props = { apiConfig: ClashAPIConfig }; const icons = { activity: FcAreaChart, globe: FcGlobe, command: FcRuler, file: FcDocument, settings: FcSettings, link: FcLink, }; const SideBarRow = React.memo(function SideBarRow({ isActive, to, iconId, labelText, }: SideBarRowProps) { const Comp = icons[iconId]; const className = cx(s.row, isActive ? s.rowActive : null); return (
{labelText}
); }); interface SideBarRowProps { isActive: boolean; to: string; iconId?: string; labelText?: string; } const pages = [ { to: '/', iconId: 'activity', labelText: 'Overview', }, { to: '/proxies', iconId: 'globe', labelText: 'Proxies', }, { to: '/rules', iconId: 'command', labelText: 'Rules', }, { to: '/connections', iconId: 'link', labelText: 'Conns', }, { to: '/configs', iconId: 'settings', labelText: 'Config', }, { to: '/logs', iconId: 'file', labelText: 'Logs', }, ]; const mapState = (s) => ({ apiConfig: getClashAPIConfig(s), }); export default connect(mapState)(SideBar); function SideBar(props: Props) { const { t } = useTranslation(); const location = useLocation(); const { data: version } = useQuery(['/version', props.apiConfig], () => fetchVersion('/version', props.apiConfig) ); return (
{pages.map(({ to, iconId, labelText }) => ( ))}
); }