///
export declare type Name = string | number;
export declare type Omit = Pick>;
export declare type BooleanTree = {
[K in keyof T]?: T[K] extends object ? BooleanTree : boolean;
};
export declare type FormErrors = {
[P in keyof T]?: T[P] extends object ? FormErrors : string[];
};
export interface FormMeta {
formValue: T;
submitCount: number;
resetForm: () => void;
submit: () => void;
forgetState: () => void;
setFormValue: (setValue: SetFormValueFunc) => void;
setFormVisited: (set: SetFormVisitedFunc) => void;
setFormTouched: (set: SetFormTouchedFunc) => void;
}
export interface SetFormValueFunc {
(previousValue: T): T;
}
export interface SetFieldValueFunc {
(previousValue: T): T;
}
export interface SetFormVisitedFunc {
(previousVisited: BooleanTree): BooleanTree;
}
export interface SetFormTouchedFunc {
(previousTouched: BooleanTree): BooleanTree;
}
export interface InputProps {
name: string;
value: T;
onBlur: (e: React.FocusEvent) => void;
onFocus: (e: React.FocusEvent) => void;
onChange: (e: React.ChangeEvent) => void;
}
export interface UseFieldConfig {
validate?: FieldValidator | Array>;
}
export interface FieldConfig {
name: Name;
render?: (props: FieldProps) => JSX.Element;
validate?: FieldValidator | Array>;
component?: React.ComponentType> | string;
[key: string]: any;
}
export declare type UseFieldFn = (name: Name, props: UseFieldConfig) => UseFieldProps;
export declare type UseFieldProps = [InputProps, FieldMeta];
export interface FieldProps {
input: InputProps;
meta: FieldMeta;
[key: string]: any;
}
export interface FieldMeta extends FormMeta {
path: string;
visited: boolean;
isDirty: boolean;
touched: boolean;
isActive: boolean;
isValid: boolean;
errors: string[];
initialValue: T;
setValue: (value: T | SetFieldValueFunc, touch?: boolean) => void;
setVisited: (value: boolean) => void;
setTouched: (value: boolean) => void;
}
export declare type ValidationResult = string | void | undefined;
export interface FieldValidator {
(value: T, formValue: F): ValidationResult;
}
export interface FormState {
formValue: F;
errorCount: number;
submitCount: number;
errors: FormErrors;
touched: BooleanTree;
visited: BooleanTree;
activeField: string | null;
}
export interface RepeatConfig {
name: Name;
fallback?: T[];
children: (value: T[], utils: ArrayHelpers) => React.ReactNode;
}
export interface ArrayHelpers {
push: (...items: T[]) => number;
pop: () => T | undefined;
shift: () => T | undefined;
unshift: (...items: T[]) => number;
insert: (index: number, ...items: T[]) => number;
swap: (index1: number, index2: number) => void;
remove: (index: number) => T | undefined;
setValue: (value: T[] | SetFieldValueFunc) => void;
}
export interface SectionHelpers {
setValue: (value: T | SetFieldValueFunc) => void;
}
export interface YaflBaseContext {
value: T;
initialValue: T;
errorCount: number;
formValue: F;
touched: BooleanTree;
visited: BooleanTree;
activeField: string | null;
submitCount: number;
formIsValid: boolean;
formIsDirty: boolean;
errors: FormErrors;
submit: () => void;
resetForm: () => void;
forgetState: () => void;
setActiveField: (path: string | null) => void;
touchField: (path: string, touched: boolean) => void;
visitField: (path: string, visited: boolean) => void;
registerErrors: (path: string, errors: string[]) => void;
unregisterErrors: (path: string, errors: string[]) => void;
setFormValue: (setFunc: SetFormValueFunc) => void;
setValue: (path: string, value: any, setTouched?: boolean) => void;
setFormTouched: (setFunc: SetFormTouchedFunc) => void;
setFormVisited: (setFunc: SetFormVisitedFunc) => void;
unregisterField: (path: string) => void;
registerField: (path: string) => void;
}
export interface FormProvider extends YaflBaseContext {
path: string;
branchValues: any;
commonValues: Record;
}
export interface FormProps extends FormMeta {
initialValue: F;
formIsValid: boolean;
formIsDirty: boolean;
activeField: string | null;
visited: BooleanTree;
touched: BooleanTree;
errorCount: number;
errors: FormErrors;
[key: string]: any;
}
export interface UseFormConfig {
initialValue?: T;
disabled?: boolean;
initialSubmitCount?: number;
initialTouched?: BooleanTree;
initialVisited?: BooleanTree;
submitUnregisteredValues?: boolean;
persistFieldState?: boolean;
onSubmit?: (formValue: T, props: FormProps) => boolean | void;
rememberStateOnReinitialize?: boolean;
onStateChange?: (previousState: FormState, nextState: FormState) => void;
onFormValueChange?: (prev: T, next: T) => void;
}
export interface FormConfig extends UseFormConfig {
commonValues?: ((state: {
formValue: T;
}) => Record) | Record;
branchValues?: ((state: {
formValue: T;
}) => Record) | Record;
children: React.ReactNode | ((props: FormProps) => React.ReactNode);
}