import { BehaviorSubject, Observable } from 'rxjs';
import { InputFieldViewLike } from '..';
import { EditableFieldModel } from '../FormElement';
import FormError from '../FormError';
import { InputFieldModelLike, InputFieldValidationResult, InputFieldValidationValue, ViewRef } from '../formTypes';
import FieldModel, { FieldModelOptions } from './FieldModel';
export interface InputFieldState<T> {
    value?: T;
    error?: FormError;
}
export interface InputFieldValueInfo<T, I = string> extends InputFieldState<T> {
    field: InputFieldModel<T, I>;
}
export interface InputFieldModelOptions<T, I = string> extends FieldModelOptions {
    value: BehaviorSubject<T>;
    onValueChange?: (info: InputFieldValueInfo<T, I>) => void;
    defaultValue?: T;
    placeholder?: string;
    disabled?: boolean;
    autoFocus?: boolean;
    /**
     * If true, this field will be skipped, when the previous
     * submitted field is searching for the next field to focus.
     */
    skipNextFocus?: boolean;
    /** Parse an input value or throw an error. */
    parseInput: (input: I) => T;
    formatValue?: (value: T | undefined) => string;
    validation?: (value?: T) => InputFieldValidationValue;
}
export interface InputFieldModelDelegate<T, I> {
    willValidate: (field: InputFieldModel<T, I>) => void;
}
export declare type ParsedInputFieldModelOptions<T, I> = Omit<InputFieldModelOptions<T, I>, 'parseInput'> & Partial<Pick<InputFieldModelOptions<T, I>, 'parseInput'>>;
export default class InputFieldModel<T, I = string, View extends InputFieldViewLike = any> extends FieldModel<View> implements EditableFieldModel, InputFieldModelLike<T> {
    readonly value: BehaviorSubject<T>;
    readonly edited: BehaviorSubject<boolean>;
    defaultValue: T;
    placeholder: string;
    disabled: boolean;
    autoFocus: boolean;
    skipNextFocus: boolean;
    /** Parse an input value or throw an error. */
    parseInput: (input: I) => T;
    formatValue: (value: T | undefined) => string;
    validation?: (value?: T) => InputFieldValidationValue;
    delegate?: InputFieldModelDelegate<T, I>;
    private _onValueChangeCb?;
    private _didAutoFocus;
    constructor(options: InputFieldModelOptions<T, I>);
    getState(): InputFieldState<T>;
    parseState(input: I): InputFieldState<T>;
    setInput(input: I): InputFieldState<T>;
    resetInput(): InputFieldState<T>;
    isEditable(): this is EditableFieldModel;
    isValueValid(value: T | undefined): value is T;
    normalizedValidationResult(value: T | undefined): InputFieldValidationResult;
    validate(): InputFieldValidationResult;
    formattedValue(): Observable<string>;
    setState({ value, error }: InputFieldState<T>): void;
    onMount(viewRef: ViewRef<View>): void;
    onUnmount(viewRef: ViewRef<View>): void;
}
