Skip to content

Commit 58fece9

Browse files
feat(form-core): pass onSubmitMeta to onSubmitInvalid and listeners.onSubmit (#1664)
* fix(form-core): pass submit meta to onSubmitInvalid * chore: change type assertion to be stricter * feat(form-core): pass onSubmitMeta to onSubmit listeners * chore: add unit tests --------- Co-authored-by: LeCarbonator <18158911+LeCarbonator@users.noreply.github.com>
1 parent f7b95d5 commit 58fece9

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

packages/form-core/src/FormApi.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ export interface FormListeners<
314314
TOnServer,
315315
TSubmitMeta
316316
>
317+
meta: TSubmitMeta
317318
}) => void
318319
}
319320

@@ -440,6 +441,7 @@ export interface FormOptions<
440441
TOnServer,
441442
TSubmitMeta
442443
>
444+
meta: TSubmitMeta
443445
}) => void
444446
transform?: FormTransform<
445447
NoInfer<TFormData>,
@@ -1772,6 +1774,9 @@ export class FormApi<
17721774

17731775
if (!this.state.canSubmit) return
17741776

1777+
const submitMetaArg =
1778+
submitMeta ?? (this.options.onSubmitMeta as TSubmitMeta)
1779+
17751780
this.baseStore.setState((d) => ({ ...d, isSubmitting: true }))
17761781

17771782
const done = () => {
@@ -1785,6 +1790,7 @@ export class FormApi<
17851790
this.options.onSubmitInvalid?.({
17861791
value: this.state.values,
17871792
formApi: this,
1793+
meta: submitMetaArg,
17881794
})
17891795
return
17901796
}
@@ -1797,6 +1803,7 @@ export class FormApi<
17971803
this.options.onSubmitInvalid?.({
17981804
value: this.state.values,
17991805
formApi: this,
1806+
meta: submitMetaArg,
18001807
})
18011808
return
18021809
}
@@ -1812,15 +1819,15 @@ export class FormApi<
18121819
)
18131820
})
18141821

1815-
this.options.listeners?.onSubmit?.({ formApi: this })
1822+
this.options.listeners?.onSubmit?.({ formApi: this, meta: submitMetaArg })
18161823

18171824
try {
18181825
// Run the submit code
18191826
await this.options.onSubmit?.({
18201827
value: this.state.values,
18211828
formApi: this,
1822-
meta: submitMeta ?? this.options.onSubmitMeta,
1823-
} as any)
1829+
meta: submitMetaArg,
1830+
})
18241831

18251832
batch(() => {
18261833
this.baseStore.setState((prev) => ({

packages/form-core/tests/FormApi.spec.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3121,6 +3121,30 @@ describe('form api', () => {
31213121
await form.handleSubmit({ dinosaur: 'Stegosaurus' })
31223122
})
31233123

3124+
it('should pass the handleSubmit meta data to onSubmitInvalid', async () => {
3125+
const form = new FormApi({
3126+
onSubmitMeta: {} as { dinosaur: string },
3127+
onSubmitInvalid: async ({ meta }) => {
3128+
expect(meta.dinosaur).toEqual('Stegosaurus')
3129+
},
3130+
})
3131+
3132+
await form.handleSubmit({ dinosaur: 'Stegosaurus' })
3133+
})
3134+
3135+
it('should pass the handleSubmit meta data to the onSubmit listener', async () => {
3136+
const form = new FormApi({
3137+
onSubmitMeta: {} as { dinosaur: string },
3138+
listeners: {
3139+
onSubmit: ({ meta }) => {
3140+
expect(meta.dinosaur).toEqual('Stegosaurus')
3141+
},
3142+
},
3143+
})
3144+
3145+
await form.handleSubmit({ dinosaur: 'Stegosaurus' })
3146+
})
3147+
31243148
it('should pass the handleSubmit default meta data to onSubmit', async () => {
31253149
const form = new FormApi({
31263150
onSubmitMeta: { dinosaur: 'Frank' } as { dinosaur: string },
@@ -3132,6 +3156,30 @@ describe('form api', () => {
31323156
await form.handleSubmit()
31333157
})
31343158

3159+
it('should pass the handleSubmit default meta data to onSubmitInvalid', async () => {
3160+
const form = new FormApi({
3161+
onSubmitMeta: { dinosaur: 'Frank' } as { dinosaur: string },
3162+
onSubmitInvalid: async ({ meta }) => {
3163+
expect(meta.dinosaur).toEqual('Frank')
3164+
},
3165+
})
3166+
3167+
await form.handleSubmit()
3168+
})
3169+
3170+
it('should pass the handleSubmit default meta data to the onSubmit listener', async () => {
3171+
const form = new FormApi({
3172+
onSubmitMeta: { dinosaur: 'Frank' } as { dinosaur: string },
3173+
listeners: {
3174+
onSubmit: ({ meta }) => {
3175+
expect(meta.dinosaur).toEqual('Frank')
3176+
},
3177+
},
3178+
})
3179+
3180+
await form.handleSubmit()
3181+
})
3182+
31353183
it('should read and update union objects', async () => {
31363184
const form = new FormApi({
31373185
defaultValues: {

0 commit comments

Comments
 (0)