Skip to content

Commit b32cf54

Browse files
authored
fix: add modules shouldn't reset after some time (#3598)
* fix mutating state
1 parent 251bd6f commit b32cf54

File tree

2 files changed

+48
-41
lines changed

2 files changed

+48
-41
lines changed

src/components/KymaModules/KymaModulesAddModule.js

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState, useEffect, useCallback } from 'react';
1+
import { useCallback, useEffect, useState } from 'react';
22
import { MessageStrip } from '@ui5/webcomponents-react';
33
import { spacing } from '@ui5/webcomponents-react-base';
44
import { useTranslation } from 'react-i18next';
@@ -7,14 +7,13 @@ import { ResourceForm } from 'shared/ResourceForm';
77
import { Spinner } from 'shared/components/Spinner/Spinner';
88
import ModulesCard from './ModulesCard';
99
import './KymaModulesAddModule.scss';
10+
import { cloneDeep } from 'lodash';
1011

1112
export 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}

src/resources/other/kymaModules.routes.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ const ColumnWraper = ({ defaultColumn = 'list', namespaced = false }) => {
7575
skip: !kymaResourceName,
7676
},
7777
);
78-
const [selectedModules, setSelectedModules] = useState(
78+
const [activeKymaModules, setActiveKymaModules] = useState(
7979
kymaResource?.spec?.modules ?? [],
8080
);
8181
const [detailsOpen, setDetailsOpen] = useState(false);
8282
const [openedModuleIndex, setOpenedModuleIndex] = useState();
8383
useEffect(() => {
8484
if (kymaResource) {
85-
setSelectedModules(kymaResource?.spec?.modules || []);
85+
setActiveKymaModules(kymaResource?.spec?.modules || []);
8686
setKymaResourceState(kymaResource);
8787
setInitialUnchangedResource(cloneDeep(kymaResource));
8888
}
@@ -118,14 +118,14 @@ const ColumnWraper = ({ defaultColumn = 'list', namespaced = false }) => {
118118
</Button>
119119
{createPortal(
120120
<DeleteMessageBox
121-
resourceTitle={selectedModules[openedModuleIndex]?.name}
121+
resourceTitle={activeKymaModules[openedModuleIndex]?.name}
122122
deleteFn={() => {
123-
selectedModules.splice(openedModuleIndex, 1);
123+
activeKymaModules.splice(openedModuleIndex, 1);
124124
setKymaResourceState({
125125
...kymaResource,
126126
spec: {
127127
...kymaResource.spec,
128-
modules: selectedModules,
128+
modules: activeKymaModules,
129129
},
130130
});
131131
handleModuleUninstall();
@@ -172,7 +172,7 @@ const ColumnWraper = ({ defaultColumn = 'list', namespaced = false }) => {
172172
kymaResourceLoading={kymaResourceLoading}
173173
kymaResourcesLoading={kymaResourcesLoading}
174174
kymaResourceState={kymaResourceState}
175-
selectedModules={selectedModules}
175+
selectedModules={activeKymaModules}
176176
setOpenedModuleIndex={setOpenedModuleIndex}
177177
detailsOpen={detailsOpen}
178178
namespaced={namespaced}
@@ -209,11 +209,10 @@ const ColumnWraper = ({ defaultColumn = 'list', namespaced = false }) => {
209209
<ErrorBoundary>
210210
<KymaModulesAddModule
211211
resourceName={kymaResourceName}
212-
loadingKymaResources={kymaResourcesLoading}
213212
kymaResourceUrl={resourceUrl}
214213
initialKymaResource={kymaResource}
215-
loading={kymaResourceLoading}
216-
selectedModules={selectedModules}
214+
loading={kymaResourcesLoading || kymaResourceLoading}
215+
activeKymaModules={activeKymaModules}
217216
initialUnchangedResource={initialUnchangedResource}
218217
kymaResource={kymaResourceState}
219218
setKymaResource={setKymaResourceState}

0 commit comments

Comments
 (0)