import _ from "lodash"; import { DetailedHTMLProps, FormHTMLAttributes } from "react"; import { twMerge } from "tailwind-merge"; type Props = DetailedHTMLProps, HTMLFormElement> & { submitHandler?: (e: React.FormEvent, data: T) => void; changeHandler?: (e: React.FormEvent, data: T) => void; }; /** * # Form Element * @className twui-form */ export default function Form< T extends { [key: string]: any } = { [key: string]: any } >({ ...props }: Props) { const finalProps = _.omit(props, ["submitHandler", "changeHandler"]); return (
{ e.preventDefault(); const formEl = e.target as HTMLFormElement; const formData = new FormData(formEl); const data = Object.fromEntries(formData.entries()) as T; props.submitHandler?.(e, data); props.onSubmit?.(e); }} onChange={(e) => { e.preventDefault(); const taregtEl = e.target as HTMLElement; const formEl = taregtEl.closest("form") as HTMLFormElement; const formData = new FormData(formEl); const data = Object.fromEntries(formData.entries()) as T; props.changeHandler?.(e, data); props.onChange?.(e); }} > {props.children}
); }