@shopify/react-form-state
Version:
Manage react forms tersely and type-safe with no magic.
74 lines (73 loc) • 2.44 kB
TypeScript
import * as React from 'react';
import { FieldDescriptors, FieldStates, ValidationFunction } from './types';
import { List, Nested } from './components';
export interface RemoteError {
field?: string[] | null;
message: string;
}
declare type MaybeArray<T> = T | T[];
declare type MaybePromise<T> = T | Promise<T>;
interface SubmitHandler<Fields> {
(formDetails: FormData<Fields>): MaybePromise<RemoteError[]> | MaybePromise<void>;
}
export declare type Validator<T, F> = MaybeArray<ValidationFunction<T, F>>;
export declare 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>(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<{}>;
reset: () => Promise<{}>;
private readonly formData;
private readonly dirty;
private readonly valid;
private readonly hasClientErrors;
private readonly fields;
private submit;
private fieldWithHandlers;
private updateField;
private getUpdatedDirtyFields;
private getUpdatedField;
private blurField;
private validateFieldValue;
private updateRemoteErrors;
}
export {};