Skip to content

Commit c20a78d

Browse files
committed
fix: fix scenario parameters changes loss on file upload
Bug was probably caused by writing/reading during render, it seems to be fixed by using a lazy-initialization pattern c.f. facebook/react#18545 c.f. https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily
1 parent 0b9e265 commit c20a78d

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/components/ScenarioParameters/ScenarioParameters.js

+17-12
Original file line numberDiff line numberDiff line change
@@ -101,34 +101,39 @@ const ScenarioParameters = ({
101101
);
102102

103103
// Store the reset values for the run template parameters, based on defaultParametersValues and scenario data.
104-
const parametersValuesRef = useRef({});
105-
parametersValuesRef.current = parametersValuesForReset;
104+
const parametersValuesRef = useRef(null);
105+
function getParametersValuesRef() {
106+
if (parametersValuesRef.current === null) {
107+
parametersValuesRef.current = parametersValuesForReset;
108+
}
109+
return parametersValuesRef.current;
110+
}
106111

107112
const generateParametersValuesToRenderFromParametersValuesRef = () => {
108113
const newParametersValuesToRender = {};
109-
for (const parameterId in parametersValuesRef.current) {
114+
for (const parameterId in getParametersValuesRef()) {
110115
if (parametersMetadata[parameterId]?.varType === DATASET_ID_VARTYPE) {
111-
const datasetId = parametersValuesRef.current[parameterId];
116+
const datasetId = getParametersValuesRef()[parameterId];
112117
newParametersValuesToRender[parameterId] = FileManagementUtils.buildClientFileDescriptorFromDataset(
113118
datasets,
114119
datasetId
115120
);
116121
} else {
117-
newParametersValuesToRender[parameterId] = parametersValuesRef.current[parameterId];
122+
newParametersValuesToRender[parameterId] = getParametersValuesRef()[parameterId];
118123
}
119124
}
120125
return newParametersValuesToRender;
121126
};
122127

123-
const setParametersValuesToRenderFromParametersValuesRef = () => {
124-
setParametersValuesToRender(generateParametersValuesToRenderFromParametersValuesRef());
125-
};
126-
127128
// Add scenario parameters data in state
128129
const [parametersValuesToRender, setParametersValuesToRender] = useState(
129130
generateParametersValuesToRenderFromParametersValuesRef()
130131
);
131132

133+
const setParametersValuesToRenderFromParametersValuesRef = () => {
134+
setParametersValuesToRender(generateParametersValuesToRenderFromParametersValuesRef());
135+
};
136+
132137
// Generate input components for each scenario parameters tab
133138
for (const parametersGroupMetadata of parametersGroupsMetadata) {
134139
parametersGroupMetadata.tab = ScenarioParametersTabFactory.create(
@@ -154,10 +159,9 @@ const ScenarioParameters = ({
154159
}
155160
}
156161
parametersValuesRef.current = {
157-
...parametersValuesRef.current,
162+
...getParametersValuesRef(),
158163
...newParametersValuesToPatch,
159164
};
160-
161165
await FileManagementUtils.applyPendingOperationsOnFileParameters(
162166
solution,
163167
parametersMetadata,
@@ -174,14 +178,15 @@ const ScenarioParameters = ({
174178
}, [parametersValuesRef]);
175179

176180
useEffect(() => {
181+
parametersValuesRef.current = parametersValuesForReset;
177182
discardLocalChanges();
178183
// eslint-disable-next-line
179184
}, [currentScenario]);
180185

181186
const getParametersForUpdate = () => {
182187
const parametersData = ScenarioParametersUtils.buildParametersForUpdate(
183188
solution,
184-
parametersValuesRef.current,
189+
getParametersValuesRef(),
185190
runTemplateParametersIds
186191
);
187192
const additionalParameters = ScenarioParametersUtils.buildAdditionalParameters(currentScenario, scenarioList);

0 commit comments

Comments
 (0)