From 21a0e5ca88664879c34dc5b7795b192604db9f97 Mon Sep 17 00:00:00 2001 From: Nikhil Agarwal Date: Wed, 8 Feb 2023 12:40:17 +0530 Subject: [PATCH] Fix getValue and setValue when a field has not been mounted --- package.json | 2 +- src/FormProvider.tsx | 28 ++++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index bf73975..f5a2d23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-recoil-form", - "version": "0.3.2", + "version": "0.3.3", "license": "MIT", "author": "Wit By Bit", "main": "dist/index.js", diff --git a/src/FormProvider.tsx b/src/FormProvider.tsx index 358c0a1..1e0fd46 100644 --- a/src/FormProvider.tsx +++ b/src/FormProvider.tsx @@ -309,6 +309,9 @@ export function useFormContext() { newValue: { value?: any; extraInfo?: any } ) => { const get = snapshotToGet(snapshot); + const initialValues = get( + formInitialValuesAtom(formId) + ) as InitialValues; const newAtomData = {} as Partial; if (newValue.value !== undefined) { newAtomData.data = newValue.value; @@ -329,7 +332,14 @@ export function useFormContext() { type: fieldKey.type, formId, }), - (atomValue) => Object.assign({}, atomValue, newAtomData) + (atomValue) => { + const updatedAtomData = Object.assign({}, atomValue, newAtomData); + // If field has not been mounted, this part will ensure that the setValue is not overridden by old initial values + if (initialValues.version > updatedAtomData.initVer) { + updatedAtomData.initVer = initialValues.version; + } + return updatedAtomData; + } ); } else if (fieldKey.type === 'field-array') { setFieldArrayDataAndExtraInfo( @@ -364,7 +374,21 @@ export function useFormContext() { formId, }) ) as IFieldAtomValue; - return { value: fieldAtom.data, extraInfo: fieldAtom.extraInfo }; + const initialValuesAtom = get( + formInitialValuesAtom(formId) + ) as InitialValues; + let value = fieldAtom.data; + let extraInfo = fieldAtom.extraInfo; + // Using initial value if field has not been mounted/initialized yet + if ( + !key.ancestors?.length && + value === undefined && + fieldAtom.initVer < initialValuesAtom.version + ) { + value = getPathInObj(initialValuesAtom.values, key.name); + extraInfo = getPathInObj(initialValuesAtom.extraInfos, key.name); + } + return { value, extraInfo }; } else if (key.type === 'field-array') { const { data, extraInfo } = getFieldArrayDataAndExtraInfo( formId,