1- import { useState , useEffect , useCallback } from 'react' ;
1+ import { useCallback , useEffect , useState } from 'react' ;
22import { MessageStrip } from '@ui5/webcomponents-react' ;
33import { spacing } from '@ui5/webcomponents-react-base' ;
44import { useTranslation } from 'react-i18next' ;
@@ -7,14 +7,13 @@ import { ResourceForm } from 'shared/ResourceForm';
77import { Spinner } from 'shared/components/Spinner/Spinner' ;
88import ModulesCard from './ModulesCard' ;
99import './KymaModulesAddModule.scss' ;
10+ import { cloneDeep } from 'lodash' ;
1011
1112export default function KymaModulesAddModule ( {
1213 resourceName,
13- loadingKymaResources,
1414 kymaResourceUrl,
15- initialKymaResource,
1615 loading,
17- selectedModules ,
16+ activeKymaModules ,
1817 initialUnchangedResource,
1918 kymaResource,
2019 setKymaResource,
@@ -26,6 +25,29 @@ export default function KymaModulesAddModule({
2625
2726 const modulesReleaseMetaResourceUrl = `/apis/operator.kyma-project.io/v1beta2/modulereleasemetas` ;
2827
28+ const [ resource , setResource ] = useState ( cloneDeep ( kymaResource ) ) ;
29+
30+ const [ selectedModules , setSelectedModules ] = useState ( [ ] ) ;
31+
32+ useEffect ( ( ) => {
33+ if ( selectedModules && kymaResource ) {
34+ const newModules = selectedModules . filter (
35+ newModules =>
36+ ! activeKymaModules . find (
37+ activeModules => activeModules . name === newModules . name ,
38+ ) ,
39+ ) ;
40+ const mergedModules = activeKymaModules . concat ( newModules ) ;
41+ setResource ( {
42+ ...kymaResource ,
43+ spec : {
44+ ...kymaResource ?. spec ,
45+ modules : mergedModules ,
46+ } ,
47+ } ) ;
48+ }
49+ } , [ setKymaResource , kymaResource , selectedModules , activeKymaModules ] ) ;
50+
2951 const { data : modules } = useGet ( modulesResourceUrl , {
3052 pollingInterval : 3000 ,
3153 skip : ! resourceName ,
@@ -69,7 +91,7 @@ export default function KymaModulesAddModule({
6991 } ;
7092 } , [ cardsContainerRef , calculateColumns ] ) ;
7193
72- if ( loading || loadingKymaResources || ! kymaResource ) {
94+ if ( loading || ! kymaResource ) {
7395 return (
7496 < div style = { { height : 'calc(100vh - 14rem)' } } >
7597 < Spinner />
@@ -155,53 +177,39 @@ export default function KymaModulesAddModule({
155177 } , [ ] ) ;
156178
157179 const isChecked = name => {
158- return kymaResource ?. spec ?. modules ?. find ( module => module . name === name )
159- ? true
160- : false ;
180+ return ! ! selectedModules ?. find ( module => module . name === name ) ;
161181 } ;
162182
163183 const setCheckbox = ( module , checked , index ) => {
184+ const newSelectedModules = [ ...selectedModules ] ;
164185 if ( checked ) {
165- selectedModules . push ( {
186+ newSelectedModules . push ( {
166187 name : module . name ,
167188 } ) ;
168189 } else {
169- selectedModules . splice ( index , 1 ) ;
190+ newSelectedModules . splice ( index , 1 ) ;
170191 }
171-
172- setKymaResource ( {
173- ...kymaResource ,
174- spec : {
175- ...kymaResource . spec ,
176- modules : selectedModules ,
177- } ,
178- } ) ;
192+ setSelectedModules ( newSelectedModules ) ;
179193 } ;
180194
181195 const setChannel = ( module , channel , index ) => {
196+ const modulesToUpdate = [ ...selectedModules ] ;
182197 if (
183198 selectedModules . find (
184199 selectedModule => selectedModule . name === module . name ,
185200 )
186201 ) {
187202 if ( channel === 'predefined' ) {
188- delete selectedModules [ index ] . channel ;
189- } else selectedModules [ index ] . channel = channel ;
203+ delete modulesToUpdate [ index ] . channel ;
204+ } else modulesToUpdate [ index ] . channel = channel ;
190205 } else {
191- selectedModules . push ( {
206+ modulesToUpdate . push ( {
192207 name : module . name ,
193208 } ) ;
194209 if ( channel !== 'predefined' )
195- selectedModules [ selectedModules ?. length - 1 ] . channel = channel ;
210+ modulesToUpdate [ modulesToUpdate ?. length - 1 ] . channel = channel ;
196211 }
197-
198- setKymaResource ( {
199- ...kymaResource ,
200- spec : {
201- ...kymaResource . spec ,
202- modules : selectedModules ,
203- } ,
204- } ) ;
212+ setSelectedModules ( modulesToUpdate ) ;
205213 } ;
206214
207215 const findStatus = moduleName => {
@@ -290,8 +298,8 @@ export default function KymaModulesAddModule({
290298 createUrl = { kymaResourceUrl }
291299 pluralKind = { 'kymas' }
292300 singularName = { 'Kyma' }
293- resource = { kymaResource }
294- setResource = { setKymaResource }
301+ resource = { resource }
302+ setResource = { setResource }
295303 initialResource = { initialUnchangedResource }
296304 disableDefaultFields
297305 formElementRef = { props . formElementRef }
0 commit comments