mirror of
https://github.com/khairul169/garage-webui.git
synced 2025-04-27 22:39:31 +07:00
59 lines
1.3 KiB
TypeScript
59 lines
1.3 KiB
TypeScript
import { cn } from "@/lib/utils";
|
|
import { ComponentPropsWithoutRef } from "react";
|
|
import {
|
|
FieldValues,
|
|
UseFormReturn,
|
|
Controller,
|
|
ControllerRenderProps,
|
|
ControllerFieldState,
|
|
FieldPath,
|
|
UseFormStateReturn,
|
|
} from "react-hook-form";
|
|
|
|
type FormControlProps<
|
|
T extends FieldValues,
|
|
U extends FieldPath<T> = FieldPath<T>
|
|
> = ComponentPropsWithoutRef<"div"> & {
|
|
form: UseFormReturn<T>;
|
|
name: FieldPath<T>;
|
|
title?: string;
|
|
|
|
render: (
|
|
field: ControllerRenderProps<T, U>,
|
|
fieldProps: {
|
|
fieldState: ControllerFieldState;
|
|
formState: UseFormStateReturn<T>;
|
|
}
|
|
) => React.ReactElement;
|
|
};
|
|
|
|
const FormControl = <T extends FieldValues>({
|
|
form,
|
|
name,
|
|
title,
|
|
className,
|
|
render,
|
|
}: FormControlProps<T>) => {
|
|
return (
|
|
<Controller
|
|
control={form.control}
|
|
name={name}
|
|
render={({ field, fieldState, formState }) => (
|
|
<div className={cn("form-control", className)}>
|
|
{title ? <label className="label label-text">{title}</label> : null}
|
|
|
|
{render(field, { fieldState, formState })}
|
|
|
|
{fieldState.error ? (
|
|
<label className="label label-text text-error">
|
|
{fieldState.error.message}
|
|
</label>
|
|
) : null}
|
|
</div>
|
|
)}
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default FormControl;
|