11import 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" ;
44
55/**
66 * Wrapper around useArrayField (which is a wrapper around useObjectField).
@@ -17,7 +17,7 @@ export function ArrayField<
1717> ( props : {
1818 form : FormState < T , State , Error > ;
1919 name : K ;
20- render ? : ( props : {
20+ render : ( props : {
2121 form : ChildFormState < T , K , State , Error > ;
2222 remove : ( index : number ) => void ;
2323 clear : ( ) => void ;
@@ -35,7 +35,7 @@ export function ArrayField<
3535
3636 // Do not render anything if the parent field is falsly
3737 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 > ;
3939}
4040
4141/**
@@ -45,21 +45,14 @@ export function ArrayField<
4545 * @param form The form to listen on.
4646 * @param name The form's field to listen to.
4747 */
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 } ) {
6154 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 > ;
6356}
6457
6558/**
@@ -68,12 +61,12 @@ export function Listener<T extends object, K extends keyof T, State extends Defa
6861 * You shouldn't use this hook in large components, as it rerenders each time something changes. Use the wrapper <AnyListener /> instead.
6962 * @param form The form that was passed in.
7063 */
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 : {
7265 form : FormState < T , State , Error > ;
7366 render ?: ( props : FormState < T , State , Error > ) => React . ReactNode ;
7467} ) {
7568 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 > ;
7770}
7871
7972/**
@@ -87,17 +80,17 @@ export function ObjectField<
8780 T extends FieldsOfType < any , object > ,
8881 K extends KeysOfType < T , object > ,
8982 ParentState = DefaultState ,
90- ParentError extends string = DefaultError
83+ ParentError extends DefaultError = DefaultError
9184> ( props : {
9285 form : FormState < T , ParentState , ParentError > ; // Use the parent prop instead of the form prop when using ObjectField.
9386 name : K ;
94- render ? : ( props : ChildFormState < T , K , ParentState , ParentError > ) => React . ReactNode ;
87+ render : ( props : ChildFormState < T , K , ParentState , ParentError > ) => React . ReactNode ;
9588} ) {
9689 const childForm = useObjectField ( props . form , props . name ) ;
9790 // Causes a rerender when the object value becomes null/undefined
9891 useTruthyListener ( props . form , props . name ) ;
9992
10093 // Do not render anything if the parent field is falsly
10194 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 > ;
10396}
0 commit comments