import { get, set, isEqual } from 'lodash-es';
import { Obj } from '../typings';
export interface FieldConfig<T, K = string> {
key: K;
getCurrentValue?: (values: T) => any;
getOriginalValue?: (values: T) => any;
originalKey?: string;
changedField?: string;
deepCompare?: boolean;
currentDefaultValue?: any;
changedFieldDefaultValue?: any;
}
export const processFormChangedFields = <T = Obj>(
currentValues: T,
originalValues: T,
fieldConfig: FieldConfig<T>[],
changedFields: Obj = {},
) => {
fieldConfig.forEach(config => {
const {
key,
getCurrentValue,
getOriginalValue,
originalKey = key,
changedField = key,
deepCompare,
changedFieldDefaultValue,
currentDefaultValue
} = config;
const currentValue = getCurrentValue ? getCurrentValue(currentValues as T) : get(currentValues, key, currentDefaultValue);
const originalValue = getOriginalValue ? getOriginalValue(originalValues as T) : get(originalValues, originalKey);
if (deepCompare) {
if (!isEqual(currentValue, originalValue)) {
set(changedFields, changedField, currentValue || changedFieldDefaultValue);
}
} else if (currentValue !== originalValue) {
set(changedFields, changedField, currentValue || changedFieldDefaultValue);
}
});
return changedFields;
};