import { forwardRef, ComponentPropsWithoutRef, PropsWithoutRef } from "react" import { useField, UseFieldConfig } from "react-final-form" export interface LabeledTextFieldProps extends PropsWithoutRef { /** Field name. */ name: string /** Field label. */ label: string /** Field type. Doesn't include radio buttons and checkboxes */ type?: "text" | "password" | "email" | "number" outerProps?: PropsWithoutRef labelProps?: ComponentPropsWithoutRef<"label"> fieldProps?: UseFieldConfig } export const LabeledTextField = forwardRef( ({ name, label, outerProps, fieldProps, labelProps, ...props }, ref) => { const { input, meta: { touched, error, submitError, submitting }, } = useField(name, { parse: props.type === "number" ? (Number as any) : // Converting `""` to `null` ensures empty values will be set to null in the DB (v) => (v === "" ? null : v), ...fieldProps, }) const normalizedError = Array.isArray(error) ? error.join(", ") : error || submitError return (
{touched && normalizedError && (
{normalizedError}
)}
) } ) LabeledTextField.displayName = "LabeledTextField" export default LabeledTextField