// Type definitions for react-formutil@>0.4.0 // Project: react-formutil // Definitions by: qiqiboy import React from 'react'; export as namespace ReactFormutil; type Omit = Pick>; type DetectAny = void extends T ? P : K; export interface OtherKeys { [name: string]: any; } export type FieldValidatorProps = { [K in keyof Validators]?: null | ((() => any) extends Validators[K] ? any : Validators[K]); }; export type FieldError = { [K in keyof Validators]: any }; export interface FieldState { $value: T; $viewValue: any; $valid: boolean; $invalid: boolean; $dirty: boolean; $pristine: boolean; $touched: boolean; $untouched: boolean; $focused: boolean; $pending: boolean; $error: FieldError; } export type FormParams = { [K in keyof Fields]: DetectAny : Fields[K]>; }; export type FormErrors = { [K in keyof Fields]: DetectAny< Fields[K], FieldError, Fields[K] extends object ? FormErrors : FieldError >; }; // $validator on
export type FormValiateResult = | ({ [K in keyof Fields]?: DetectAny< Fields[K], Fields[K], Fields[K] extends object ? FormValiateResult : any >; } & { [K in keyof WeakFields]?: any; }) | void | undefined; export type FormTouches = { [K in keyof Fields]: DetectAny : boolean>; }; export type FormDirts = { [K in keyof Fields]: DetectAny : boolean>; }; export type FormFocuses = { [K in keyof Fields]: DetectAny : boolean>; }; export type FormPendings = { [K in keyof Fields]: DetectAny : boolean>; }; export type FormStates = { [K in keyof Fields]: DetectAny< Fields[K], FieldState, Fields[K] extends object ? FormStates : FieldState >; }; export type ArgFormParams = { [K in keyof Fields]?: DetectAny< Fields[K], Fields[K], Fields[K] extends object ? ArgFormParams : Fields[K] >; } & { [K in keyof WeakFields]?: WeakFields[K]; }; export type ArgFieldError = null | false | { [K in keyof Validators]?: any }; export type ArgFieldState = Partial< Omit, '$error'> & { $error: ArgFieldError; } >; export type ArgFormErrors = { [K in keyof Fields]?: DetectAny< Fields[K], ArgFieldError, Fields[K] extends object ? ArgFormErrors | ArgFieldError : ArgFieldError >; } & { [K in keyof WeakFields]?: ArgFieldError; }; export type ArgFormTouches = { [K in keyof Fields]?: DetectAny< Fields[K], boolean, Fields[K] extends object ? ArgFormTouches | boolean : boolean >; } & { [K in keyof WeakFields]?: boolean; }; export type ArgFormPendings = { [K in keyof Fields]?: DetectAny< Fields[K], boolean, Fields[K] extends object ? ArgFormPendings | boolean : boolean >; } & { [K in keyof WeakFields]?: boolean; }; export type ArgFormDirts = { [K in keyof Fields]?: DetectAny< Fields[K], boolean, Fields[K] extends object ? ArgFormDirts | boolean : boolean >; } & { [K in keyof WeakFields]?: boolean; }; export type ArgFormFocuses = { [K in keyof Fields]?: DetectAny< Fields[K], boolean, Fields[K] extends object ? ArgFormFocuses | boolean : boolean >; } & { [K in keyof WeakFields]?: boolean; }; export type ArgFormStates = { [K in keyof Fields]?: DetectAny< Fields[K], ArgFieldState, Fields[K] extends object ? ArgFormStates | ArgFieldState : ArgFieldState >; } & { [K in keyof WeakFields]?: ArgFieldState; }; export type FormWeakParams = { [K in keyof Fields]: Fields[K] }; export type FormWeakErrors = { [K in keyof Fields]: FieldError }; export type FormWeakTouches = { [K in keyof Fields]: boolean }; export type FormWeakDirts = { [K in keyof Fields]: boolean }; export type FormWeakFocuses = { [K in keyof Fields]: boolean }; export type FormWeakPendings = { [K in keyof Fields]: boolean }; export type FormWeakStates = { [K in keyof Fields]: FieldState }; export type Registers = { [K in keyof WeakFields]: $FieldRegister; }; export type DeepRegisters = { [K in keyof Fields]: DetectAny< Fields[K], $FieldRegister, Fields[K] extends object ? DeepRegisters : $Fieldutil >; }; export type CheckerValidator = ( value: T, fieldProps: Parameters>[2] ) => any; export type Validator = ( value: T, propName: any, fieldProps: EasyFieldProps & { $validError?: FieldError; $fieldutil?: $Fieldutil; $formutil?: $Formutil; } & OtherKeys ) => any; export type Validators = { [K in keyof P]: Validator; }; export interface BaseFieldComponentProps { $defaultValue?: T | ((props: any) => T); $defaultState?: ArgFieldState | ((props: any) => ArgFieldState); $onFieldChange?: (newValue: T, preValue: T, $formutil: $Formutil) => void; $validators?: Validators; $asyncValidators?: never; $validateLazy?: boolean; $memo?: boolean | any[]; $reserveOnUnmount?: boolean; $parser?: (($viewValue: any, $setViewValue: ($newViewValue: any) => any) => T) | null; $formatter?: (($modelValue: T, $setModelValue: ($newModelValue: T) => T) => any) | null; $ref?: | (($fieldutil: $Fieldutil | null) => void) | React.RefObject<$Fieldutil>; name?: string; } export type FieldProps = BaseFieldComponentProps< T, Validators, Fields, WeakFields > & FieldValidatorProps; export interface FieldComponentProps extends BaseFieldComponentProps { component?: React.ComponentType<{ $fieldutil: $Fieldutil } & OtherKeys>; render?: ($fieldutil: $Fieldutil) => React.ReactNode; children?: (($fieldutil: $Fieldutil) => React.ReactNode) | React.ReactNode; } export interface EasyFieldDefaultValidators { required: boolean; maxLength: number; minLength: number; max: number; min: number; enum: any[]; pattern: RegExp; } export type ValidMessage

= { [K in keyof P]?: any }; export interface BaseEasyFieldComponentProps extends BaseFieldComponentProps, FieldValidatorProps { checked?: T; unchecked?: T; validMessage?: ValidMessage< EasyFieldDefaultValidators & { checker } & Omit >; passUtil?: string | boolean; getValueFromEvent?: (...args: any[]) => T; valuePropName?: string; changePropName?: string; focusPropName?: string; blurPropName?: string; checker?: CheckerValidator; } export type EasyFieldProps< T = string, Validators = any, Fields = any, WeakFields = Fields > = BaseEasyFieldComponentProps & FieldValidatorProps; export interface EasyFieldComponentProps extends BaseEasyFieldComponentProps { type?: string; defaultValue?: T; groupNode?: string | React.ComponentType & OtherKeys>; component?: React.ComponentType<$FieldHandler & OtherKeys>; render?: ($fieldHandler: $FieldHandler) => React.ReactNode; children?: any; } export interface EasyFieldGroupOptionComponentProps { $value: T; } type FieldHanderCallback = (...args: any[]) => void; export type $FieldHandler< T = string, valuePropName = 'value', changePropName = 'onChage', focusPropName = 'onFocus', blurPropName = 'onBlur', passUtil = never // @ts-ignore > = { [K in valuePropName]: T } & // @ts-ignore { [K in changePropName]: FieldHanderCallback } & // @ts-ignore { [K in focusPropName]: FieldHanderCallback } & // @ts-ignore { [K in blurPropName]: FieldHanderCallback } & // @ts-ignore { [K in passUtil]: K extends string ? $Fieldutil : never }; export interface $FieldRegister { readonly $$FIELD_UUID: number; $new(): $Fieldutil; $picker(): Readonly>; $getState(): Readonly>; $getComponent(): React.ReactNode; $getFirstError(): any; $onValidate>(callback?: ($fieldutil: S) => void): Promise; $reset>(callback?: ($fieldutil: S) => void): Promise; $reset>( newState?: ArgFieldState, callback?: ($fieldutil: S) => void ): Promise; $render>( $viewValue: any, callback?: ($fieldutil: S) => void ): Promise; $setValue>( $modelValue: T, callback?: ($fieldutil: S) => void ): Promise; $setState>( newState: ArgFieldState, callback?: ($fieldutil: S) => void ): Promise; $setTouched>( touched: boolean, callback?: ($fieldutil: S) => void ): Promise; $setDirty>( dirty: boolean, callback?: ($fieldutil: S) => void ): Promise; $setFocused>( focused: boolean, callback?: ($fieldutil: S) => void ): Promise; $setPending>( pending: boolean, callback?: ($fieldutil: S) => void ): Promise; $setValidity>( errorKey: string, validResult: any, callback?: ($fieldutil: S) => void ): Promise; $setError>( error: ArgFieldError, callback?: ($fieldutil: S) => void ): Promise; $validate>(callback?: ($fieldutil: S) => void): Promise; } export interface $Fieldutil extends Readonly<$FieldRegister>, Readonly> { readonly $name: string; readonly $$formutil: $Formutil; } export interface $Formutil { readonly $states: Readonly>; readonly $params: Readonly>; readonly $pureParams: Readonly>; readonly $errors: Readonly>; readonly $touches: Readonly>; readonly $dirts: Readonly>; readonly $focuses: Readonly>; readonly $pendings: Readonly>; readonly $weakStates: Readonly>; readonly $weakParams: Readonly>; readonly $weakErrors: Readonly>; readonly $weakTouches: Readonly>; readonly $weakDirts: Readonly>; readonly $weakFocuses: Readonly>; readonly $weakPendings: Readonly>; readonly $valid: boolean; readonly $invalid: boolean; readonly $dirty: boolean; readonly $pristine: boolean; readonly $touched: boolean; readonly $untouched: boolean; readonly $focused: boolean; readonly $pending: boolean; readonly $$registers: Readonly>; readonly $$deepRegisters: Readonly>; $new(): $Formutil; $getField( name: T ): undefined | $Fieldutil; $onValidates>(callback?: ($formutil: S) => void): Promise; $getFirstError(name?: T): any; $render>(callback?: ($formutil: S) => void): Promise; $validate>( name: T, callback?: ($fieldutil?: S) => void ): undefined | Promise; $validates>( name: T | T[], callback?: ($formutil: S) => void ): Promise; $validates>(callback?: ($formutil: S) => void): Promise; $reset>(callback?: ($formutil: S) => void): Promise; $reset>( stateTree: ArgFormStates, callback?: ($formutil: S) => void ): Promise; $setStates>( stateTree: ArgFormStates, callback?: ($formutil: S) => void ): Promise; $setValues>( valueTree: ArgFormParams, callback?: ($formutil: S) => void ): Promise; $setFocuses>( focusedTree: ArgFormFocuses, callback?: ($formutil: S) => void ): Promise; $setDirts>( dirtyTree: ArgFormDirts, callback?: ($formutil: S) => void ): Promise; $setTouches>( touchedTree: ArgFormTouches, callback?: ($formutil: S) => void ): Promise; $setPendings>( pendingTree: ArgFormPendings, callback?: ($formutil: S) => void ): Promise; $setErrors>( errorTree: ArgFormErrors, callback?: ($formutil: S) => void ): Promise; $batchState>( state: ArgFieldState, callback?: ($formutil: S) => void ): Promise; $batchDirty>( dirty: boolean, callback?: ($formutil: S) => void ): Promise; $batchTouched>( touched: boolean, callback?: ($formutil: S) => void ): Promise; $batchFocused>( focused: boolean, callback?: ($formutil: S) => void ): Promise; $batchPending>( pending: boolean, callback?: ($formutil: S) => void ): Promise; $batchError>( $error: ArgFieldError, callback?: ($formutil: S) => void ): Promise; } export interface $Listutil extends $Formutil { $length: number; $index: number; onFocus: FieldHanderCallback; onBlur: FieldHanderCallback; $swap>( p1: number, p2: number, callback?: ($formutil: S) => void ): Promise; $insert>( position: number, values: ArgFormParams, callback?: ($formutil: S) => void ): Promise; $insert>( posOrValues: number | ArgFormParams, callback?: ($formutil: S) => void ): Promise; $insert>( callback?: ($formutil: S) => void ): Promise; $remove>( position: number, callback?: ($formutil: S) => void ): Promise; $remove>( callback?: ($formutil: S) => void ): Promise; $push>( values: ArgFormParams, callback?: ($formutil: S) => void ): Promise; $push>(callback?: ($formutil: S) => void): Promise; $pop>(callback?: ($formutil: S) => void): Promise; $shift>( callback?: ($formutil: S) => void ): Promise; $unshift>( values: ArgFormParams, callback?: ($formutil: S) => void ): Promise; $unshift>( callback?: ($formutil: S) => void ): Promise; $isFirst(): boolean; $isLast(): boolean; } export interface BaseFormComponentProps { $defaultValues?: ArgFormParams | ((props: any) => ArgFormParams); $defaultStates?: | ArgFormStates | ((props: any) => ArgFormStates); $onFormChange?: ( $formutil: $Formutil, newValues: Readonly>, preValues: Readonly> ) => void; $validator?: ( $params: FormParams, $formutil: $Formutil ) => FormValiateResult | Promise>; $processer?: ($state: FieldState, name: K) => void; $ref?: | (($formutil: $Formutil | null) => void) | React.RefObject<$Formutil>; } export type FormProps = BaseFormComponentProps< Fields, Validators, WeakFields >; export interface FormComponentProps extends BaseFormComponentProps { component?: React.ComponentType<{ $formutil: $Formutil } & OtherKeys>; render?: ($formutil: $Formutil) => React.ReactNode; children?: (($formutil: $Formutil) => React.ReactNode) | React.ReactNode; } export class Field extends React.Component< FieldComponentProps & OtherKeys > {} export function withField( component: React.ComponentType< SelfProps & { $fieldutil: $Fieldutil; } >, config?: FieldProps ): React.ComponentClass & FieldProps>; export function withField( config?: FieldProps ): ( component: React.ComponentType< SelfProps & { $fieldutil: $Fieldutil; } > ) => React.ComponentClass & FieldProps>; export class EasyField extends React.Component< EasyFieldComponentProps & OtherKeys > {} export class Form extends React.Component< FormComponentProps > {} export function withForm( component: React.ComponentType< SelfProps & { $formutil: $Formutil; } >, config?: FormProps ): React.ComponentClass & FormProps>; export function withForm( config?: FormProps ): ( component: React.ComponentType< SelfProps & { $formutil: $Formutil; } > ) => React.ComponentClass & FormProps>; export function connect( component: React.ComponentType< SelfProps & { $formutil: $Formutil; } > ): React.ComponentClass>; // hooks export function useField( name?: string, props?: Omit, 'name'> ): $Fieldutil; export function useField( props?: FieldProps ): $Fieldutil; export function useForm(): $Formutil< Fields, Validators, WeakFields >; export function useHandler( name: string, props?: Omit, 'name'> ): $FieldHandler; export function useHandler( props: EasyFieldProps ): $FieldHandler & OtherKeys; export interface FormContext { $$registers: Registers; $$register(name: string, $handler: $Fieldutil, prevName?: string): void; $$unregister(name: string, $handler: $Fieldutil, $$reserved?: boolean): void; $$onChange( name: string, $state: ArgFieldState, callback: ($formutil: $Formutil) => void ): Promise<$Formutil>; $$getDefault(): { $$defaultStates: ArgFormStates; $$defaultValues: ArgFormParams; }; $formutil: $Formutil; } export const formContext: React.Context<() => FormContext>;