|
1 | 1 | import { Breadcrumb } from 'antd'; |
2 | | -import { createElement } from 'react'; |
| 2 | +import { cloneElement } from 'react'; |
3 | 3 | import type { MenuInfo } from 'rc-menu/lib/interface'; |
4 | | -import type { ItemType, MenuItemType, SubMenuType } from 'antd/es/menu/interface'; |
| 4 | +import type { MenuItemType } from 'antd/es/menu/interface'; |
5 | 5 | import type { BreadcrumbProps } from 'antd'; |
6 | | -import type { Route } from '@sa/simple-router'; |
7 | 6 | import { useRouterPush } from '@/hooks/common/routerPush'; |
| 7 | +import { getBreadcrumbsByRoute } from './shared'; |
| 8 | + |
| 9 | +function BreadcrumbContent({ label, icon }: { label: JSX.Element; icon: JSX.Element }) { |
| 10 | + return ( |
| 11 | + <div className="i-flex-y-center align-middle"> |
| 12 | + {cloneElement(icon, { className: 'mr-4px text-icon', ...icon.props })} |
| 13 | + {label} |
| 14 | + </div> |
| 15 | + ); |
| 16 | +} |
8 | 17 |
|
9 | 18 | const GlobalBreadcrumb: FC<Omit<BreadcrumbProps, 'items'>> = memo(props => { |
10 | | - const { allMenus: menus } = useMixMenuContext(); |
11 | | - const route = useRoute(); |
| 19 | + const { allMenus: menus, route } = useMixMenuContext(); |
| 20 | + |
12 | 21 | const routerPush = useRouterPush(); |
| 22 | + |
13 | 23 | const breadcrumb = getBreadcrumbsByRoute(route, menus); |
14 | 24 |
|
15 | 25 | function handleClickMenu(menuInfo: MenuInfo) { |
@@ -46,47 +56,4 @@ const GlobalBreadcrumb: FC<Omit<BreadcrumbProps, 'items'>> = memo(props => { |
46 | 56 | ); |
47 | 57 | }); |
48 | 58 |
|
49 | | -function BreadcrumbContent({ label, icon }: { label: JSX.Element; icon: JSX.Element }) { |
50 | | - return ( |
51 | | - <div className="i-flex-y-center align-middle"> |
52 | | - {createElement(icon.type, { className: 'mr-4px text-icon', ...icon.props })} |
53 | | - {label} |
54 | | - </div> |
55 | | - ); |
56 | | -} |
57 | | - |
58 | | -function removeChildren(menu: SubMenuType): Omit<ItemType, 'children'> { |
59 | | - const { children: _, ...rest } = menu; |
60 | | - |
61 | | - return { |
62 | | - ...rest |
63 | | - }; |
64 | | -} |
65 | | -// eslint-disable-next-line max-params |
66 | | -function getBreadcrumbsByRoute( |
67 | | - route: Route, |
68 | | - menus: ItemType[], |
69 | | - index: number = 0, |
70 | | - breadcrumbs: Extract<ItemType, MenuItemType | SubMenuType>[] = [] |
71 | | -) { |
72 | | - const currentMenu = menus.find(item => item?.key === route.matched[index]?.name) as SubMenuType | undefined; |
73 | | - |
74 | | - if (currentMenu) { |
75 | | - const flattenedChildren = currentMenu.children?.map(item => { |
76 | | - if (item && 'children' in item) { |
77 | | - return removeChildren(item as SubMenuType); |
78 | | - } |
79 | | - return item; |
80 | | - }) as MenuItemType[]; |
81 | | - |
82 | | - breadcrumbs.push({ ...currentMenu, children: flattenedChildren }); |
83 | | - |
84 | | - if (index < route.matched.length - 1) { |
85 | | - getBreadcrumbsByRoute(route, currentMenu.children || [], index + 1, breadcrumbs); |
86 | | - } |
87 | | - } |
88 | | - |
89 | | - return breadcrumbs; |
90 | | -} |
91 | | - |
92 | 59 | export default GlobalBreadcrumb; |
0 commit comments