import React from 'react' import type { Status as OutlinedInputStatus } from '@toptal/picasso-outlined-input' import type { FieldMetaState } from 'react-final-form' import { useField } from 'react-final-form' import type { Props as FieldProps } from '../Field' import Field from '../Field' import type { ValueType, IFormComponentProps } from '../FieldBase' import type { FormConfigProps } from '../FormConfig' import { useFormConfig } from '../FormConfig' import useFormInputReset from '../utils/use-form-input-reset' export const getInputStatus = ( meta: FieldMetaState, formConfig: FormConfigProps ): OutlinedInputStatus => { if (formConfig.validateOnSubmit && meta.modifiedSinceLastSubmit) { return 'default' } if (!meta.touched) { return 'default' } if (meta.error) { return 'error' } if (!meta.dirtySinceLastSubmit && meta.submitError) { return 'error' } return formConfig.showValidState ? 'success' : 'default' } const InputField = < TWrappedComponentProps extends IFormComponentProps, TInputValue extends ValueType = TWrappedComponentProps['value'] >( props: FieldProps ) => { const { name, children, enableReset, onResetClick, ...rest } = props const { meta, input } = useField(name) const formConfig = useFormConfig() const status = getInputStatus(meta, formConfig) const onFormInputResetClick = useFormInputReset({ input, enableReset, onResetClick, }) return ( status={status} name={name} onResetClick={onFormInputResetClick} enableReset={enableReset} {...rest} > {children} ) } InputField.displayName = 'InputField' export default InputField