import React from "react"; import { get } from "lodash"; import { Controller, FieldPath, FieldValues, useFormContext, } from "react-hook-form"; import { twMerge } from "tailwind-merge"; import { Prettify } from "@/types"; import { Field, GenericFieldProps } from "./Field"; import { Input, InputProps } from "./Input"; type TextFieldProps< TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath = FieldPath, > = Prettify< GenericFieldProps & Omit & { handleChanged?: (props: { name: string }) => void; startIcon?: React.ReactNode; } >; export const TextField = < TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath = FieldPath, >( props: TextFieldProps, ) => { const { name, control, type = "text", label, required, disabled, className, labelClassName, childrenWrapperClassName, hideErrorMessage = false, startIcon, handleChanged, ...rest } = props; const form = useFormContext(); const { formState: { errors }, } = form; const hasError = !!get(errors, name)?.message; const input = (value: string | number) => { return typeof value === "number" ? isNaN(value) ? "" : value.toString() : (value ?? ""); }; const output = type === "number" ? (e: React.ChangeEvent) => { const output = parseFloat(e.target.value); return isNaN(output) ? 0 : output; } : (e: React.ChangeEvent) => e.target.value; return (
( { field.onChange(output(e)); }} value={input(field.value)} onBlur={() => { if (handleChanged) handleChanged({ name }); }} /> )} />
); };