From 57d2b9afe4c591922564d16c0e16b8586eccfd78 Mon Sep 17 00:00:00 2001 From: "maksim.chernik" Date: Wed, 20 Nov 2024 08:29:55 +0300 Subject: [PATCH] add: useCustomFormik.ts --- packages/formik/src/useCustomFormik.ts | 123 +++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 packages/formik/src/useCustomFormik.ts diff --git a/packages/formik/src/useCustomFormik.ts b/packages/formik/src/useCustomFormik.ts new file mode 100644 index 000000000..f40f91821 --- /dev/null +++ b/packages/formik/src/useCustomFormik.ts @@ -0,0 +1,123 @@ +import { useFormik } from './Formik'; + +import type { + FormikConfig, + FormikValues, + FieldInputProps, +} from './types'; +import { FieldConfig } from './Field'; + +type FieldValues = Record; + +type Primitive = null | undefined | string | number | boolean | symbol | bigint; + +type IsTuple> = number extends T['length'] + ? false + : true; +type TupleKey> = Exclude; +type ArrayKey = number; + +type PathImpl = V extends Primitive + ? `${K}` + : `${K}` | `${K}.${Path}`; + +type Path = + T extends ReadonlyArray + ? IsTuple extends true + ? { + [K in TupleKey]-?: PathImpl; + }[TupleKey] + : PathImpl + : { + [K in keyof T]-?: PathImpl; + }[keyof T]; + +type TDeepKeyof = Path; +export const useCustomFormik = ({ + validateOnChange, + validateOnBlur, + validateOnMount, + isInitialValid, + enableReinitialize, + onSubmit, + validationSchema, + initialValues, + children, + component, + initialErrors, + initialStatus, + initialTouched, + innerRef, + onReset, + validate, +}: FormikConfig) => { + const { + getFieldProps: noTypeGetFieldProps, + setFieldTouched: noTypeSetFieldTouched, + setFieldValue: noTypeSetFieldValue, + setFieldError: noTypeSetFieldError, + getFieldMeta: noTypeGetFieldMeta, + getFieldHelpers: noTypeGetFieldHelpers, + ...rest + } = useFormik({ + validateOnChange, + validateOnMount, + isInitialValid, + enableReinitialize, + onSubmit, + validationSchema, + validateOnBlur, + initialValues, + children, + component, + initialErrors, + initialStatus, + initialTouched, + innerRef, + onReset, + validate, + }); + const getFieldProps = ( + nameOrOptions: TDeepKeyof | FieldConfig>, + ): FieldInputProps> => { + return noTypeGetFieldProps( + nameOrOptions! satisfies TDeepKeyof | FieldConfig>, + ); + }; + const setFieldTouched = ( + field: TDeepKeyof, + touched?: boolean | undefined, + shouldValidate?: boolean | undefined, + ) => { + return noTypeSetFieldTouched( + field! satisfies TDeepKeyof, + touched, + shouldValidate, + ); + }; + const setFieldValue = ( + field: TDeepKeyof, + value?: any, + shouldValidate?: any, + ) => { + noTypeSetFieldValue(field! satisfies TDeepKeyof, value, shouldValidate); + }; + const setFieldError = (field: TDeepKeyof, value: string | undefined) => { + noTypeSetFieldError(field! satisfies TDeepKeyof, value); + }; + const getFieldMeta = (name: TDeepKeyof) => { + noTypeGetFieldMeta(name! satisfies TDeepKeyof); + }; + const getFieldHelpers = (name: TDeepKeyof) => { + noTypeGetFieldHelpers(name! satisfies TDeepKeyof); + }; + return { + ...rest, + getFieldProps, + setFieldTouched, + setFieldValue, + setFieldError, + getFieldMeta, + getFieldHelpers, + }; +};