From d80bcf7a965f999514930c2f0f8419c46f413e89 Mon Sep 17 00:00:00 2001 From: Corbin Crutchley Date: Thu, 7 Sep 2023 15:55:17 -0700 Subject: [PATCH] fix: Field default should now be set properly (#445) * fix: fields should now set default value properly * test: add test to validate fix --- packages/form-core/src/FieldApi.ts | 29 +++++++------------ packages/form-core/src/tests/FieldApi.spec.ts | 17 +++++++++++ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/packages/form-core/src/FieldApi.ts b/packages/form-core/src/FieldApi.ts index 8dcd342..070a511 100644 --- a/packages/form-core/src/FieldApi.ts +++ b/packages/form-core/src/FieldApi.ts @@ -129,7 +129,7 @@ export class FieldApi { this.state = this.store.state this.prevState = this.state - this.update(opts as never) + this.options = opts as never } mount = () => { @@ -151,6 +151,7 @@ export class FieldApi { }) }) + this.update(this.options as never) this.options.onMount?.(this as never) return () => { @@ -163,26 +164,16 @@ export class FieldApi { } update = (opts: FieldApiOptions) => { - this.options = { - asyncDebounceMs: this.form.options.asyncDebounceMs ?? 0, - ...opts, - } as never - // Default Value // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (this.state.value === undefined) { - if (this.options.defaultValue !== undefined) { - this.setValue(this.options.defaultValue as never) - } else if ( - opts.form.options.defaultValues?.[ - this.options.name as keyof TFormData - ] !== undefined - ) { - this.setValue( - opts.form.options.defaultValues[ - this.options.name as keyof TFormData - ] as never, - ) + const formDefault = + opts.form.options.defaultValues?.[opts.name as keyof TFormData] + + if (opts.defaultValue !== undefined) { + this.setValue(opts.defaultValue as never) + } else if (formDefault !== undefined) { + this.setValue(formDefault as never) } } @@ -190,6 +181,8 @@ export class FieldApi { if (this._getMeta() === undefined) { this.setMeta(this.state.meta) } + + this.options = opts as never } getValue = (): typeof this._tdata => { diff --git a/packages/form-core/src/tests/FieldApi.spec.ts b/packages/form-core/src/tests/FieldApi.spec.ts index c23a3ee..e19c94d 100644 --- a/packages/form-core/src/tests/FieldApi.spec.ts +++ b/packages/form-core/src/tests/FieldApi.spec.ts @@ -433,4 +433,21 @@ describe('field api', () => { await vi.runAllTimersAsync() expect(field.getMeta().error).toBe('Please enter a different value') }) + + it('should handle default value on field using state.value', async () => { + interface Form { + name: string + } + const form = new FormApi
() + + const field = new FieldApi({ + form, + name: 'name', + defaultValue: 'test', + }) + + field.mount() + + expect(field.state.value).toBe('test') + }) })