1
1
import React from "react" ;
2
- import { ChildFormState , DefaultError , DefaultState , DirtyMap , ErrorMap , FieldsOfType , FormState , KeysOfType } from "./form" ;
3
- import { useArrayField , useListener , useAnyListener , useObjectField , useTruthyListener } from "./hooks" ;
2
+ import { ChildFormState , DefaultError , DefaultState , FieldsOfType , FormState , KeysOfType } from "./form" ;
3
+ import { useArrayField , useListener , useAnyListener , useObjectField , useTruthyListener , FormField } from "./hooks" ;
4
4
5
5
/**
6
6
* Wrapper around useArrayField (which is a wrapper around useObjectField).
@@ -17,7 +17,7 @@ export function ArrayField<
17
17
> ( props : {
18
18
form : FormState < T , State , Error > ;
19
19
name : K ;
20
- render ? : ( props : {
20
+ render : ( props : {
21
21
form : ChildFormState < T , K , State , Error > ;
22
22
remove : ( index : number ) => void ;
23
23
clear : ( ) => void ;
@@ -35,7 +35,7 @@ export function ArrayField<
35
35
36
36
// Do not render anything if the parent field is falsly
37
37
if ( ! props . form . values [ props . name ] ) return null ;
38
- return < React . Fragment > { props . render ?. ( childForm ) ?? childForm . values + "" } </ React . Fragment > ;
38
+ return < React . Fragment > { props . render ( childForm ) } </ React . Fragment > ;
39
39
}
40
40
41
41
/**
@@ -45,21 +45,14 @@ export function ArrayField<
45
45
* @param form The form to listen on.
46
46
* @param name The form's field to listen to.
47
47
*/
48
- export function Listener < T extends object , K extends keyof T , State extends DefaultState = DefaultState , Error extends string = DefaultError > ( props : {
49
- form : FormState < T , State , Error > ;
50
- name : K ;
51
- render ?: ( props : {
52
- value : T [ K ] ;
53
- defaultValue : T [ K ] ;
54
- setValue : ( value : T [ K ] ) => void ;
55
- dirty : DirtyMap < T > [ K ] ;
56
- error : ErrorMap < T , Error > [ K ] ;
57
- state : State ;
58
- form : FormState < T , State , Error > ;
59
- } ) => React . ReactNode ;
60
- } ) {
48
+ export function Listener <
49
+ T extends object ,
50
+ K extends keyof T ,
51
+ State extends DefaultState = DefaultState ,
52
+ Error extends DefaultError = DefaultError
53
+ > ( props : { form : FormState < T , State , Error > ; name : K ; render ?: ( props : FormField < T , K , State , Error > ) => React . ReactNode } ) {
61
54
const l = useListener ( props . form , props . name ) ;
62
- return < React . Fragment > { props . render ?.( l ) ?? l . value + "" } </ React . Fragment > ;
55
+ return < React . Fragment > { props . render ?.( l ) ?? String ( l . value ) } </ React . Fragment > ;
63
56
}
64
57
65
58
/**
@@ -68,12 +61,12 @@ export function Listener<T extends object, K extends keyof T, State extends Defa
68
61
* You shouldn't use this hook in large components, as it rerenders each time something changes. Use the wrapper <AnyListener /> instead.
69
62
* @param form The form that was passed in.
70
63
*/
71
- export function AnyListener < T extends object , State = DefaultState , Error extends string = DefaultError > ( props : {
64
+ export function AnyListener < T extends object , State = DefaultState , Error extends DefaultError = DefaultError > ( props : {
72
65
form : FormState < T , State , Error > ;
73
66
render ?: ( props : FormState < T , State , Error > ) => React . ReactNode ;
74
67
} ) {
75
68
const l = useAnyListener ( props . form ) ;
76
- return < React . Fragment > { props . render ?.( l ) ?? l . values + "" } </ React . Fragment > ;
69
+ return < React . Fragment > { props . render ?.( l ) ?? JSON . stringify ( l . values , null , 2 ) } </ React . Fragment > ;
77
70
}
78
71
79
72
/**
@@ -87,17 +80,17 @@ export function ObjectField<
87
80
T extends FieldsOfType < any , object > ,
88
81
K extends KeysOfType < T , object > ,
89
82
ParentState = DefaultState ,
90
- ParentError extends string = DefaultError
83
+ ParentError extends DefaultError = DefaultError
91
84
> ( props : {
92
85
form : FormState < T , ParentState , ParentError > ; // Use the parent prop instead of the form prop when using ObjectField.
93
86
name : K ;
94
- render ? : ( props : ChildFormState < T , K , ParentState , ParentError > ) => React . ReactNode ;
87
+ render : ( props : ChildFormState < T , K , ParentState , ParentError > ) => React . ReactNode ;
95
88
} ) {
96
89
const childForm = useObjectField ( props . form , props . name ) ;
97
90
// Causes a rerender when the object value becomes null/undefined
98
91
useTruthyListener ( props . form , props . name ) ;
99
92
100
93
// Do not render anything if the parent field is falsly
101
94
if ( ! props . form . values [ props . name ] ) return null ;
102
- return < React . Fragment > { props . render ?. ( childForm ) } </ React . Fragment > ;
95
+ return < React . Fragment > { props . render ( childForm ) } </ React . Fragment > ;
103
96
}
0 commit comments