@formulier/react
Version:
Simple, performant form library for React
51 lines (50 loc) • 2.54 kB
TypeScript
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, };