import type React from 'react'; import type { FieldValues, UseControllerProps } from 'react-hook-form'; import { useController } from 'react-hook-form'; import { isBoolean, isFunction, isNumber, isRegExp, isString } from 'lodash'; import { useDefaultProps } from '../../hooks'; import { useLocalization } from '../../localization'; import { TextField, TextFieldProps } from '../text-field'; export type RHFTextFieldProps< T extends FieldValues = FieldValues, Nullable extends boolean = true, TransformedValue = never > = Omit, 'value' | 'name' | 'disabled' | 'error' | 'onChange'> & UseControllerProps & { /** Function to transform value before emitting */ transform?: (value: Nullable extends true ? string | null : string) => TransformedValue; onChange?: ( value: TransformedValue extends [never] ? (Nullable extends true ? string | null : string) : TransformedValue, event: React.ChangeEvent ) => void; }; function RHFTextField( inProps: RHFTextFieldProps ) { const { /** React Hook Form */ name, rules, control, disabled, defaultValue, shouldUnregister, /** React Hook Form */ required, transform, helperText, label, onChange, onBlur, inputRef, ...props } = useDefaultProps({ name: 'ReevolveRHFTextField', props: inProps }); const { translate } = useLocalization(); const { field, fieldState: { error } } = useController({ name, control, defaultValue, shouldUnregister, disabled, rules: rules && { ...rules, required: rules?.required === true ? translate('validation.required', { label }) : rules?.required, pattern: isRegExp(rules?.pattern) ? { value: rules.pattern, message: translate('validation.pattern', { label, pattern: rules.pattern }) } : rules?.pattern, minLength: isNumber(rules?.minLength) ? { value: rules.minLength, message: translate('validation.minLength', { minLength: rules.minLength, label }) } : rules?.minLength, maxLength: isNumber(rules?.maxLength) ? { value: rules.maxLength, message: translate('validation.maxLength', { maxLength: rules.maxLength, label }) } : rules?.maxLength } }); const isFieldRequired = isBoolean(rules?.required) ? rules.required : isString(rules?.required) || rules?.required?.value || required; const onChangeHandler = (value: any, event: React.ChangeEvent) => { if (isFunction(transform)) { value = transform(value); } field.onChange(value); onChange?.(value, event); }; const onBlurHandler = (e: React.FocusEvent) => { field.onBlur(); onBlur?.(e); }; return ( ); } declare module '@mui/material' { interface Components { ReevolveRHFTextField?: { defaultProps?: Partial; }; } } export default RHFTextField;