import { ControllerRenderProps, FieldPath, FieldPathByValue, FieldValues, RegisterOptions, } from "react-hook-form"; import { FormFieldLayoutProps } from "./FormFieldLayout.js"; type StringRules< TValues extends FieldValues, TName extends FieldPath = FieldPath, > = Omit< RegisterOptions, // should this also exclude min/max? "valueAsNumber" | "valueAsDate" | "setValueAs" >; type NumberRules< TValues extends FieldValues, TName extends FieldPath = FieldPath, > = Omit, "pattern">; // should this also exclude maxLength? // These types are useful for specific field/*FormField declarations. export type CommonStringFieldProps< TValues extends FieldValues, TName extends FieldPathByValue = FieldPathByValue< TValues, string >, > = FormFieldLayoutProps & { name: TName; rules?: StringRules; }; export type CommonNumberFieldProps< TValues extends FieldValues, TName extends FieldPathByValue< TValues, number | undefined > = FieldPathByValue, > = FormFieldLayoutProps & { name: TName; rules?: NumberRules; inputWidth?: `w-${number}`; }; export type CommonUnknownFieldProps< TValues extends FieldValues, TName extends FieldPath = FieldPath, > = FormFieldLayoutProps & { name: TName; // TODO - allow more rules? rules?: Pick, "required" | "validate">; }; export type PatchedControllerRenderProps< TValues extends FieldValues, TValueType, TName extends FieldPathByValue = FieldPathByValue< TValues, TValueType >, > = Omit, "onChange"> & { onChange: (event: TValueType) => void; };