11import { FormState } from "./form" ;
2- import React , { useCallback } from "react" ;
2+ import React from "react" ;
33import { useListener } from "./hooks" ;
44
55export type ElementProps < C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements > = C extends React . FunctionComponent < infer P >
@@ -46,7 +46,9 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
4646} ;
4747
4848export function Field < T extends object , K extends keyof T , C extends React . FunctionComponent < any > | keyof JSX . IntrinsicElements = "input" > (
49- props : FieldProps < T , K , C > & Omit < ElementProps < C > , "value" | "onChange" | keyof FieldProps < T , K , C > | keyof SerializeProps > & SerializeProps < T [ K ] >
49+ props : FieldProps < T , K , C > &
50+ Omit < ElementProps < C > , "value" | "checked" | "onChange" | "field" | keyof FieldProps < T , K , C > | keyof SerializeProps > &
51+ SerializeProps < T [ K ] >
5052) {
5153 const { form, as = "input" , serializer, dateAsNumber, setNullOnUncheck, setUndefinedOnUncheck, deserializer, hideWhenNull, ...rest } = props ;
5254 const serializeProps = {
@@ -56,23 +58,21 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
5658 type : props . type ,
5759 value : props . value
5860 } ;
59- const { value, setValue, state } = useListener ( form , props . name ) ;
60- const onChange = useCallback (
61- ( ev : any ) => {
62- let v = "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
63- if ( typeof v === "string" || typeof v === "boolean" ) setValue ( ( deserializer ?? defaultDeserializer ) ( v , value , serializeProps ) ) ;
64- else setValue ( v ) ;
65- } ,
66- [ setValue , props . type ]
67- ) ;
68- if ( hideWhenNull && ( value === undefined || value === null ) ) return null ;
69- let v = ( serializer ?? defaultSerializer ) ( value , serializeProps ) ;
61+ const field = useListener ( form , props . name ) ;
62+ if ( hideWhenNull && ( field . value === undefined || field . value === null ) ) return null ;
63+ let v = ( serializer ?? defaultSerializer ) ( field . value , serializeProps ) ;
7064 return React . createElement ( as , {
7165 ...rest ,
7266 checked : typeof v === "boolean" ? v : undefined ,
7367 value : typeof v === "boolean" ? undefined : v ,
74- disabled : state . isSubmitting ,
75- onChange
68+ disabled : field . state . isSubmitting || props . disabled ,
69+ field,
70+ onChange : ( ev : any ) => {
71+ let v = "target" in ev ? ( [ "checkbox" , "radio" ] . includes ( props . type ! ) ? ev . target . checked : ev . target . value ) : ev ;
72+ if ( typeof v === "string" || typeof v === "boolean" )
73+ field . setValue ( ( deserializer ?? defaultDeserializer ) ( v , field . value , serializeProps ) ) ;
74+ else field . setValue ( v ) ;
75+ }
7676 } ) ;
7777}
7878
0 commit comments