您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.tsx 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { Domain } from '@/constants/common';
  2. import { useTranslate } from '@/hooks/common-hooks';
  3. import { useLogout } from '@/hooks/login-hooks';
  4. import { useSecondPathName } from '@/hooks/route-hook';
  5. import { useFetchSystemVersion } from '@/hooks/user-setting-hooks';
  6. import type { MenuProps } from 'antd';
  7. import { Flex, Menu } from 'antd';
  8. import React, { useEffect, useMemo } from 'react';
  9. import { useNavigate } from 'umi';
  10. import {
  11. UserSettingBaseKey,
  12. UserSettingIconMap,
  13. UserSettingRouteKey,
  14. } from '../constants';
  15. import styles from './index.less';
  16. type MenuItem = Required<MenuProps>['items'][number];
  17. const SideBar = () => {
  18. const navigate = useNavigate();
  19. const pathName = useSecondPathName();
  20. const { logout } = useLogout();
  21. const { t } = useTranslate('setting');
  22. const { version, fetchSystemVersion } = useFetchSystemVersion();
  23. useEffect(() => {
  24. if (location.host !== Domain) {
  25. fetchSystemVersion();
  26. }
  27. }, [fetchSystemVersion]);
  28. function getItem(
  29. label: string,
  30. key: React.Key,
  31. icon?: React.ReactNode,
  32. children?: MenuItem[],
  33. type?: 'group',
  34. ): MenuItem {
  35. return {
  36. key,
  37. icon,
  38. children,
  39. label: (
  40. <Flex justify={'space-between'}>
  41. {t(label)}
  42. <span className={styles.version}>
  43. {label === 'system' && version}
  44. </span>
  45. </Flex>
  46. ),
  47. type,
  48. } as MenuItem;
  49. }
  50. const items: MenuItem[] = Object.values(UserSettingRouteKey).map((value) =>
  51. getItem(value, value, UserSettingIconMap[value]),
  52. );
  53. const handleMenuClick: MenuProps['onClick'] = ({ key }) => {
  54. if (key === UserSettingRouteKey.Logout) {
  55. logout();
  56. } else {
  57. navigate(`/${UserSettingBaseKey}/${key}`);
  58. }
  59. };
  60. const selectedKeys = useMemo(() => {
  61. return [pathName];
  62. }, [pathName]);
  63. return (
  64. <section className={styles.sideBarWrapper}>
  65. <Menu
  66. selectedKeys={selectedKeys}
  67. mode="inline"
  68. items={items}
  69. onClick={handleMenuClick}
  70. style={{ width: 312 }}
  71. />
  72. </section>
  73. );
  74. };
  75. export default SideBar;