import { FocusEvent } from 'react'; import { FieldValues, useController, UseControllerProps } from 'react-hook-form'; import { isBoolean, isString } from 'lodash'; import { useDefaultProps } from '../../hooks'; import { useLocalization } from '../../localization'; import NumberField, { NumberFieldProps } from '../number-field/NumberField'; export type RHFNumberFieldProps = Omit< NumberFieldProps, 'value' | 'name' | 'disabled' | 'error' | 'onChange' > & UseControllerProps & { onChange?: (value: number | string | null) => void; }; function RHFNumberField(inProps: RHFNumberFieldProps) { const { /** React Hook Form */ name, rules, control, disabled, defaultValue, shouldUnregister, /** React Hook Form */ required, helperText, label, inputRef, onChange, onBlur, ...props } = useDefaultProps({ name: 'ReevolveRHFNumberField', 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, min: typeof rules?.min === 'number' ? { value: rules.min, message: translate('validation.min', { min: rules.min, label }) } : rules?.min, max: typeof rules?.max === 'number' ? { value: rules.max, message: translate('validation.max', { max: rules.max, label }) } : rules?.max } }); const onChangeHandler = (value: number | string | null) => { field.onChange(value); onChange?.(value); }; function onBlurHandler(e: FocusEvent) { field.onBlur(); onBlur?.(e); } return ( ); } declare module '@mui/material' { interface Components { ReevolveRHFNumberField?: { defaultProps?: Partial; }; } } export default RHFNumberField;