@@ -119,8 +119,7 @@ export async function fetchMenuById(
119
119
} ,
120
120
} )
121
121
) . list as MenuRawData [ ] ) ;
122
- await Promise . all ( menuList . map ( loadDynamicMenuItems ) ) ;
123
- const menuData = mergeMenu ( menuList ) ;
122
+ const menuData = await mergeMenu ( menuList , kernel ) ;
124
123
if ( ! menuData ) {
125
124
throw new Error ( `Menu not found: ${ menuId } ` ) ;
126
125
}
@@ -129,7 +128,10 @@ export async function fetchMenuById(
129
128
return menuData ;
130
129
}
131
130
132
- function mergeMenu ( menuList : MenuRawData [ ] ) : RuntimeMenuRawData {
131
+ async function mergeMenu (
132
+ menuList : MenuRawData [ ] ,
133
+ kernel : Kernel
134
+ ) : Promise < RuntimeMenuRawData > {
133
135
const mainMenu = menuList . find ( ( menu ) => menu . type !== "inject" ) ;
134
136
if ( ! mainMenu ) {
135
137
return undefined ;
@@ -151,6 +153,13 @@ function mergeMenu(menuList: MenuRawData[]): RuntimeMenuRawData {
151
153
} ) ;
152
154
menuWithI18n . set ( menu , menuI18nNamespace ) ;
153
155
}
156
+ }
157
+
158
+ await Promise . all (
159
+ menuList . map ( ( menu ) => loadDynamicMenuItems ( menu , kernel , menuWithI18n ) )
160
+ ) ;
161
+
162
+ for ( const menu of menuList ) {
154
163
if ( menu . items ?. length > 0 ) {
155
164
if ( menu . type === "inject" && menu . injectMenuGroupId ) {
156
165
let injectingMenus = injectWithMenus . get ( menu . injectMenuGroupId ) ;
@@ -164,6 +173,7 @@ function mergeMenu(menuList: MenuRawData[]): RuntimeMenuRawData {
164
173
}
165
174
}
166
175
}
176
+
167
177
return {
168
178
...mainMenu ,
169
179
items : validMenuList . flatMap ( ( menu ) =>
@@ -213,9 +223,29 @@ function processGroupInject(
213
223
} ) ;
214
224
}
215
225
216
- async function loadDynamicMenuItems ( menu : MenuRawData ) : Promise < void > {
226
+ async function loadDynamicMenuItems (
227
+ menu : MenuRawData ,
228
+ kernel : Kernel ,
229
+ menuWithI18n : WeakMap < MenuRawData , string >
230
+ ) : Promise < void > {
217
231
if ( menu . dynamicItems && menu . itemsResolve ) {
218
232
const itemsConf : Partial < { items : MenuItemRawData [ ] } > = { } ;
233
+ const overrideAppId = menu . app [ 0 ] . appId ;
234
+ const context = _internalApiGetCurrentContext ( ) ;
235
+ let newContext = context ;
236
+ if (
237
+ overrideAppId !== context . app . id &&
238
+ attemptToVisit ( menu . itemsResolve , [ "APP" , "I18N" ] )
239
+ ) {
240
+ const storyboard = kernel . bootstrapData . storyboards . find (
241
+ ( story ) => story . app . id === overrideAppId
242
+ ) ;
243
+ newContext = {
244
+ ...context ,
245
+ overrideApp : storyboard ?. app ,
246
+ appendI18nNamespace : menuWithI18n . get ( menu ) ,
247
+ } ;
248
+ }
219
249
await _internalApiGetResolver ( ) . resolveOne (
220
250
"reference" ,
221
251
{
@@ -225,7 +255,7 @@ async function loadDynamicMenuItems(menu: MenuRawData): Promise<void> {
225
255
} ,
226
256
itemsConf ,
227
257
null ,
228
- _internalApiGetCurrentContext ( )
258
+ newContext
229
259
) ;
230
260
menu . items = itemsConf . items ;
231
261
}
0 commit comments