Skip to content

Commit bddd1f1

Browse files
committed
Remove FormError & Create FieldError
1 parent a878ca3 commit bddd1f1

File tree

6 files changed

+32
-639
lines changed

6 files changed

+32
-639
lines changed

src/elements/Field.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@ import { FormState } from "../form";
22
import React, { useCallback } from "react";
33
import { useListener } from "../hooks";
44

5-
export function Field<T extends object, K extends keyof T, C extends keyof JSX.IntrinsicElements | React.FunctionComponent<any>>(
5+
export type ElementProps<C extends React.FunctionComponent<any> | keyof JSX.IntrinsicElements> = C extends React.FunctionComponent<infer P>
6+
? P
7+
: C extends keyof JSX.IntrinsicElements
8+
? JSX.IntrinsicElements[C]
9+
: never;
10+
11+
export function Field<T extends object, K extends keyof T, C extends React.FunctionComponent<any> | keyof JSX.IntrinsicElements>(
612
props: {
713
form: FormState<T>;
814
name: K;
915
component?: C;
10-
} & Omit<
11-
(C extends React.FunctionComponent<infer P> ? P : {}) & (C extends keyof JSX.IntrinsicElements ? JSX.IntrinsicElements[C] : {}),
12-
"form" | "name" | "component" | "value" | "onChange"
13-
>
16+
} & Omit<ElementProps<C>, "form" | "name" | "component" | "value" | "onChange">
1417
) {
1518
const { form, component = "input", ...rest } = props;
1619
const { value, setValue } = useListener(form, props.name);
17-
const onChange = useCallback((ev: any) => setValue(ev.target?.value ?? ev), []);
20+
const onChange = useCallback((ev: any) => setValue(ev.target?.value ?? ev), [setValue]);
1821
return React.createElement(component, { ...rest, value, onChange });
1922
}

src/elements/FormError.tsx

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
1-
import React, { HTMLAttributes } from "react";
2-
import { DefaultError, FormState } from "../form";
1+
import React from "react";
2+
import { DefaultError, DefaultState, FormState } from "../form";
33
import { useListener } from "../hooks";
4+
import { ElementProps } from "./Field";
45

5-
export type FormErrorProps<T extends object, K extends keyof T, Error extends string = DefaultError> = Omit<
6-
HTMLAttributes<HTMLParagraphElement>,
7-
"name" | "form"
8-
> & {
9-
form: FormState<T, any, Error>;
10-
name: K;
11-
};
12-
13-
/**
14-
* The builtin form error. You must always specify **form** and **name**.
15-
*
16-
* **FormInput**, **FormTextArea** and **FormSelect** are also available.
17-
*
18-
* Because this component is very basic, it is recommended to [implement your own error component](https://codestix.github.io/typed-react-form/reference/FormError#custom-error-component).
19-
*/
20-
export function FormError<T extends object, K extends keyof T, Error extends string = DefaultError>({
21-
form,
22-
name,
23-
...rest
24-
}: FormErrorProps<T, K, Error>) {
25-
const { error } = useListener(form, name);
6+
export function FieldError<
7+
T extends object,
8+
K extends keyof T,
9+
C extends React.FunctionComponent<any> | keyof JSX.IntrinsicElements,
10+
Error extends string = DefaultError,
11+
State = DefaultState
12+
>(
13+
props: {
14+
form: FormState<T, State, Error>;
15+
name: K;
16+
component?: C;
17+
transformer?: (error: Error) => React.ReactNode;
18+
} & Omit<ElementProps<C>, "transformer" | "component" | "name" | "form">
19+
) {
20+
const { form, component = React.Fragment, transformer } = props;
21+
const { error } = useListener(form, props.name);
2622
if (!error || typeof error === "object") return null;
27-
return <p {...rest}>{error + ""}</p>;
23+
return React.createElement(component, { children: String(transformer ? transformer(error as Error) : error) });
2824
}

0 commit comments

Comments
 (0)