diff --git a/src/types.ts b/src/types.ts index bf360ea..8166a74 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,73 @@ // TDDO: use the one from Kea directly -import { BreakPointFunction, Logic, LogicPropSelectors, SelectorDefinition } from 'kea' +import { BreakPointFunction, BuiltLogic, Logic, LogicPropSelectors, SelectorDefinition, MakeLogicType } from 'kea' + +export type MakeFormLogicType< + TForms extends Record> = Record>, + TValues extends Record = Record, + TActions = Record, + TProps = Record, +> = MakeLogicType, TActions & FormActions, TProps> + +export type FormValues< + TFormData extends Record> = Record>, +> = { + [K in keyof TFormData]: K extends string ? SingleFormValues : never +} + +type SingleFormValues< + TFormName extends string, + TFormData extends Pick, 'defaults'> = Pick, 'defaults'>, +> = ObjectEntries> + +type InterpolatedFormValueTuples< + TFormName extends string, + TFormData extends Pick, 'defaults'> = Pick, 'defaults'>, +> = [ + [TFormName, TFormData], + [`${TFormName}Changes`, DeepPartial], + [`${TFormName}Touches`, DeepPartialMap], + [`is${PascalCase}Submitting`, boolean], + [`show${PascalCase}Errors`, boolean], + [`${TFormName}Changed`, boolean], + [`${TFormName}Touched`, boolean], + [`${TFormName}ValidationErrors`, DeepPartialMap], + [`${TFormName}HasErrors`, boolean], + [`${TFormName}Errors`, DeepPartialMap], + [`is${PascalCase}Valid`, boolean], +] + +export type FormActions< + TFormData extends Record> = Record>, +> = { + [K in keyof TFormData]: K extends string ? SingleFormActions : never +} + +type SingleFormActions< + TFormName extends string, + TFormData extends Pick, 'defaults'> = Pick, 'defaults'>, +> = ObjectEntries> + +type InterpolatedFormActionTuples< + TFormName extends string, + TFormData extends Pick, 'defaults'> = Pick, 'defaults'>, +> = [ + [`set${PascalCase}Value`, (key: keyof TFormData, value: any) => void], + [`set${PascalCase}Values`, (values: Partial) => void], + [`touch${PascalCase}Field`, (key: keyof TFormData) => void], + [`reset${PascalCase}`, (values?: TFormData) => void], + [`submit${PascalCase}`, () => void], + [`submit${PascalCase}Request`, (formData: TFormData) => void], + [`submit${PascalCase}Success`, (formData: TFormData) => void], + [`submit${PascalCase}Failure`, (error: Error) => void], +] + +export type AnyFunction = (...args: any) => any + +type ObjectEntries = { [K in T[number] as K[0]]: K[1] } + +type PascalCase = T extends `${infer FirstChar}${infer Rest}` + ? `${Capitalize}${Rest}` + : never export interface FormOptions { showErrorsOnTouch: boolean @@ -17,9 +85,11 @@ export interface FormInput = Reco } export type FormDefinitions = L['values'] extends Record - ? Partial<{ - [K in keyof L['values']]: FormInput - }> + ? Partial< + { + [K in keyof L['values']]: FormInput + } + > : Record> export type FieldNameType = string | number