@shopify/react-form-state
Version:
Manage React forms tersely and type-safely with no magic
75 lines • 2.51 kB
TypeScript
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