UNPKG

@formulier/react

Version:

Simple, performant form library for React

51 lines (50 loc) 2.54 kB
import type * as React from 'react'; import type { FieldValidator, Formulier, FormulierState, GetFieldType, Nullable, Primitives, Values } from '@formulier/core'; interface FieldOptions<V extends Values, F extends string> { name: F; validate?: FieldValidator; valueOptions?: FormFieldValueOptions<V, F>; flushSyncOnChange?: boolean; flushSyncOnBlur?: boolean; } type UseFormFieldResult<V extends Values, F extends string> = [FieldInputProps<V, F>, FieldMeta]; interface FieldInputProps<V extends Values, F extends string> { id: string; name: string; value: GetFieldType<V, F> | null | undefined; onChange: (value: GetFieldType<V, F> | null | undefined) => void; onBlur: () => void; } interface FieldMeta { error: string | null; touched: boolean; } type FieldArrayItem<V extends Values, F extends string> = GetFieldType<V, F> extends (infer T)[] ? T : never; type IsNever<T> = [T] extends [never] ? true : false; interface FieldArrayMethods<Item> { push: (item: Item) => void; insert: (item: Item, index: number) => void; remove: (index: number) => void; move: (fromIndex: number, toIndex: number) => void; swap: (fromIndex: number, toIndex: number) => void; } interface FormFieldArrayOptions<V extends Values, F extends string> { valueOptions?: FormFieldValueOptions<V, F>; } type UseFormFieldArrayResult<Item, P = Primitives> = IsNever<Item> extends true ? [Items: never, arrayMethods: FieldArrayMethods<never>] : Item extends P ? [Items: Item[], arrayMethods: FieldArrayMethods<Item>] : Item extends Record<string, any> ? [Items: Item[], arrayMethods: FieldArrayMethods<Nullable<Item, P>>] : [items: Item[], arrayMethods: FieldArrayMethods<Item>]; interface FormFieldValueOptions<V extends Values, F extends string> { fallback?: GetFieldType<V, F> | null | undefined; equalityFn?: (a: unknown, b: unknown) => boolean; } type UseFormFieldValueResult<V extends Values, F extends string> = GetFieldType<V, F> | null | undefined; interface FormContext<V extends Values, P> { form: Formulier<V, P>; } interface FormProviderProps<V extends Values, P> { form: Formulier<V, P>; children: React.ReactNode; } interface Selector<V extends Values, P, Result> { (state: FormulierState<V, P>): Result; } export type { FieldOptions, UseFormFieldResult, FieldInputProps, FieldMeta, FieldArrayItem, FieldArrayMethods, FormFieldArrayOptions, UseFormFieldArrayResult, FormFieldValueOptions, UseFormFieldValueResult, FormContext, FormProviderProps, Selector, };