/// 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); }