diff --git a/Composer/packages/adaptive-form/src/utils/arrayUtils.ts b/Composer/packages/adaptive-form/src/utils/arrayUtils.ts index 1c10778fe3..ffbc9da9da 100644 --- a/Composer/packages/adaptive-form/src/utils/arrayUtils.ts +++ b/Composer/packages/adaptive-form/src/utils/arrayUtils.ts @@ -3,7 +3,8 @@ import { generateUniqueId } from '@bfc/shared'; import { ChangeHandler } from '@bfc/extension-client'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import isEqual from 'lodash/isEqual'; type ArrayChangeHandler = (items: ArrayItem[]) => void; @@ -78,6 +79,19 @@ export function useArrayItems( ): ArrayItemState { const [cache, setCache] = useState(generateArrayItems(items)); + useEffect(() => { + const newCache = generateArrayItems(items); + + if ( + !isEqual( + cache.map(({ value }) => value), + newCache.map(({ value }) => value) + ) + ) { + setCache(newCache); + } + }, [items]); + const handleChange = (newItems: ArrayItem[]) => { setCache(newItems); onChange(newItems.map(({ value }) => value)); diff --git a/Composer/packages/adaptive-form/src/utils/objectUtils.ts b/Composer/packages/adaptive-form/src/utils/objectUtils.ts index 68d2cee085..ed9518c569 100644 --- a/Composer/packages/adaptive-form/src/utils/objectUtils.ts +++ b/Composer/packages/adaptive-form/src/utils/objectUtils.ts @@ -3,7 +3,8 @@ import { generateUniqueId } from '@bfc/shared'; import { ChangeHandler } from '@bfc/extension-client'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; +import isEqual from 'lodash/isEqual'; type ItemType = { [key: string]: ValueType }; type ObjectChangeHandler = (items: ObjectItem[]) => void; @@ -64,6 +65,19 @@ export function useObjectItems( ): ObjectItemState { const [cache, setCache] = useState(generateObjectEntries(items)); + useEffect(() => { + const newCache = generateObjectEntries(items); + + if ( + !isEqual( + newCache.map(({ id, ...rest }) => rest), + cache.map(({ id, ...rest }) => rest) + ) + ) { + setCache(generateObjectEntries(items)); + } + }, [items]); + const handleChange = (items) => { setCache(items); onChange(items.reduce((acc, { propertyName, propertyValue }) => ({ ...acc, [propertyName]: propertyValue }), {}));