/* eslint-disable react-hooks/rules-of-hooks */ /* eslint-disable @typescript-eslint/consistent-indexed-object-style */ import { delay, isArray, isObject } from '@fexd/tools' import { useCoverable, CoverableValue } from '@fexd/pro-utils' import { ProFormProps, ProFieldValueFieldType } from './types' export default function defineCoverableProps( value: T & CoverableProFormProps, ): CoverableValue< T & CoverableProFormProps & { getProps: () => ProFormProps }, CoverableProFormConfig > { const getArrayLikeConfig = (config) => (isObject(config) ? Object.values(config) : isArray(config) ? config : config) const getProps = (config: any) => ({ ...config, fields: getArrayLikeConfig(config.fields), }) return useCoverable.value({ default: { ...value, getProps: (() => getProps(value)) as () => ProFormProps, }, config: value as any as CoverableProFormConfig, onCovered(current, config) { const nextConfig = useCoverable.merge(current, config) return { ...nextConfig, getProps: () => getProps(nextConfig), } }, }) as any as CoverableValue< T & CoverableProFormProps & { getProps: () => ProFormProps }, CoverableProFormConfig > } type _CoverableProps> = { [K in keyof T]?: Record | T[K][1] } type _CoverableConfig, T extends Record> = { // @ts-ignore [K in keyof V]?: CoverableObjectConfig | V[K][1] } type CoverableObjectConfig = V extends Record ? | Record | { [key: string | number | symbol]: T } : V type _CoverableProFormPropsMap = { fields: [ProFieldValueFieldType, ProFormProps['fields']] } type _CoverableProFormProps = _CoverableProps<_CoverableProFormPropsMap> export type CoverableProFormProps = _CoverableProFormProps & Omit type _CoverableProFormConfig = _CoverableConfig<_CoverableProFormPropsMap, T> export type CoverableProFormConfig = Omit & (Omit & _CoverableProFormConfig)