react-native-form-model
Version:
An easily testable and opinionated React Native form model builder written in pure JavaScript.
64 lines (63 loc) • 2.79 kB
TypeScript
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;
}