Skip to content

Commit c5e8fa5

Browse files
dbaduraOliwiaGowor
andauthored
chore: Remove refs from Rich Editor Data Field (kyma-project#4569)
* remove refs from Rich Editor Data Field * clean code * fix: review adjustments --------- Co-authored-by: Oliwia Gowor <oliwia.gowor@sap.com>
1 parent 3d81ab2 commit c5e8fa5

File tree

2 files changed

+38
-27
lines changed

2 files changed

+38
-27
lines changed

src/shared/ResourceForm/fields/RichEditorDataField/RichEditorDataField.jsx

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,50 @@
1-
import { useCallback, useEffect, useRef, useState } from 'react';
1+
import { useCallback, useState } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { ResourceForm } from 'shared/ResourceForm/components/ResourceForm';
44
import { RichEditorSection } from './RichEditorSection';
55

6+
function createInternalState(data, previousInitialState) {
7+
const dataAsArray = transformData(data, previousInitialState);
8+
9+
if (checkIfLastItemIsNotNull(dataAsArray)) {
10+
// Add new empty field
11+
return [...dataAsArray, null];
12+
} else {
13+
return dataAsArray;
14+
}
15+
}
16+
17+
function transformData(obj, internalData) {
18+
return Object.entries(obj || {}).map(([key, value]) => {
19+
return {
20+
key,
21+
value,
22+
language: internalData?.find((d) => d?.key === key)?.language || '',
23+
};
24+
});
25+
}
26+
27+
function checkIfLastItemIsNotNull(arr) {
28+
return !arr.length || arr[arr.length - 1];
29+
}
30+
631
export function RichEditorDataField({
732
value: data,
833
setValue: setData,
934
tooltipContent,
1035
}) {
1136
const { t } = useTranslation();
12-
const [internalData, setInternalData] = useState([]);
13-
const valueRef = useRef(null);
14-
const firstRender = useRef(true); // detect languages only on first render
37+
const [internalData, setInternalData] = useState(() =>
38+
createInternalState(data, null),
39+
);
1540

16-
// update internal value
17-
if (JSON.stringify(data) !== valueRef.current) {
18-
setInternalData(
19-
Object.entries(data || {}).map(([key, value]) => ({
20-
key,
21-
value,
22-
language: internalData.find((d) => d?.key === key)?.language || '',
23-
})),
24-
);
25-
firstRender.current = false;
26-
valueRef.current = JSON.stringify(data);
41+
const [prevData, setPrevData] = useState(data);
42+
// if previous data changed
43+
if (prevData !== data) {
44+
setPrevData(data);
45+
setInternalData(createInternalState(data, internalData));
2746
}
2847

29-
// add empty "new" item
30-
useEffect(() => {
31-
if (!internalData.length || internalData[internalData.length - 1]) {
32-
setInternalData([...internalData, null]);
33-
}
34-
}, [internalData]);
35-
3648
// update original data source
3749
const pushValue = useCallback(() => {
3850
setData(
@@ -52,16 +64,15 @@ export function RichEditorDataField({
5264
<RichEditorSection
5365
key={index}
5466
item={item}
55-
setInternalData={setInternalData}
56-
onChange={(data) =>
67+
onChange={(data) => {
5768
setInternalData((internalData) => {
5869
internalData[index] = {
5970
...item,
6071
...data,
6172
};
6273
return [...internalData];
63-
})
64-
}
74+
});
75+
}}
6576
onDelete={() => {
6677
internalData.splice(index, 1);
6778
setInternalData([...internalData]);

src/shared/ResourceForm/fields/RichEditorDataField/RichEditorSection.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function RichEditorSection({ item, onChange, onDelete, pushValue }) {
4242
const selectedOption = getAvailableLanguages().find(
4343
(o) => o.text === event.target.value,
4444
);
45-
if (selectedOption) onChange(selectedOption.key);
45+
if (selectedOption) onChange({ language: selectedOption.key });
4646
}}
4747
placeholder={t('components.rich-editor-data-field.language-placeholder')}
4848
>

0 commit comments

Comments
 (0)