@@ -9,11 +9,11 @@ import {
99 Settings ,
1010} from '@ant-design/pro-layout' ;
1111import ProLayout from '@ant-design/pro-layout' ;
12- import React , { useEffect , useMemo , useRef } from 'react' ;
12+ import React , { useEffect , useMemo , useRef , useCallback } from 'react' ;
1313import { Dispatch , getIntl , getLocale } from 'umi' ;
1414import { Link , useIntl , connect , history } from 'umi' ;
1515import { Result , Button } from 'antd' ;
16- import { getCategories , hasFunction } from '@/utils/authority' ;
16+ import { getCategories } from '@/utils/authority' ;
1717import Authorized from '@/utils/Authorized' ;
1818import RightContent from '@/components/GlobalHeader/RightContent' ;
1919import type { ConnectState } from '@/models/connect' ;
@@ -38,6 +38,7 @@ export type BasicLayoutProps = {
3838 route : ProLayoutProps [ 'route' ] & {
3939 authority : string [ ] ;
4040 } ;
41+ categories ?: string [ ] ;
4142 settings : Settings ;
4243 dispatch : Dispatch ;
4344} & ProLayoutProps ;
@@ -46,26 +47,6 @@ export type BasicLayoutContext = { [K in 'location']: BasicLayoutProps[K] } & {
4647} ;
4748/** Use Authorized check all menu item */
4849
49- // Filter menu by categories stored from login (e.g., Application, Configuration, Node, Client, User, Role, Service, System)
50- const menuDataRender = ( menuList : MenuDataItem [ ] ) : MenuDataItem [ ] => {
51- const cats = getCategories ( ) ;
52- return menuList
53- . filter ( m => {
54- // category filter
55- const category = ( m as any ) . category ;
56- if ( category && ! cats . includes ( category ) ) return false ;
57-
58- return true ;
59- } )
60- . map ( ( item ) => {
61- const localItem = {
62- ...item ,
63- children : item . children ? menuDataRender ( item . children ) : undefined ,
64- } ;
65- return Authorized . check ( item . authority , localItem , null ) as MenuDataItem ;
66- } ) ;
67- } ;
68-
6950const BasicLayout : React . FC < BasicLayoutProps > = ( props ) => {
7051 const {
7152 dispatch,
@@ -76,6 +57,38 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
7657 } ,
7758 } = props ;
7859
60+ // keep categories in props to force re-render when user changes; fall back to persisted storage to avoid empty menu during bootstrap
61+ const categories = useMemo < string [ ] > ( ( ) => {
62+ if ( props . categories && props . categories . length ) {
63+ return props . categories ;
64+ }
65+ return getCategories ( ) ;
66+ } , [ props . categories ] ) ;
67+
68+ // Filter menu by categories stored from login (e.g., Application, Configuration, Node, Client, User, Role, Service, System)
69+ const menuDataRender = useCallback (
70+ ( menuList : MenuDataItem [ ] ) : MenuDataItem [ ] => {
71+ const cats = categories || [ ] ;
72+ console . log ( 'menuDataRender categories=' , cats ) ;
73+ return menuList
74+ . filter ( ( m ) => {
75+ // category filter
76+ const category = ( m as any ) . category ;
77+ if ( category && ! cats . includes ( category ) ) return false ;
78+
79+ return true ;
80+ } )
81+ . map ( ( item ) => {
82+ const localItem = {
83+ ...item ,
84+ children : item . children ? menuDataRender ( item . children ) : undefined ,
85+ } ;
86+ return Authorized . check ( item . authority , localItem , null ) as MenuDataItem ;
87+ } ) ;
88+ } ,
89+ [ categories ] ,
90+ ) ;
91+
7992 const menuDataRef = useRef < MenuDataItem [ ] > ( [ ] ) ;
8093
8194 useEffect ( ( ) => {
@@ -166,7 +179,8 @@ const BasicLayout: React.FC<BasicLayoutProps> = (props) => {
166179 ) ;
167180} ;
168181
169- export default connect ( ( { global, settings } : ConnectState ) => ( {
182+ export default connect ( ( { global, settings, user } : ConnectState ) => ( {
170183 collapsed : global . collapsed ,
171184 settings,
185+ categories : user . currentUser ?. currentCategories ,
172186} ) ) ( BasicLayout ) ;
0 commit comments