2020-11-02 13:26:02 +00:00
|
|
|
import useForm, { SubmitPromise, UseFormResult } from "@saleor/hooks/useForm";
|
2020-05-14 09:30:32 +00:00
|
|
|
import React from "react";
|
2019-08-09 11:14:35 +00:00
|
|
|
|
2022-02-01 09:58:06 +00:00
|
|
|
import { FormId } from "./ExitFormDialogProvider";
|
|
|
|
|
2022-05-05 07:54:28 +00:00
|
|
|
export type CheckIfSaveIsDisabledFnType<T> = (data: T) => boolean;
|
2022-03-23 09:13:23 +00:00
|
|
|
|
2022-02-01 09:58:06 +00:00
|
|
|
export interface FormProps<TData, TErrors>
|
2021-11-23 09:03:07 +00:00
|
|
|
extends Omit<React.HTMLProps<HTMLFormElement>, "onSubmit"> {
|
2022-02-01 09:58:06 +00:00
|
|
|
children: (props: UseFormResult<TData>) => React.ReactNode;
|
2019-08-09 11:14:35 +00:00
|
|
|
confirmLeave?: boolean;
|
2022-02-01 09:58:06 +00:00
|
|
|
initial?: TData;
|
2019-06-19 14:40:52 +00:00
|
|
|
resetOnSubmit?: boolean;
|
2022-02-01 09:58:06 +00:00
|
|
|
onSubmit?: (data: TData) => SubmitPromise<TErrors[]> | void;
|
|
|
|
formId?: FormId;
|
2022-03-23 09:13:23 +00:00
|
|
|
checkIfSaveIsDisabled?: CheckIfSaveIsDisabledFnType<TData>;
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
|
2022-02-01 09:58:06 +00:00
|
|
|
function Form<TData, Terrors>({
|
|
|
|
children,
|
|
|
|
initial,
|
|
|
|
resetOnSubmit,
|
|
|
|
onSubmit,
|
|
|
|
confirmLeave = false,
|
|
|
|
formId,
|
2022-03-23 09:13:23 +00:00
|
|
|
checkIfSaveIsDisabled,
|
|
|
|
disabled,
|
2022-02-01 09:58:06 +00:00
|
|
|
...rest
|
|
|
|
}: FormProps<TData, Terrors>) {
|
2022-03-23 09:13:23 +00:00
|
|
|
const renderProps = useForm(initial, onSubmit, {
|
|
|
|
confirmLeave,
|
|
|
|
formId,
|
|
|
|
checkIfSaveIsDisabled,
|
|
|
|
disabled
|
|
|
|
});
|
2019-06-19 14:40:52 +00:00
|
|
|
|
2019-08-09 11:14:35 +00:00
|
|
|
function handleSubmit(event?: React.FormEvent<any>, cb?: () => void) {
|
|
|
|
const { reset, submit } = renderProps;
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
if (event) {
|
|
|
|
event.stopPropagation();
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
2019-08-09 11:14:35 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
if (cb) {
|
|
|
|
cb();
|
|
|
|
}
|
2019-08-09 11:14:35 +00:00
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
if (resetOnSubmit) {
|
2019-08-09 11:14:35 +00:00
|
|
|
reset();
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
|
|
|
|
2019-08-09 11:14:35 +00:00
|
|
|
submit();
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2019-08-09 11:14:35 +00:00
|
|
|
|
2021-11-23 09:03:07 +00:00
|
|
|
return (
|
|
|
|
<form {...rest} onSubmit={handleSubmit}>
|
|
|
|
{children(renderProps)}
|
|
|
|
</form>
|
|
|
|
);
|
2019-06-19 14:40:52 +00:00
|
|
|
}
|
2019-08-09 11:14:35 +00:00
|
|
|
Form.displayName = "Form";
|
|
|
|
|
|
|
|
export default Form;
|