1- import { useCallback , useEffect , useRef , useState } from 'react' ;
1+ import { useCallback , useState } from 'react' ;
22import { useTranslation } from 'react-i18next' ;
33import { ResourceForm } from 'shared/ResourceForm/components/ResourceForm' ;
44import { 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+
631export 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 ] ) ;
0 commit comments