UNPKG

1.37 kBPlain TextView Raw
1import * as React from "react";
2import { createComponent } from "reakit-system/createComponent";
3import { createHook } from "reakit-system/createHook";
4import { useLiveRef } from "reakit-utils/useLiveRef";
5import { RoleOptions, RoleHTMLProps, useRole } from "../Role/Role";
6import { unstable_FormStateReturn } from "./FormState";
7import { FORM_KEYS } from "./__keys";
8
9export type unstable_FormOptions = RoleOptions &
10 Pick<unstable_FormStateReturn<any>, "submit">;
11
12export type unstable_FormHTMLProps = RoleHTMLProps &
13 React.FormHTMLAttributes<any>;
14
15export type unstable_FormProps = unstable_FormOptions & unstable_FormHTMLProps;
16
17export const unstable_useForm = createHook<
18 unstable_FormOptions,
19 unstable_FormHTMLProps
20>({
21 name: "Form",
22 compose: useRole,
23 keys: FORM_KEYS,
24
25 useProps(options, { onSubmit: htmlOnSubmit, ...htmlProps }) {
26 const onSubmitRef = useLiveRef(htmlOnSubmit);
27
28 const onSubmit = React.useCallback(
29 (event: React.FormEvent) => {
30 onSubmitRef.current?.(event);
31 if (event.defaultPrevented) return;
32 event.preventDefault();
33 options.submit?.();
34 },
35 [options.submit]
36 );
37
38 return {
39 role: "form",
40 noValidate: true,
41 onSubmit,
42 ...htmlProps,
43 };
44 },
45});
46
47export const unstable_Form = createComponent({
48 as: "form",
49 useHook: unstable_useForm,
50});