UNPKG

@shopify/react-form-state

Version:

Manage React forms tersely and type-safely with no magic

75 lines 2.51 kB
import React from 'react'; import { FieldDescriptors, FieldStates, ValidationFunction } from './types'; import { List, Nested } from './components'; export interface RemoteError { field?: string[] | null; message: string; } type MaybeArray<T> = T | T[]; type MaybePromise<T> = T | Promise<T>; interface SubmitHandler<Fields> { (formDetails: FormData<Fields>): MaybePromise<RemoteError[]> | MaybePromise<void> | MaybePromise<RemoteError[] | void>; } export type Validator<T, F> = MaybeArray<ValidationFunction<T, F>>; export type ValidatorDictionary<FieldMap> = { [FieldPath in keyof FieldMap]: Validator<FieldMap[FieldPath], FieldMap>; }; export interface FormData<Fields> { fields: FieldDescriptors<Fields>; dirty: boolean; valid: boolean; errors: RemoteError[]; } export interface FormDetails<Fields> extends FormData<Fields> { submitting: boolean; reset(): void; submit(): void; } interface Props<Fields> { initialValues: Fields; children(form: FormDetails<Fields>): React.ReactNode; validators?: Partial<ValidatorDictionary<Fields>>; onSubmit?: SubmitHandler<Fields>; validateOnSubmit?: boolean; onInitialValuesChange?: 'reset-all' | 'reset-where-changed' | 'ignore'; externalErrors?: RemoteError[]; } interface State<Fields> { submitting: boolean; fields: FieldStates<Fields>; dirtyFields: (keyof Fields)[]; errors: RemoteError[]; externalErrors: RemoteError[]; } export default class FormState<Fields extends object> extends React.PureComponent<Props<Fields>, State<Fields>> { static List: typeof List; static Nested: typeof Nested; static getDerivedStateFromProps<T extends object>(newProps: Props<T>, oldState: State<T>): { externalErrors: RemoteError[]; fields: FieldStates<T>; } | null; state: State<Fields>; private mounted; private fieldsWithHandlers; componentDidMount(): void; componentWillUnmount(): void; render(): React.ReactNode; validateForm(): Promise<void>; reset: () => Promise<void>; private get formData(); private get dirty(); private get valid(); private get hasClientErrors(); private get clientErrors(); private get fields(); private submit; private fieldWithHandlers; private updateField; private getUpdatedDirtyFields; private getUpdatedField; private blurField; private validateFieldValue; private updateRemoteErrors; } export {}; //# sourceMappingURL=FormState.d.ts.map