| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import { Domain } from '@/constants/common';
- import { useTranslate } from '@/hooks/common-hooks';
- import { useLogout } from '@/hooks/login-hooks';
- import { useSecondPathName } from '@/hooks/route-hook';
- import { useFetchSystemVersion } from '@/hooks/user-setting-hooks';
- import type { MenuProps } from 'antd';
- import { Flex, Menu } from 'antd';
- import React, { useEffect, useMemo } from 'react';
- import { useNavigate } from 'umi';
- import {
- UserSettingBaseKey,
- UserSettingIconMap,
- UserSettingRouteKey,
- } from '../constants';
- import styles from './index.less';
-
- type MenuItem = Required<MenuProps>['items'][number];
-
- const SideBar = () => {
- const navigate = useNavigate();
- const pathName = useSecondPathName();
- const { logout } = useLogout();
- const { t } = useTranslate('setting');
- const { version, fetchSystemVersion } = useFetchSystemVersion();
-
- useEffect(() => {
- if (location.host !== Domain) {
- fetchSystemVersion();
- }
- }, [fetchSystemVersion]);
-
- function getItem(
- label: string,
- key: React.Key,
- icon?: React.ReactNode,
- children?: MenuItem[],
- type?: 'group',
- ): MenuItem {
- return {
- key,
- icon,
- children,
- label: (
- <Flex justify={'space-between'}>
- {t(label)}
- <span className={styles.version}>
- {label === 'system' && version}
- </span>
- </Flex>
- ),
- type,
- } as MenuItem;
- }
-
- const items: MenuItem[] = Object.values(UserSettingRouteKey).map((value) =>
- getItem(value, value, UserSettingIconMap[value]),
- );
-
- const handleMenuClick: MenuProps['onClick'] = ({ key }) => {
- if (key === UserSettingRouteKey.Logout) {
- logout();
- } else {
- navigate(`/${UserSettingBaseKey}/${key}`);
- }
- };
-
- const selectedKeys = useMemo(() => {
- return [pathName];
- }, [pathName]);
-
- return (
- <section className={styles.sideBarWrapper}>
- <Menu
- selectedKeys={selectedKeys}
- mode="inline"
- items={items}
- onClick={handleMenuClick}
- style={{ width: 312 }}
- />
- </section>
- );
- };
-
- export default SideBar;
|