@octanejs/tanstack-form 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/package.json +54 -0
- package/src/createFormHook.tsrx +864 -0
- package/src/createFormHook.tsrx.d.ts +101 -0
- package/src/index.ts +11 -0
- package/src/types.ts +122 -0
- package/src/useField.tsrx +656 -0
- package/src/useField.tsrx.d.ts +55 -0
- package/src/useFieldGroup.tsrx +252 -0
- package/src/useFieldGroup.tsrx.d.ts +37 -0
- package/src/useForm.tsrx +296 -0
- package/src/useForm.tsrx.d.ts +35 -0
- package/src/useFormGroup.tsrx +633 -0
- package/src/useFormGroup.tsrx.d.ts +16 -0
- package/src/useFormId.ts +4 -0
- package/src/useIsomorphicLayoutEffect.ts +4 -0
|
@@ -0,0 +1,656 @@
|
|
|
1
|
+
import { useMemo, useState } from 'octane';
|
|
2
|
+
import { useSelector } from '@octanejs/tanstack-store';
|
|
3
|
+
import { FieldApi, functionalUpdate } from '@tanstack/form-core';
|
|
4
|
+
import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';
|
|
5
|
+
import type {
|
|
6
|
+
AnyFieldApi,
|
|
7
|
+
AnyFieldMeta,
|
|
8
|
+
DeepKeys,
|
|
9
|
+
DeepValue,
|
|
10
|
+
FieldAsyncValidateOrFn,
|
|
11
|
+
FieldValidateOrFn,
|
|
12
|
+
FieldValidators,
|
|
13
|
+
FormAsyncValidateOrFn,
|
|
14
|
+
FormValidateOrFn,
|
|
15
|
+
} from '@tanstack/form-core';
|
|
16
|
+
import type { UseFieldOptions, UseFieldOptionsBound } from './types';
|
|
17
|
+
|
|
18
|
+
type FieldRenderable = unknown;
|
|
19
|
+
type FieldFunctionComponent<P = object> = (props: P) => FieldRenderable;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A type representing a hook for using a field in a form with the given form data type.
|
|
23
|
+
*
|
|
24
|
+
* A function that takes an optional object with a `name` property and field options, and returns a `FieldApi` instance for the specified field.
|
|
25
|
+
*/
|
|
26
|
+
export type UseField<
|
|
27
|
+
TParentData,
|
|
28
|
+
TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
29
|
+
TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
30
|
+
TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
31
|
+
TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
32
|
+
TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
33
|
+
TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
34
|
+
TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
35
|
+
TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
36
|
+
TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
37
|
+
TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
38
|
+
TPatentSubmitMeta,
|
|
39
|
+
> = <
|
|
40
|
+
TName extends DeepKeys<TParentData>,
|
|
41
|
+
TData extends DeepValue<TParentData, TName>,
|
|
42
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
43
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
44
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
45
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
46
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
47
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
48
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
49
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
50
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
51
|
+
>(
|
|
52
|
+
opts: UseFieldOptionsBound<
|
|
53
|
+
TParentData,
|
|
54
|
+
TName,
|
|
55
|
+
TData,
|
|
56
|
+
TOnMount,
|
|
57
|
+
TOnChange,
|
|
58
|
+
TOnChangeAsync,
|
|
59
|
+
TOnBlur,
|
|
60
|
+
TOnBlurAsync,
|
|
61
|
+
TOnSubmit,
|
|
62
|
+
TOnSubmitAsync,
|
|
63
|
+
TOnDynamic,
|
|
64
|
+
TOnDynamicAsync
|
|
65
|
+
>,
|
|
66
|
+
) => FieldApi<
|
|
67
|
+
TParentData,
|
|
68
|
+
TName,
|
|
69
|
+
TData,
|
|
70
|
+
TOnMount,
|
|
71
|
+
TOnChange,
|
|
72
|
+
TOnChangeAsync,
|
|
73
|
+
TOnBlur,
|
|
74
|
+
TOnBlurAsync,
|
|
75
|
+
TOnSubmit,
|
|
76
|
+
TOnSubmitAsync,
|
|
77
|
+
TOnDynamic,
|
|
78
|
+
TOnDynamicAsync,
|
|
79
|
+
TFormOnMount,
|
|
80
|
+
TFormOnChange,
|
|
81
|
+
TFormOnChangeAsync,
|
|
82
|
+
TFormOnBlur,
|
|
83
|
+
TFormOnBlurAsync,
|
|
84
|
+
TFormOnSubmit,
|
|
85
|
+
TFormOnSubmitAsync,
|
|
86
|
+
TFormOnDynamic,
|
|
87
|
+
TFormOnDynamicAsync,
|
|
88
|
+
TFormOnServer,
|
|
89
|
+
TPatentSubmitMeta
|
|
90
|
+
>;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* A hook for managing a field in a form.
|
|
94
|
+
* @param opts An object with field options.
|
|
95
|
+
*
|
|
96
|
+
* @returns The `FieldApi` instance for the specified field.
|
|
97
|
+
*/
|
|
98
|
+
export function useField<
|
|
99
|
+
TParentData,
|
|
100
|
+
TName extends DeepKeys<TParentData>,
|
|
101
|
+
TData extends DeepValue<TParentData, TName>,
|
|
102
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
103
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
104
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
105
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
106
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
107
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
108
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
109
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
110
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
111
|
+
TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
112
|
+
TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
113
|
+
TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
114
|
+
TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
115
|
+
TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
116
|
+
TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
117
|
+
TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
118
|
+
TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
119
|
+
TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
120
|
+
TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
121
|
+
TPatentSubmitMeta,
|
|
122
|
+
>(
|
|
123
|
+
opts: UseFieldOptions<
|
|
124
|
+
TParentData,
|
|
125
|
+
TName,
|
|
126
|
+
TData,
|
|
127
|
+
TOnMount,
|
|
128
|
+
TOnChange,
|
|
129
|
+
TOnChangeAsync,
|
|
130
|
+
TOnBlur,
|
|
131
|
+
TOnBlurAsync,
|
|
132
|
+
TOnSubmit,
|
|
133
|
+
TOnSubmitAsync,
|
|
134
|
+
TOnDynamic,
|
|
135
|
+
TOnDynamicAsync,
|
|
136
|
+
TFormOnMount,
|
|
137
|
+
TFormOnChange,
|
|
138
|
+
TFormOnChangeAsync,
|
|
139
|
+
TFormOnBlur,
|
|
140
|
+
TFormOnBlurAsync,
|
|
141
|
+
TFormOnSubmit,
|
|
142
|
+
TFormOnSubmitAsync,
|
|
143
|
+
TFormOnDynamic,
|
|
144
|
+
TFormOnDynamicAsync,
|
|
145
|
+
TFormOnServer,
|
|
146
|
+
TPatentSubmitMeta
|
|
147
|
+
>,
|
|
148
|
+
) {
|
|
149
|
+
// Keep a snapshot of options so compiler optimizations do not treat
|
|
150
|
+
// fieldApi as immutable.
|
|
151
|
+
const [prevOptions, setPrevOptions] = useState(() => ({
|
|
152
|
+
form: opts.form,
|
|
153
|
+
name: opts.name,
|
|
154
|
+
}));
|
|
155
|
+
|
|
156
|
+
const [fieldApiState, setFieldApi] = useState(() => {
|
|
157
|
+
return new FieldApi({
|
|
158
|
+
...opts,
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
let fieldApi = fieldApiState;
|
|
163
|
+
|
|
164
|
+
// We only want to
|
|
165
|
+
// update on name changes since those are at risk of becoming stale. The field
|
|
166
|
+
// state must be up to date for the internal JSX render.
|
|
167
|
+
// The other options can freely be in `fieldApi.update`
|
|
168
|
+
if (prevOptions.form !== opts.form || prevOptions.name !== opts.name) {
|
|
169
|
+
// Adjusting state during render: create the new FieldApi and use it for the
|
|
170
|
+
// rest of this render so the render prop reads state at the current `name`.
|
|
171
|
+
// Otherwise the discarded render still runs to completion with the stale
|
|
172
|
+
// instance, briefly surfacing `undefined` for shifted array items on removal.
|
|
173
|
+
// See: https://github.com/TanStack/form/issues/2238
|
|
174
|
+
fieldApi = new FieldApi({
|
|
175
|
+
...opts,
|
|
176
|
+
});
|
|
177
|
+
setFieldApi(fieldApi);
|
|
178
|
+
setPrevOptions({ form: opts.form, name: opts.name });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// For array mode, only track length changes to avoid re-renders when child properties change
|
|
182
|
+
// See: https://github.com/TanStack/form/issues/1925
|
|
183
|
+
const reactiveStateValue = useSelector(
|
|
184
|
+
fieldApi.store,
|
|
185
|
+
(opts.mode === 'array' ? (state) => state.meta._arrayVersion || 0 : (state) => state.value) as (
|
|
186
|
+
state: typeof fieldApi.state,
|
|
187
|
+
) => TData | number,
|
|
188
|
+
);
|
|
189
|
+
const reactiveMetaIsTouched = useSelector(fieldApi.store, (state) => state.meta.isTouched);
|
|
190
|
+
const reactiveMetaIsBlurred = useSelector(fieldApi.store, (state) => state.meta.isBlurred);
|
|
191
|
+
const reactiveMetaIsDirty = useSelector(fieldApi.store, (state) => state.meta.isDirty);
|
|
192
|
+
const reactiveMetaErrorMap = useSelector(fieldApi.store, (state) => state.meta.errorMap);
|
|
193
|
+
const reactiveMetaErrorSourceMap = useSelector(
|
|
194
|
+
fieldApi.store,
|
|
195
|
+
(state) => state.meta.errorSourceMap,
|
|
196
|
+
);
|
|
197
|
+
const reactiveMetaIsValidating = useSelector(fieldApi.store, (state) => state.meta.isValidating);
|
|
198
|
+
|
|
199
|
+
// Materialize the reactive snapshots in the extended API returned to render callbacks.
|
|
200
|
+
const extendedFieldApi = useMemo(() => {
|
|
201
|
+
const reactiveFieldApi = {
|
|
202
|
+
...fieldApi,
|
|
203
|
+
get state() {
|
|
204
|
+
return {
|
|
205
|
+
// For array mode, reactiveStateValue is the length (for reactivity tracking),
|
|
206
|
+
// so we need to get the actual value from fieldApi
|
|
207
|
+
value: opts.mode === 'array' ? fieldApi.state.value : reactiveStateValue,
|
|
208
|
+
get meta() {
|
|
209
|
+
return {
|
|
210
|
+
...fieldApi.state.meta,
|
|
211
|
+
isTouched: reactiveMetaIsTouched,
|
|
212
|
+
isBlurred: reactiveMetaIsBlurred,
|
|
213
|
+
isDirty: reactiveMetaIsDirty,
|
|
214
|
+
errorMap: reactiveMetaErrorMap,
|
|
215
|
+
errorSourceMap: reactiveMetaErrorSourceMap,
|
|
216
|
+
isValidating: reactiveMetaIsValidating,
|
|
217
|
+
} satisfies AnyFieldMeta;
|
|
218
|
+
},
|
|
219
|
+
} satisfies AnyFieldApi['state'];
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
const extendedApi: FieldApi<
|
|
224
|
+
TParentData,
|
|
225
|
+
TName,
|
|
226
|
+
TData,
|
|
227
|
+
TOnMount,
|
|
228
|
+
TOnChange,
|
|
229
|
+
TOnChangeAsync,
|
|
230
|
+
TOnBlur,
|
|
231
|
+
TOnBlurAsync,
|
|
232
|
+
TOnSubmit,
|
|
233
|
+
TOnSubmitAsync,
|
|
234
|
+
TOnDynamic,
|
|
235
|
+
TOnDynamicAsync,
|
|
236
|
+
TFormOnMount,
|
|
237
|
+
TFormOnChange,
|
|
238
|
+
TFormOnChangeAsync,
|
|
239
|
+
TFormOnBlur,
|
|
240
|
+
TFormOnBlurAsync,
|
|
241
|
+
TFormOnSubmit,
|
|
242
|
+
TFormOnSubmitAsync,
|
|
243
|
+
TFormOnDynamic,
|
|
244
|
+
TFormOnDynamicAsync,
|
|
245
|
+
TFormOnServer,
|
|
246
|
+
TPatentSubmitMeta
|
|
247
|
+
> = reactiveFieldApi as never;
|
|
248
|
+
|
|
249
|
+
return extendedApi;
|
|
250
|
+
}, [
|
|
251
|
+
fieldApi,
|
|
252
|
+
opts.mode,
|
|
253
|
+
reactiveStateValue,
|
|
254
|
+
reactiveMetaIsTouched,
|
|
255
|
+
reactiveMetaIsBlurred,
|
|
256
|
+
reactiveMetaIsDirty,
|
|
257
|
+
reactiveMetaErrorMap,
|
|
258
|
+
reactiveMetaErrorSourceMap,
|
|
259
|
+
reactiveMetaIsValidating,
|
|
260
|
+
]);
|
|
261
|
+
|
|
262
|
+
useIsomorphicLayoutEffect(fieldApi.mount, [fieldApi]);
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* fieldApi.update should not have any side effects. Think of it like a `useRef`
|
|
266
|
+
* that we need to keep updated every render with the most up-to-date information.
|
|
267
|
+
*/
|
|
268
|
+
useIsomorphicLayoutEffect(() => {
|
|
269
|
+
fieldApi.update(opts);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
return extendedFieldApi;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* @param children A render function that takes a field API instance and returns a renderable value.
|
|
277
|
+
*/
|
|
278
|
+
interface FieldComponentProps<
|
|
279
|
+
TParentData,
|
|
280
|
+
TName extends DeepKeys<TParentData>,
|
|
281
|
+
TData extends DeepValue<TParentData, TName>,
|
|
282
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
283
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
284
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
285
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
286
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
287
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
288
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
289
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
290
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
291
|
+
TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
292
|
+
TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
293
|
+
TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
294
|
+
TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
295
|
+
TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
296
|
+
TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
297
|
+
TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
298
|
+
TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
299
|
+
TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
300
|
+
TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
301
|
+
TPatentSubmitMeta,
|
|
302
|
+
ExtendedApi = {},
|
|
303
|
+
> extends UseFieldOptions<
|
|
304
|
+
TParentData,
|
|
305
|
+
TName,
|
|
306
|
+
TData,
|
|
307
|
+
TOnMount,
|
|
308
|
+
TOnChange,
|
|
309
|
+
TOnChangeAsync,
|
|
310
|
+
TOnBlur,
|
|
311
|
+
TOnBlurAsync,
|
|
312
|
+
TOnSubmit,
|
|
313
|
+
TOnSubmitAsync,
|
|
314
|
+
TOnDynamic,
|
|
315
|
+
TOnDynamicAsync,
|
|
316
|
+
TFormOnMount,
|
|
317
|
+
TFormOnChange,
|
|
318
|
+
TFormOnChangeAsync,
|
|
319
|
+
TFormOnBlur,
|
|
320
|
+
TFormOnBlurAsync,
|
|
321
|
+
TFormOnSubmit,
|
|
322
|
+
TFormOnSubmitAsync,
|
|
323
|
+
TFormOnDynamic,
|
|
324
|
+
TFormOnDynamicAsync,
|
|
325
|
+
TFormOnServer,
|
|
326
|
+
TPatentSubmitMeta
|
|
327
|
+
> {
|
|
328
|
+
children: (
|
|
329
|
+
fieldApi: FieldApi<
|
|
330
|
+
TParentData,
|
|
331
|
+
TName,
|
|
332
|
+
TData,
|
|
333
|
+
TOnMount,
|
|
334
|
+
TOnChange,
|
|
335
|
+
TOnChangeAsync,
|
|
336
|
+
TOnBlur,
|
|
337
|
+
TOnBlurAsync,
|
|
338
|
+
TOnSubmit,
|
|
339
|
+
TOnSubmitAsync,
|
|
340
|
+
TOnDynamic,
|
|
341
|
+
TOnDynamicAsync,
|
|
342
|
+
TFormOnMount,
|
|
343
|
+
TFormOnChange,
|
|
344
|
+
TFormOnChangeAsync,
|
|
345
|
+
TFormOnBlur,
|
|
346
|
+
TFormOnBlurAsync,
|
|
347
|
+
TFormOnSubmit,
|
|
348
|
+
TFormOnSubmitAsync,
|
|
349
|
+
TFormOnDynamic,
|
|
350
|
+
TFormOnDynamicAsync,
|
|
351
|
+
TFormOnServer,
|
|
352
|
+
TPatentSubmitMeta
|
|
353
|
+
> &
|
|
354
|
+
ExtendedApi,
|
|
355
|
+
) => FieldRenderable;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
interface FieldComponentBoundProps<
|
|
359
|
+
TParentData,
|
|
360
|
+
TName extends DeepKeys<TParentData>,
|
|
361
|
+
TData extends DeepValue<TParentData, TName>,
|
|
362
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
363
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
364
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
365
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
366
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
367
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
368
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
369
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
370
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
371
|
+
TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
372
|
+
TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
373
|
+
TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
374
|
+
TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
375
|
+
TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
376
|
+
TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
377
|
+
TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
378
|
+
TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
379
|
+
TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
380
|
+
TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
381
|
+
TPatentSubmitMeta,
|
|
382
|
+
ExtendedApi = {},
|
|
383
|
+
> extends UseFieldOptionsBound<
|
|
384
|
+
TParentData,
|
|
385
|
+
TName,
|
|
386
|
+
TData,
|
|
387
|
+
TOnMount,
|
|
388
|
+
TOnChange,
|
|
389
|
+
TOnChangeAsync,
|
|
390
|
+
TOnBlur,
|
|
391
|
+
TOnBlurAsync,
|
|
392
|
+
TOnSubmit,
|
|
393
|
+
TOnSubmitAsync,
|
|
394
|
+
TOnDynamic,
|
|
395
|
+
TOnDynamicAsync
|
|
396
|
+
> {
|
|
397
|
+
children: (
|
|
398
|
+
fieldApi: FieldApi<
|
|
399
|
+
TParentData,
|
|
400
|
+
TName,
|
|
401
|
+
TData,
|
|
402
|
+
TOnMount,
|
|
403
|
+
TOnChange,
|
|
404
|
+
TOnChangeAsync,
|
|
405
|
+
TOnBlur,
|
|
406
|
+
TOnBlurAsync,
|
|
407
|
+
TOnSubmit,
|
|
408
|
+
TOnSubmitAsync,
|
|
409
|
+
TOnDynamic,
|
|
410
|
+
TOnDynamicAsync,
|
|
411
|
+
TFormOnMount,
|
|
412
|
+
TFormOnChange,
|
|
413
|
+
TFormOnChangeAsync,
|
|
414
|
+
TFormOnBlur,
|
|
415
|
+
TFormOnBlurAsync,
|
|
416
|
+
TFormOnSubmit,
|
|
417
|
+
TFormOnSubmitAsync,
|
|
418
|
+
TFormOnDynamic,
|
|
419
|
+
TFormOnDynamicAsync,
|
|
420
|
+
TFormOnServer,
|
|
421
|
+
TPatentSubmitMeta
|
|
422
|
+
> &
|
|
423
|
+
ExtendedApi,
|
|
424
|
+
) => FieldRenderable;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* A type alias representing a field component for a specific form data type.
|
|
429
|
+
*/
|
|
430
|
+
export type FieldComponent<
|
|
431
|
+
in out TParentData,
|
|
432
|
+
in out TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
433
|
+
in out TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
434
|
+
in out TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
435
|
+
in out TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
436
|
+
in out TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
437
|
+
in out TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
438
|
+
in out TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
439
|
+
in out TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
440
|
+
in out TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
441
|
+
in out TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
442
|
+
in out TPatentSubmitMeta,
|
|
443
|
+
in out ExtendedApi = {},
|
|
444
|
+
> = <
|
|
445
|
+
TName extends DeepKeys<TParentData>,
|
|
446
|
+
TData extends DeepValue<TParentData, TName>,
|
|
447
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
448
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
449
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
450
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
451
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
452
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
453
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
454
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
455
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
456
|
+
>({
|
|
457
|
+
children,
|
|
458
|
+
...fieldOptions
|
|
459
|
+
}: FieldComponentBoundProps<
|
|
460
|
+
TParentData,
|
|
461
|
+
TName,
|
|
462
|
+
TData,
|
|
463
|
+
TOnMount,
|
|
464
|
+
TOnChange,
|
|
465
|
+
TOnChangeAsync,
|
|
466
|
+
TOnBlur,
|
|
467
|
+
TOnBlurAsync,
|
|
468
|
+
TOnSubmit,
|
|
469
|
+
TOnSubmitAsync,
|
|
470
|
+
TOnDynamic,
|
|
471
|
+
TOnDynamicAsync,
|
|
472
|
+
TFormOnMount,
|
|
473
|
+
TFormOnChange,
|
|
474
|
+
TFormOnChangeAsync,
|
|
475
|
+
TFormOnBlur,
|
|
476
|
+
TFormOnBlurAsync,
|
|
477
|
+
TFormOnSubmit,
|
|
478
|
+
TFormOnSubmitAsync,
|
|
479
|
+
TFormOnDynamic,
|
|
480
|
+
TFormOnDynamicAsync,
|
|
481
|
+
TFormOnServer,
|
|
482
|
+
TPatentSubmitMeta,
|
|
483
|
+
ExtendedApi
|
|
484
|
+
>) => ReturnType<FieldFunctionComponent>;
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* A type alias representing a field component for a form lens data type.
|
|
488
|
+
*/
|
|
489
|
+
export type LensFieldComponent<
|
|
490
|
+
in out TLensData,
|
|
491
|
+
in out TParentSubmitMeta,
|
|
492
|
+
in out ExtendedApi = {},
|
|
493
|
+
> = <
|
|
494
|
+
TName extends DeepKeys<TLensData>,
|
|
495
|
+
TData extends DeepValue<TLensData, TName>,
|
|
496
|
+
TOnMount extends undefined | FieldValidateOrFn<unknown, string, TData>,
|
|
497
|
+
TOnChange extends undefined | FieldValidateOrFn<unknown, string, TData>,
|
|
498
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
|
|
499
|
+
TOnBlur extends undefined | FieldValidateOrFn<unknown, string, TData>,
|
|
500
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
|
|
501
|
+
TOnSubmit extends undefined | FieldValidateOrFn<unknown, string, TData>,
|
|
502
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
|
|
503
|
+
TOnDynamic extends undefined | FieldValidateOrFn<unknown, string, TData>,
|
|
504
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<unknown, string, TData>,
|
|
505
|
+
>({
|
|
506
|
+
children,
|
|
507
|
+
...fieldOptions
|
|
508
|
+
}: Omit<
|
|
509
|
+
FieldComponentBoundProps<
|
|
510
|
+
unknown,
|
|
511
|
+
string,
|
|
512
|
+
TData,
|
|
513
|
+
TOnMount,
|
|
514
|
+
TOnChange,
|
|
515
|
+
TOnChangeAsync,
|
|
516
|
+
TOnBlur,
|
|
517
|
+
TOnBlurAsync,
|
|
518
|
+
TOnSubmit,
|
|
519
|
+
TOnSubmitAsync,
|
|
520
|
+
TOnDynamic,
|
|
521
|
+
TOnDynamicAsync,
|
|
522
|
+
undefined | FormValidateOrFn<unknown>,
|
|
523
|
+
undefined | FormValidateOrFn<unknown>,
|
|
524
|
+
undefined | FormAsyncValidateOrFn<unknown>,
|
|
525
|
+
undefined | FormValidateOrFn<unknown>,
|
|
526
|
+
undefined | FormAsyncValidateOrFn<unknown>,
|
|
527
|
+
undefined | FormValidateOrFn<unknown>,
|
|
528
|
+
undefined | FormAsyncValidateOrFn<unknown>,
|
|
529
|
+
undefined | FormValidateOrFn<unknown>,
|
|
530
|
+
undefined | FormAsyncValidateOrFn<unknown>,
|
|
531
|
+
undefined | FormAsyncValidateOrFn<unknown>,
|
|
532
|
+
TParentSubmitMeta,
|
|
533
|
+
ExtendedApi
|
|
534
|
+
>,
|
|
535
|
+
'name' | 'validators'
|
|
536
|
+
> & {
|
|
537
|
+
name: TName;
|
|
538
|
+
validators?: Omit<
|
|
539
|
+
FieldValidators<
|
|
540
|
+
unknown,
|
|
541
|
+
string,
|
|
542
|
+
TData,
|
|
543
|
+
TOnMount,
|
|
544
|
+
TOnChange,
|
|
545
|
+
TOnChangeAsync,
|
|
546
|
+
TOnBlur,
|
|
547
|
+
TOnBlurAsync,
|
|
548
|
+
TOnSubmit,
|
|
549
|
+
TOnSubmitAsync,
|
|
550
|
+
TOnDynamic,
|
|
551
|
+
TOnDynamicAsync
|
|
552
|
+
>,
|
|
553
|
+
'onChangeListenTo' | 'onBlurListenTo'
|
|
554
|
+
> & {
|
|
555
|
+
/**
|
|
556
|
+
* An optional list of field names that should trigger this field's `onChange` and `onChangeAsync` events when its value changes
|
|
557
|
+
*/
|
|
558
|
+
onChangeListenTo?: DeepKeys<TLensData>[];
|
|
559
|
+
/**
|
|
560
|
+
* An optional list of field names that should trigger this field's `onBlur` and `onBlurAsync` events when its value changes
|
|
561
|
+
*/
|
|
562
|
+
onBlurListenTo?: DeepKeys<TLensData>[];
|
|
563
|
+
};
|
|
564
|
+
}) => ReturnType<FieldFunctionComponent>;
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* A function component that takes field options and a render function as children.
|
|
568
|
+
*
|
|
569
|
+
* The `Field` component uses the `useField` hook internally to manage the field instance.
|
|
570
|
+
*/
|
|
571
|
+
export const Field = (<
|
|
572
|
+
TParentData,
|
|
573
|
+
TName extends DeepKeys<TParentData>,
|
|
574
|
+
TData extends DeepValue<TParentData, TName>,
|
|
575
|
+
TOnMount extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
576
|
+
TOnChange extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
577
|
+
TOnChangeAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
578
|
+
TOnBlur extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
579
|
+
TOnBlurAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
580
|
+
TOnSubmit extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
581
|
+
TOnSubmitAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
582
|
+
TOnDynamic extends undefined | FieldValidateOrFn<TParentData, TName, TData>,
|
|
583
|
+
TOnDynamicAsync extends undefined | FieldAsyncValidateOrFn<TParentData, TName, TData>,
|
|
584
|
+
TFormOnMount extends undefined | FormValidateOrFn<TParentData>,
|
|
585
|
+
TFormOnChange extends undefined | FormValidateOrFn<TParentData>,
|
|
586
|
+
TFormOnChangeAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
587
|
+
TFormOnBlur extends undefined | FormValidateOrFn<TParentData>,
|
|
588
|
+
TFormOnBlurAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
589
|
+
TFormOnSubmit extends undefined | FormValidateOrFn<TParentData>,
|
|
590
|
+
TFormOnSubmitAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
591
|
+
TFormOnDynamic extends undefined | FormValidateOrFn<TParentData>,
|
|
592
|
+
TFormOnDynamicAsync extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
593
|
+
TFormOnServer extends undefined | FormAsyncValidateOrFn<TParentData>,
|
|
594
|
+
TPatentSubmitMeta,
|
|
595
|
+
>({
|
|
596
|
+
children,
|
|
597
|
+
...fieldOptions
|
|
598
|
+
}: FieldComponentProps<
|
|
599
|
+
TParentData,
|
|
600
|
+
TName,
|
|
601
|
+
TData,
|
|
602
|
+
TOnMount,
|
|
603
|
+
TOnChange,
|
|
604
|
+
TOnChangeAsync,
|
|
605
|
+
TOnBlur,
|
|
606
|
+
TOnBlurAsync,
|
|
607
|
+
TOnSubmit,
|
|
608
|
+
TOnSubmitAsync,
|
|
609
|
+
TOnDynamic,
|
|
610
|
+
TOnDynamicAsync,
|
|
611
|
+
TFormOnMount,
|
|
612
|
+
TFormOnChange,
|
|
613
|
+
TFormOnChangeAsync,
|
|
614
|
+
TFormOnBlur,
|
|
615
|
+
TFormOnBlurAsync,
|
|
616
|
+
TFormOnSubmit,
|
|
617
|
+
TFormOnSubmitAsync,
|
|
618
|
+
TFormOnDynamic,
|
|
619
|
+
TFormOnDynamicAsync,
|
|
620
|
+
TFormOnServer,
|
|
621
|
+
TPatentSubmitMeta
|
|
622
|
+
>): ReturnType<FieldFunctionComponent> => {
|
|
623
|
+
const fieldApi = useField(fieldOptions as any);
|
|
624
|
+
|
|
625
|
+
const jsxToDisplay = useMemo(
|
|
626
|
+
() => functionalUpdate(children, fieldApi as any),
|
|
627
|
+
[children, fieldApi],
|
|
628
|
+
);
|
|
629
|
+
return (<>{jsxToDisplay}</>) as never;
|
|
630
|
+
}) satisfies FieldFunctionComponent<
|
|
631
|
+
FieldComponentProps<
|
|
632
|
+
any,
|
|
633
|
+
any,
|
|
634
|
+
any,
|
|
635
|
+
any,
|
|
636
|
+
any,
|
|
637
|
+
any,
|
|
638
|
+
any,
|
|
639
|
+
any,
|
|
640
|
+
any,
|
|
641
|
+
any,
|
|
642
|
+
any,
|
|
643
|
+
any,
|
|
644
|
+
any,
|
|
645
|
+
any,
|
|
646
|
+
any,
|
|
647
|
+
any,
|
|
648
|
+
any,
|
|
649
|
+
any,
|
|
650
|
+
any,
|
|
651
|
+
any,
|
|
652
|
+
any,
|
|
653
|
+
any,
|
|
654
|
+
any
|
|
655
|
+
>
|
|
656
|
+
>;
|