import { isEqual } from 'lodash' export const whatHasChanged = ( prevProps: T, nextProps: T, ): Record => { const changedProps: Record = {} for (const key in nextProps) { if (Object.prototype.hasOwnProperty.call(nextProps, key)) { const prevValue = prevProps[key] const nextValue = nextProps[key] if (!isEqual(prevValue, nextValue)) { if ( nextValue && typeof nextValue === 'object' && prevValue && typeof prevValue === 'object' ) { const nestedChanges = whatHasChanged(prevValue, nextValue) Object.entries(nestedChanges).forEach(([nestedKey, nestedValue]) => { changedProps[`${key}.${nestedKey}`] = nestedValue }) } else { changedProps[`${key}-old`] = prevValue changedProps[`${key}-new`] = nextValue } } } } return changedProps }