Skip to content

Commit 44e5c00

Browse files
committed
Require render function for ObjectField/ArrayField
1 parent 135d3d3 commit 44e5c00

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

src/Components.tsx

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
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";
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

Comments
 (0)