@mobx-ecosystem/mobx-form
Version:
provides the ability to use forms with validation in MobX stores
66 lines (65 loc) • 2.27 kB
TypeScript
import { FieldService } from "./field-service";
import { FormService } from "./form-service";
import { CombinedFormFieldService } from "./combined-form-field-service";
import { AutocompleteFieldService } from "./autocompete-field-service";
export type ValueType<T> = T | null | undefined;
export type FormValues<Type> = Type extends IField ? Type['value'] : {
-readonly [Property in keyof ValueType<Type>]: FormValues<Type[Property]>;
};
export type FormErrors<Type> = Type extends IField ? Type['error'] : {
-readonly [Property in keyof Type]: FormErrors<Type[Property]>;
};
export type KeyParams<T> = {
keyType?: 'include' | 'exclude';
keys?: T[] | any[];
};
export interface IField {
value: unknown;
error?: string;
disabled: boolean;
isValid: boolean;
isInit: boolean;
validate?: () => Promise<unknown>;
reset(): void;
setAsInit(): void;
touch(): void;
disable: () => void;
enable: () => void;
}
export interface IForm<T> {
fields: T;
validate: (type: ValidationType) => Promise<unknown>;
keys: string[];
isValid: boolean;
isTouched: boolean;
canBeSubmitted: boolean;
disabled: boolean;
getValues: () => FormValues<ValueType<T>>;
resetErrors: () => void;
setValuesAsInit: () => void;
reset: (keyParams?: KeyParams<keyof T>) => void;
disable: () => void;
enable: () => void;
touch: () => void;
}
export type FormServiceValuesType = Record<string, FieldService<any> | CombinedFormFieldService | AutocompleteFieldService<any>>;
export interface IFormable<T extends FormServiceValuesType = FormServiceValuesType> {
formService: FormService<T>;
}
export type ValidationType = 'only-touched' | 'everything';
type OnChangeHandler<T> = (value: ValueType<T>) => void;
type BeforeChangeHandler<T> = (value: ValueType<T>) => void | 'abort';
export type FieldOptionsType<T> = {
onError?: boolean;
onChange?: OnChangeHandler<T>;
beforeOnChange?: BeforeChangeHandler<T>;
disabledFn?: () => boolean;
};
export type AutocompleteFieldOptionsType<T> = FieldOptionsType<T> & {
onInputChange?: OnChangeHandler<string>;
onInputBeforeChange?: BeforeChangeHandler<string>;
};
export type MethodOptions = {
validate?: boolean;
};
export {};