1
- import { useEffect , useRef , useState } from 'react'
1
+ import { Dispatch , SetStateAction , useEffect , useRef , useState } from 'react'
2
2
3
3
import {
4
4
API_STATUS_CODES ,
@@ -31,8 +31,6 @@ import {
31
31
BULK_CI_RESPONSE_STATUS_TEXT ,
32
32
BulkResponseStatus ,
33
33
ENV_TRIGGER_VIEW_GA_EVENTS ,
34
- SKIPPED_RESOURCES_MESSAGE ,
35
- SKIPPED_RESOURCES_STATUS_TEXT ,
36
34
} from '@Components/ApplicationGroup/Constants'
37
35
import TriggerResponseModalBody , {
38
36
TriggerResponseModalFooter ,
@@ -44,14 +42,13 @@ import { getModuleConfigured } from '../../appDetails/appDetails.service'
44
42
import { IGNORE_CACHE_INFO } from '../Constants'
45
43
import BuildImageHeader from './BuildImageHeader'
46
44
import GitInfoMaterial from './GitInfoMaterial'
47
- import { getCIMaterials , triggerBuild } from './service'
45
+ import { getCIMaterials } from './service'
48
46
import { BulkBuildImageModalProps , GitInfoMaterialProps } from './types'
49
47
import {
50
48
getBulkCIDataPromiseGetterList ,
51
49
getBulkCIErrorMessage ,
52
- getBulkCIWarningMessage ,
53
- getCanNodeHaveMaterial ,
54
- getTriggerBuildPayload ,
50
+ getTriggerCIPromiseListAndSkippedResources ,
51
+ parseBulkCIResponseIntoBulkCIDetail ,
55
52
} from './utils'
56
53
57
54
const validateRuntimeParameters = importComponentFromFELibrary (
@@ -86,6 +83,8 @@ const BulkBuildImageModal = ({
86
83
workflow . nodes . some ( ( node ) => node . type === WorkflowNodeType . CI || node . type === WorkflowNodeType . WEBHOOK ) ,
87
84
)
88
85
86
+ const [ numberOfAppsLoading , setNumberOfAppsLoading ] = useState < number > ( 0 )
87
+
89
88
// Returns map of appId to BulkCIDetailType
90
89
const getInitialAppList = async ( appId ?: number ) : Promise < Record < number , BulkCIDetailType > > => {
91
90
const validWorkflows = selectedWorkflows . filter ( ( workflow ) => ! appId || workflow . appId === appId )
@@ -95,6 +94,8 @@ const BulkBuildImageModal = ({
95
94
initialDataAbortControllerRef ,
96
95
)
97
96
97
+ setNumberOfAppsLoading ( validWorkflows . length )
98
+
98
99
if ( ciMaterialPromiseList . length === 0 ) {
99
100
return [ ]
100
101
}
@@ -103,60 +104,23 @@ const BulkBuildImageModal = ({
103
104
await ApiQueuingWithBatch < Awaited < ReturnType < typeof getCIMaterials > > > ( ciMaterialPromiseList )
104
105
const runtimeParamsList = await ApiQueuingWithBatch < RuntimePluginVariables [ ] > ( runtimeParamsPromiseList )
105
106
106
- return validWorkflows . reduce < Record < number , BulkCIDetailType > > ( ( acc , workflow , index ) => {
107
- const node = workflow . nodes . find (
108
- ( currentNode ) =>
109
- currentNode . type === WorkflowNodeType . CI || currentNode . type === WorkflowNodeType . WEBHOOK ,
110
- )
111
-
112
- if ( ! node ) {
113
- return acc
114
- }
107
+ setNumberOfAppsLoading ( 0 )
115
108
116
- const currentMaterial =
117
- ( ciMaterialList [ index ] . status === PromiseAllStatusType . FULFILLED ? ciMaterialList [ index ] . value : [ ] ) ||
118
- [ ]
119
- const runtimeParams =
120
- runtimeParamsList [ index ] . status === PromiseAllStatusType . FULFILLED ? runtimeParamsList [ index ] . value : [ ]
121
-
122
- acc [ workflow . appId ] = {
123
- workflowId : workflow . id ,
124
- appId : workflow . appId ,
125
- name : workflow . name ,
126
- node,
127
- material : currentMaterial ,
128
- materialInitialError :
129
- ciMaterialList [ index ] . status === PromiseAllStatusType . REJECTED
130
- ? ciMaterialList [ index ] . reason
131
- : null ,
132
- runtimeParams : runtimeParams || [ ] ,
133
- runtimeParamsInitialError :
134
- runtimeParamsList [ index ] . status === PromiseAllStatusType . REJECTED
135
- ? runtimeParamsList [ index ] . reason
136
- : null ,
137
- runtimeParamsErrorState : {
138
- isValid : runtimeParamsList [ index ] . status !== PromiseAllStatusType . REJECTED ,
139
- cellError : { } ,
140
- } ,
141
- warningMessage : getBulkCIWarningMessage ( node ) ,
142
- errorMessage : getBulkCIErrorMessage (
143
- workflow . appId ,
144
- node ,
145
- filteredCIPipelineMap . get ( String ( workflow . appId ) ) ,
146
- currentMaterial ,
147
- ) ,
148
- filteredCIPipelines : filteredCIPipelineMap . get ( String ( workflow . appId ) ) ,
149
- ignoreCache : false ,
150
- ciConfiguredGitMaterialId : workflow . ciConfiguredGitMaterialId ,
151
- }
109
+ const bulkCIDetailsMap = parseBulkCIResponseIntoBulkCIDetail ( {
110
+ ciMaterialList,
111
+ runtimeParamsList,
112
+ validWorkflows,
113
+ filteredCIPipelineMap,
114
+ } )
152
115
153
- return acc
154
- } , { } )
116
+ return bulkCIDetailsMap
155
117
}
156
118
157
- const [ isLoadingAppInfoMap , appInfoMapRes , , , setAppInfoMapRes ] = useAsync ( getInitialAppList )
119
+ const [ isLoadingAppInfoMap , appInfoMapRes , , , setAppInfoMapResWithoutType ] = useAsync ( getInitialAppList )
158
120
const [ isLoadingSingleAppInfoMap , setIsLoadingSingleAppInfoMap ] = useState < boolean > ( false )
159
121
122
+ const setAppInfoMapRes : Dispatch < SetStateAction < Record < number , BulkCIDetailType > > > = setAppInfoMapResWithoutType
123
+
160
124
const appInfoMap = appInfoMapRes || { }
161
125
162
126
const sortedAppList = Object . values ( appInfoMap ) . sort ( ( a , b ) => stringComparatorBySortOrder ( a . name , b . name ) )
@@ -168,9 +132,10 @@ const BulkBuildImageModal = ({
168
132
setIsLoadingSingleAppInfoMap ( true )
169
133
initialDataAbortControllerRef . current . abort ( )
170
134
initialDataAbortControllerRef . current = new AbortController ( )
135
+ // Will also handle error state
171
136
const currentAppInfo = await getInitialAppList ( selectedAppId )
172
137
setAppInfoMapRes ( ( prevAppInfoMapRes ) => {
173
- const updatedAppInfoMap = { ... prevAppInfoMapRes }
138
+ const updatedAppInfoMap = structuredClone ( prevAppInfoMapRes )
174
139
updatedAppInfoMap [ selectedAppId ] = currentAppInfo [ selectedAppId ]
175
140
return updatedAppInfoMap
176
141
} )
@@ -230,17 +195,6 @@ const BulkBuildImageModal = ({
230
195
return true
231
196
}
232
197
233
- const getPayloadFromAppDetails = ( appDetails : BulkCIDetailType ) =>
234
- getTriggerBuildPayload ( {
235
- materialList : appDetails . material ,
236
- ciConfiguredGitMaterialId : appDetails . ciConfiguredGitMaterialId ,
237
- runtimeParams : appDetails . runtimeParams ,
238
- invalidateCache : appDetails . ignoreCache ,
239
- isJobCI : appDetails . node ?. isJobCI ,
240
- ciNodeId : + ( appDetails . node ?. id || 0 ) ,
241
- selectedEnv : null ,
242
- } )
243
-
244
198
const getResponseStatusFromCode = ( errorCode : number ) : BulkResponseStatus => {
245
199
switch ( errorCode ) {
246
200
case API_STATUS_CODES . EXPECTATION_FAILED :
@@ -262,45 +216,11 @@ const BulkBuildImageModal = ({
262
216
handleAnalyticsEvent ( ENV_TRIGGER_VIEW_GA_EVENTS . BulkCITriggered )
263
217
setIsBuildTriggerLoading ( true )
264
218
265
- const newResourceList : ResponseRowType [ ] = [ ]
266
- const appsToTrigger = sortedAppList . filter ( ( appDetails ) => {
267
- if ( appsToRetry && ! appsToRetry [ appDetails . appId ] ) {
268
- return false
269
- }
270
-
271
- if ( ! getCanNodeHaveMaterial ( appDetails . node ) ) {
272
- newResourceList . push ( {
273
- appId : appDetails . appId ,
274
- appName : appDetails . name ,
275
- statusText : SKIPPED_RESOURCES_STATUS_TEXT ,
276
- status : BulkResponseStatus . SKIP ,
277
- message : SKIPPED_RESOURCES_MESSAGE ,
278
- } )
279
- }
280
-
281
- const payload = getPayloadFromAppDetails ( appDetails )
282
-
283
- if ( typeof payload === 'string' ) {
284
- newResourceList . push ( {
285
- appId : appDetails . appId ,
286
- appName : appDetails . name ,
287
- statusText : SKIPPED_RESOURCES_STATUS_TEXT ,
288
- status : BulkResponseStatus . SKIP ,
289
- message : payload ,
290
- } )
291
- }
292
-
293
- return getCanNodeHaveMaterial ( appDetails . node ) && typeof payload !== 'string'
294
- } )
295
-
296
- const promiseList = appsToTrigger . map ( ( appDetails ) => {
297
- const payload = getPayloadFromAppDetails ( appDetails ) as Exclude <
298
- ReturnType < typeof getTriggerBuildPayload > ,
299
- string
300
- >
301
-
302
- return ( ) => triggerBuild ( { payload } )
303
- } )
219
+ const {
220
+ promiseList,
221
+ appsToTrigger,
222
+ skippedResourceList : newResourceList ,
223
+ } = getTriggerCIPromiseListAndSkippedResources ( sortedAppList , appsToRetry )
304
224
305
225
if ( ! promiseList . length ) {
306
226
ToastManager . showToast ( {
@@ -351,10 +271,11 @@ const BulkBuildImageModal = ({
351
271
await handleTriggerBuild ( )
352
272
}
353
273
354
- // TODO: Need to understand this
355
274
const isStartBuildDisabled = ( ) : boolean =>
356
275
sortedAppList . some (
357
276
( app ) =>
277
+ ! ! app . runtimeParamsInitialError ||
278
+ ! ! app . materialInitialError ||
358
279
app . node . isTriggerBlocked ||
359
280
( app . errorMessage &&
360
281
( app . errorMessage !== SOURCE_NOT_CONFIGURED ||
@@ -419,11 +340,17 @@ const BulkBuildImageModal = ({
419
340
420
341
const setCurrentAppMaterialList : GitInfoMaterialProps [ 'setMaterialList' ] = ( getUpdatedMaterialList ) => {
421
342
setAppInfoMapRes ( ( prevAppInfoMapRes ) => {
422
- const updatedAppInfoMap = { ... prevAppInfoMapRes }
343
+ const updatedAppInfoMap = structuredClone ( prevAppInfoMapRes )
423
344
const currentApp = updatedAppInfoMap [ selectedAppId ]
424
345
425
346
if ( currentApp ) {
426
347
currentApp . material = getUpdatedMaterialList ( currentApp . material )
348
+ currentApp . errorMessage = getBulkCIErrorMessage (
349
+ currentApp . appId ,
350
+ currentApp . node ,
351
+ currentApp . filteredCIPipelines ,
352
+ currentApp . material ,
353
+ )
427
354
}
428
355
429
356
return updatedAppInfoMap
@@ -432,7 +359,7 @@ const BulkBuildImageModal = ({
432
359
433
360
const handleRuntimeParamChange : GitInfoMaterialProps [ 'handleRuntimeParamChange' ] = ( updatedRuntimeParams ) => {
434
361
setAppInfoMapRes ( ( prevAppInfoMapRes ) => {
435
- const updatedAppInfoMap = { ... prevAppInfoMapRes }
362
+ const updatedAppInfoMap = structuredClone ( prevAppInfoMapRes )
436
363
const currentApp = updatedAppInfoMap [ selectedAppId ]
437
364
if ( currentApp ) {
438
365
currentApp . runtimeParams = updatedRuntimeParams
@@ -443,7 +370,7 @@ const BulkBuildImageModal = ({
443
370
444
371
const handleRuntimeParamError : GitInfoMaterialProps [ 'handleRuntimeParamError' ] = ( errorState ) => {
445
372
setAppInfoMapRes ( ( prevAppInfoMapRes ) => {
446
- const updatedAppInfoMap = { ... prevAppInfoMapRes }
373
+ const updatedAppInfoMap = structuredClone ( prevAppInfoMapRes )
447
374
const currentApp = updatedAppInfoMap [ selectedAppId ]
448
375
if ( currentApp ) {
449
376
currentApp . runtimeParamsErrorState = errorState
@@ -454,8 +381,9 @@ const BulkBuildImageModal = ({
454
381
455
382
const toggleSelectedAppIgnoreCache = ( ) => {
456
383
setAppInfoMapRes ( ( prevAppInfoMapRes ) => {
457
- const updatedAppInfoMap = { ... prevAppInfoMapRes }
384
+ const updatedAppInfoMap = structuredClone ( prevAppInfoMapRes )
458
385
const currentApp = updatedAppInfoMap [ selectedAppId ]
386
+
459
387
if ( currentApp ) {
460
388
currentApp . ignoreCache = ! currentApp . ignoreCache
461
389
}
@@ -470,8 +398,8 @@ const BulkBuildImageModal = ({
470
398
const renderContent = ( ) => {
471
399
if ( isLoadingAppInfoMap || isBuildTriggerLoading ) {
472
400
const message = isBuildTriggerLoading
473
- ? BULK_CI_BUILD_STATUS ( selectedWorkflows . length )
474
- : BULK_CI_MATERIAL_STATUS ( selectedWorkflows . length )
401
+ ? BULK_CI_BUILD_STATUS ( numberOfAppsLoading )
402
+ : BULK_CI_MATERIAL_STATUS ( numberOfAppsLoading )
475
403
476
404
return < GenericEmptyState { ...message } SvgImage = { MechanicalOperation } contentClassName = "text-center" />
477
405
}
@@ -485,7 +413,6 @@ const BulkBuildImageModal = ({
485
413
486
414
return (
487
415
< GitInfoMaterial
488
- key = { selectedAppId }
489
416
workflowId = { appData . workflowId }
490
417
appId = { selectedAppId }
491
418
node = { appData . node }
0 commit comments