UNPKG

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
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; }