-
Notifications
You must be signed in to change notification settings - Fork 0
/
FormHTMLCheckbox.tsx
47 lines (42 loc) · 1.33 KB
/
FormHTMLCheckbox.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import { memo, ReactElement, ReactNode, useMemo } from "react";
import {
UseHTMLCheckboxArg,
UseHTMLCheckboxReturn,
} from "../hooks/useHTMLCheckbox";
import { ValuesFields } from "../types/ValuesFields";
import { BaseValues } from "../types/BaseValues";
export interface FormHTMLCheckboxProps<
Values extends BaseValues,
Name extends ValuesFields<Values>
> extends UseHTMLCheckboxArg<Values, Name> {
children: (arg: UseHTMLCheckboxReturn<Values, Name>) => ReactNode;
}
/**
* @private
*/
export interface CreateFormHTMLCheckboxDependencies<Values extends BaseValues> {
useHTMLCheckbox: <Name extends ValuesFields<Values>>(
arg: UseHTMLCheckboxArg<Values, Name>
) => UseHTMLCheckboxReturn<Values, Name>;
}
/**
* @private
*/
export const createFormHTMLCheckbox = <Values extends BaseValues>({
useHTMLCheckbox,
}: CreateFormHTMLCheckboxDependencies<Values>) => {
/**
* Get the props for a HTML checkbox.
*
* @param {FormHTMLCheckboxProps<Values, Name>} props
* @returns {ReactElement}
*/
const FormHTMLCheckbox = <Name extends ValuesFields<Values>>({
children,
...rest
}: FormHTMLCheckboxProps<Values, Name>): ReactElement => {
const arg = useHTMLCheckbox<Name>(rest);
return useMemo(() => <>{children(arg)}</>, [children, arg]);
};
return memo(FormHTMLCheckbox) as typeof FormHTMLCheckbox;
};