Skip to content

Commit 6403f68

Browse files
committed
Fix useCallback bug & date convertion bug
1 parent 2d7f535 commit 6403f68

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

src/Field.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export type FieldProps<T extends object, K extends keyof T, C> = {
1818
};
1919

2020
export function Field<T extends object, K extends keyof T, C extends React.FunctionComponent<any> | keyof JSX.IntrinsicElements = "input">(
21-
props: FieldProps<T, K, C> & Omit<ElementProps<C>, "value" | "onChange" | keyof FieldProps<T, K, C> | keyof SerializeProps> & SerializeProps
21+
props: FieldProps<T, K, C> & Omit<ElementProps<C>, "value" | "onChange" | keyof FieldProps<T, K, C> | keyof SerializeProps> & SerializeProps<T[K]>
2222
) {
2323
const { form, as = "input", serializer, dateAsNumber, setNullOnUncheck, setUndefinedOnUncheck, deserializer, hideWhenNull, ...rest } = props;
2424
const serializeProps = {
@@ -32,16 +32,17 @@ export function Field<T extends object, K extends keyof T, C extends React.Funct
3232
const onChange = useCallback(
3333
(ev: any) => {
3434
let v = "target" in ev ? (["checkbox", "radio"].includes(props.type!) ? ev.target.checked : ev.target.value) : ev;
35-
setValue((deserializer ?? defaultDeserializer)(v, value, serializeProps));
35+
if (typeof v === "string" || typeof v === "boolean") setValue((deserializer ?? defaultDeserializer)(v, value, serializeProps));
36+
else setValue(v);
3637
},
37-
[setValue]
38+
[setValue, props.type]
3839
);
3940
if (hideWhenNull && (value === undefined || value === null)) return null;
4041
let v = (serializer ?? defaultSerializer)(value, serializeProps);
4142
return React.createElement(as, {
4243
...rest,
4344
checked: typeof v === "boolean" ? v : undefined,
44-
value: typeof v === "boolean" ? undefined : value,
45+
value: typeof v === "boolean" ? undefined : v,
4546
disabled: state.isSubmitting,
4647
onChange
4748
});
@@ -73,10 +74,10 @@ export type SerializeProps<V = any> = {
7374
setUndefinedOnUncheck?: boolean;
7475
setNullOnUncheck?: boolean;
7576
type?: SerializeType;
76-
value?: V;
77+
value?: V extends any[] ? V[number] : V;
7778
};
7879

79-
export function defaultSerializer<T>(currentValue: T, props: SerializeProps<T>): boolean | string {
80+
function defaultSerializer<T>(currentValue: T, props: SerializeProps<T>): boolean | string {
8081
switch (props.type) {
8182
case "datetime-local":
8283
case "date": {
@@ -112,7 +113,7 @@ export function defaultSerializer<T>(currentValue: T, props: SerializeProps<T>):
112113
}
113114
}
114115

115-
export function defaultDeserializer<T>(inputValue: string | boolean, currentValue: T, props: SerializeProps<T>) {
116+
function defaultDeserializer<T>(inputValue: string | boolean, currentValue: T, props: SerializeProps<T>) {
116117
switch (props.type) {
117118
case "number": {
118119
return parseFloat(inputValue as any);

src/hooks.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ export function useListener<T extends object, K extends keyof T, State = Default
8282
name: K
8383
) {
8484
const [, setRender] = useState(0);
85-
const setValue = useCallback((value: T[K]) => form.setValue(name, value), [name, form]);
8685

8786
useEffect(() => {
8887
let id = form.listen(name, () => {
@@ -94,7 +93,7 @@ export function useListener<T extends object, K extends keyof T, State = Default
9493
return {
9594
value: form.values[name],
9695
defaultValue: form.defaultValues[name],
97-
setValue: setValue,
96+
setValue: (value: T[K]) => form.setValue(name, value),
9897
dirty: form.dirtyMap[name],
9998
error: form.errorMap[name],
10099
state: form.state,

testing/src/ExampleForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export function ExampleForm() {
7979

8080
{/* A simple text input */}
8181
<label>Deserializer text</label>
82-
<Field form={form} name="customText" serializer={(e) => e?.toLowerCase()} deserializer={(e) => e.toUpperCase()} />
82+
<Field form={form} name="customText" serializer={(e) => e?.toLowerCase()} deserializer={(e) => (e as string).toUpperCase()} />
8383
<pre>{`<Field form={form} name="fieldName" />`}</pre>
8484

8585
{/* A textarea */}

0 commit comments

Comments
 (0)