UNPKG

react-form-krafter

Version:

A flexible form engine for React powered by Standard Schema

85 lines (84 loc) 2.91 kB
import { StandardSchemaV1 } from '@standard-schema/spec'; import { Field } from './field.types'; export type OnUpdate = { preventUpdate?: boolean; }; export type FormApi<T> = { reset: () => void; updateFieldsState: (newState: Partial<T>) => void; setFieldsState: React.Dispatch<React.SetStateAction<T>>; setFieldsInfo: React.Dispatch<React.SetStateAction<FieldsInfo<T>>>; setDisabled: (fieldName: keyof T, disabled: boolean) => void; setError: (fieldName: keyof T, error: string | null) => void; setFieldValue: (fieldName: keyof T, value: T[keyof T]) => void; setDidSubmitOnce: React.Dispatch<React.SetStateAction<boolean>>; checkForErrors: () => Promise<void>; fieldsState: T; isSubmitting: boolean; didSubmitOnce: boolean; hasSomeError: boolean; fieldsInfo: FieldsInfo<T>; onFormSubmit: (e: React.FormEvent<HTMLFormElement>) => void | Promise<void>; }; export type onSubmitProps<T> = { state: T; errors: Record<keyof T, string | null>; success: boolean; }; export type onUpdateProps<T> = { fieldName: keyof T; value: T[keyof T]; previousState: T; currentState: T; }; export type onChangeProps<T> = { fieldName: keyof T; value: T[keyof T]; previousState: T; currentState: T; }; export type FormUserProps<T, G extends StandardSchemaV1> = { fields: Field[]; onSubmit?: ({ errors, success, state, }: onSubmitProps<T>) => void | Promise<void>; onUpdate?: (props: onUpdateProps<T>) => void | Promise<OnUpdate | void>; onChange?: (props: onChangeProps<T>) => void | Promise<void>; schema: G; }; export type FormFallbackProps = { field: Field; }; export type FormUserConfigProps<T> = Partial<{ formApi: React.RefObject<FormApi<T> | null>; formClassName: string; forceFieldChangeState: T; initialDisabledFields: (keyof T)[]; children: React.ReactNode | null | ((formApi: FormApi<T>) => React.ReactNode); fieldWrapper?: (fieldComp: React.ReactNode, fieldProps: Field) => React.ReactNode; }>; export type FormContext<T, G extends StandardSchemaV1> = FormUserProps<T, G> & { fieldsState: T; setFieldsState: React.Dispatch<React.SetStateAction<T>>; fieldsInfo: FieldsInfo<T>; setFieldsInfo: React.Dispatch<React.SetStateAction<FieldsInfo<T>>>; didSubmitOnce: boolean; isSubmitting: boolean; setFieldValue: (fieldName: keyof T, value: T[keyof T]) => void; reset: () => void; updateFieldsState: FormApi<T>["updateFieldsState"]; }; export type FieldMethods = { onChange: (value: unknown) => Promise<void>; onBlur: () => void; onFocus: () => void; }; export type FieldsInfo<T> = { touched: string[]; focused: string[]; manualErrors: Record<keyof T, string>; dirty: string[]; blurred: string[]; errors: Record<keyof T, string>; disabled: (keyof T)[]; previousState: T; initialState: T; };