You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { useSecondPathName } from '@/hooks/routeHook';
  2. import type { MenuProps } from 'antd';
  3. import { Menu } from 'antd';
  4. import React, { useMemo } from 'react';
  5. import { useNavigate } from 'umi';
  6. import {
  7. UserSettingBaseKey,
  8. UserSettingIconMap,
  9. UserSettingRouteKey,
  10. UserSettingRouteMap,
  11. } from '../constants';
  12. type MenuItem = Required<MenuProps>['items'][number];
  13. function getItem(
  14. label: React.ReactNode,
  15. key: React.Key,
  16. icon?: React.ReactNode,
  17. children?: MenuItem[],
  18. type?: 'group',
  19. ): MenuItem {
  20. return {
  21. key,
  22. icon,
  23. children,
  24. label,
  25. type,
  26. } as MenuItem;
  27. }
  28. const items: MenuItem[] = Object.values(UserSettingRouteKey).map((value) =>
  29. getItem(UserSettingRouteMap[value], value, UserSettingIconMap[value]),
  30. );
  31. const SideBar = () => {
  32. const navigate = useNavigate();
  33. const pathName = useSecondPathName();
  34. const handleMenuClick: MenuProps['onClick'] = ({ key }) => {
  35. navigate(`/${UserSettingBaseKey}/${key}`);
  36. };
  37. const selectedKeys = useMemo(() => {
  38. return [pathName];
  39. }, [pathName]);
  40. return (
  41. <Menu
  42. selectedKeys={selectedKeys}
  43. mode="inline"
  44. items={items}
  45. onClick={handleMenuClick}
  46. />
  47. );
  48. };
  49. export default SideBar;