Skip to content

Commit 649162d

Browse files
author
Sebastian Hoffmann
committed
feat(react): allow withForms render function to take extending properties
1 parent 411dd94 commit 649162d

File tree

3 files changed

+101
-93
lines changed

3 files changed

+101
-93
lines changed

packages/form-core/src/FormApi.ts

+65-79
Original file line numberDiff line numberDiff line change
@@ -193,43 +193,40 @@ export interface FormValidators<
193193
*/
194194
export interface FormTransform<
195195
TFormData,
196+
TOnMount extends undefined | FormValidateOrFn<TFormData>,
197+
TOnChange extends undefined | FormValidateOrFn<TFormData>,
198+
TOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
199+
TOnBlur extends undefined | FormValidateOrFn<TFormData>,
200+
TOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
201+
TOnSubmit extends undefined | FormValidateOrFn<TFormData>,
202+
TOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFormData>,
203+
TOnServer extends undefined | FormAsyncValidateOrFn<TFormData>,
196204
TSubmitMeta = never,
197205
> {
198-
fn: <
199-
TFFormData extends TFormData,
200-
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
201-
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
202-
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
203-
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
204-
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
205-
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
206-
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
207-
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
208-
TFSubmitMeta extends TSubmitMeta
209-
>(
206+
fn: (
210207
formBase: FormApi<
211-
TFFormData,
212-
TFOnMount,
213-
TFOnChange,
214-
TFOnChangeAsync,
215-
TFOnBlur,
216-
TFOnBlurAsync,
217-
TFOnSubmit,
218-
TFOnSubmitAsync,
219-
TFOnServer,
220-
TFSubmitMeta
208+
TFormData,
209+
TOnMount,
210+
TOnChange,
211+
TOnChangeAsync,
212+
TOnBlur,
213+
TOnBlurAsync,
214+
TOnSubmit,
215+
TOnSubmitAsync,
216+
TOnServer,
217+
TSubmitMeta
221218
>,
222219
) => FormApi<
223-
TFFormData,
224-
TFOnMount,
225-
TFOnChange,
226-
TFOnChangeAsync,
227-
TFOnBlur,
228-
TFOnBlurAsync,
229-
TFOnSubmit,
230-
TFOnSubmitAsync,
231-
TFOnServer,
232-
TFSubmitMeta
220+
TFormData,
221+
TOnMount,
222+
TOnChange,
223+
TOnChangeAsync,
224+
TOnBlur,
225+
TOnBlurAsync,
226+
TOnSubmit,
227+
TOnSubmitAsync,
228+
TOnServer,
229+
TSubmitMeta
233230
>
234231
deps: unknown[]
235232
}
@@ -299,63 +296,52 @@ export interface FormOptions<
299296
/**
300297
* A function to be called when the form is submitted, what should happen once the user submits a valid form returns `any` or a promise `Promise<any>`
301298
*/
302-
onSubmit?: <
303-
TFFormData extends TFormData,
304-
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
305-
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
306-
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
307-
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
308-
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
309-
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
310-
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
311-
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
312-
TFSubmitMeta extends TSubmitMeta
313-
>(props: {
314-
value: TFFormData
299+
onSubmit?: (props: {
300+
value: TFormData
315301
formApi: FormApi<
316-
TFFormData,
317-
TFOnMount,
318-
TFOnChange,
319-
TFOnChangeAsync,
320-
TFOnBlur,
321-
TFOnBlurAsync,
322-
TFOnSubmit,
323-
TFOnSubmitAsync,
324-
TFOnServer,
325-
TFSubmitMeta
302+
TFormData,
303+
TOnMount,
304+
TOnChange,
305+
TOnChangeAsync,
306+
TOnBlur,
307+
TOnBlurAsync,
308+
TOnSubmit,
309+
TOnSubmitAsync,
310+
TOnServer,
311+
TSubmitMeta
326312
>
327313
meta: TSubmitMeta
328314
}) => any | Promise<any>
329315
/**
330316
* Specify an action for scenarios where the user tries to submit an invalid form.
331317
*/
332-
onSubmitInvalid?: <
333-
TFFormData extends TFormData,
334-
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
335-
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
336-
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
337-
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
338-
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
339-
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
340-
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
341-
TFOnServer extends undefined | FormValidateOrFn<TFFormData>,
342-
TFSubmitMeta extends TSubmitMeta
343-
>(props: {
344-
value: TFFormData
318+
onSubmitInvalid?: (props: {
319+
value: TFormData
345320
formApi: FormApi<
346-
TFFormData,
347-
TFOnMount,
348-
TFOnChange,
349-
TFOnChangeAsync,
350-
TFOnBlur,
351-
TFOnBlurAsync,
352-
TFOnSubmit,
353-
TFOnSubmitAsync,
354-
TFOnServer,
355-
TFSubmitMeta
321+
TFormData,
322+
TOnMount,
323+
TOnChange,
324+
TOnChangeAsync,
325+
TOnBlur,
326+
TOnBlurAsync,
327+
TOnSubmit,
328+
TOnSubmitAsync,
329+
TOnServer,
330+
TSubmitMeta
356331
>
357332
}) => void
358-
transform?: FormTransform<NoInfer<TFormData>>
333+
transform?: FormTransform<
334+
NoInfer<TFormData>,
335+
NoInfer<TOnMount>,
336+
NoInfer<TOnChange>,
337+
NoInfer<TOnChangeAsync>,
338+
NoInfer<TOnBlur>,
339+
NoInfer<TOnBlurAsync>,
340+
NoInfer<TOnSubmit>,
341+
NoInfer<TOnSubmitAsync>,
342+
NoInfer<TOnServer>,
343+
NoInfer<TSubmitMeta>
344+
>
359345
}
360346

361347
/**

packages/react-form/src/createFormHook.tsx

+22-11
Original file line numberDiff line numberDiff line change
@@ -198,20 +198,31 @@ export interface WithFormProps<
198198
> {
199199
// Optional, but adds props to the `render` function outside of `form`
200200
props?: TRenderProps
201-
render: (
201+
render: <
202+
TFFormData extends TFormData,
203+
TFOnMount extends undefined | FormValidateOrFn<TFFormData>,
204+
TFOnChange extends undefined | FormValidateOrFn<TFFormData>,
205+
TFOnChangeAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
206+
TFOnBlur extends undefined | FormValidateOrFn<TFFormData>,
207+
TFOnBlurAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
208+
TFOnSubmit extends undefined | FormValidateOrFn<TFFormData>,
209+
TFOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TFFormData>,
210+
TFOnServer extends undefined | FormAsyncValidateOrFn<TFFormData>,
211+
TFSubmitMeta,
212+
>(
202213
props: PropsWithChildren<
203214
NoInfer<TRenderProps> & {
204215
form: AppFieldExtendedReactFormApi<
205-
TFormData,
206-
TOnMount,
207-
TOnChange,
208-
TOnChangeAsync,
209-
TOnBlur,
210-
TOnBlurAsync,
211-
TOnSubmit,
212-
TOnSubmitAsync,
213-
TOnServer,
214-
TSubmitMeta,
216+
TFFormData,
217+
TFOnMount,
218+
TFOnChange,
219+
TFOnChangeAsync,
220+
TFOnBlur,
221+
TFOnBlurAsync,
222+
TFOnSubmit,
223+
TFOnSubmitAsync,
224+
TFOnServer,
225+
TFSubmitMeta,
215226
TFieldComponents,
216227
TFormComponents
217228
>

packages/react-form/tests/createFormHook.test-d.tsx

+14-3
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,6 @@ describe('createFormHook', () => {
235235
const incorrectFormOpts = formOptions({
236236
defaultValues: {
237237
firstName: 'FirstName',
238-
lastName: 'LastName',
239-
firstNameWrong: 'FirstName',
240-
lastNameWrong: 'LastName',
241238
},
242239
})
243240

@@ -247,5 +244,19 @@ describe('createFormHook', () => {
247244
// @ts-expect-error Incorrect form opts
248245
<WithFormComponent form={incorrectAppForm} prop1="test" prop2={10} />
249246
)
247+
248+
const extendingFormOpts = formOptions({
249+
defaultValues: {
250+
firstName: 'FirstName',
251+
lastName: 'LastName',
252+
country: 'Country',
253+
},
254+
})
255+
256+
const extendingAppForm = useAppForm(extendingFormOpts)
257+
258+
const ExtendingFormOptsComponent = (
259+
<WithFormComponent form={extendingAppForm} prop1="test" prop2={10} />
260+
)
250261
})
251262
})

0 commit comments

Comments
 (0)