/* eslint-disable react-hooks/rules-of-hooks */ /* eslint-disable @typescript-eslint/consistent-indexed-object-style */ // import React, { ReactNode, ReactChild, ReactFragment, ReactPortal } from 'react' import { delay, isArray, isObject } from '@fexd/tools' import { useCoverable, CoverableValue } from '@fexd/pro-utils' import { ProTableProps, ProTableColumnType, ProTableQueryFieldType, ProTableEditFieldType, ProTableTableActionType, ProTableBuiltInActionNames, ProTableBuiltInBatchActionNames, ProTableBuiltInIconActionNames, ProTableBuiltInColumnActionNames, ProTableTableActionPureType, } from '../types' export default function defineCoverableProps( value: T & CoverableProTableProps, ): CoverableValue< T & CoverableProTableProps & { getProps: () => ProTableProps }, CoverableProTableConfig > { const getArrayLikeConfig = (config) => (isObject(config) ? Object.values(config) : isArray(config) ? config : config) const getProps = (config: any) => ({ ...config, actions: getArrayLikeConfig(config.actions), iconActions: getArrayLikeConfig(config.iconActions), columnActions: getArrayLikeConfig(config.columnActions), batchActions: getArrayLikeConfig(config.batchActions), queryFields: getArrayLikeConfig(config.queryFields), addFields: getArrayLikeConfig(config.addFields), editFields: getArrayLikeConfig(config.editFields), viewFields: getArrayLikeConfig(config.viewFields), }) return useCoverable.value({ default: { ...value, getProps: (() => getProps(value)) as () => ProTableProps, }, config: value as any as CoverableProTableConfig, onCovered(current, config) { const nextConfig = useCoverable.merge(current, config) return { ...nextConfig, getProps: () => getProps(nextConfig), } }, }) as any as CoverableValue< T & CoverableProTableProps & { getProps: () => ProTableProps }, CoverableProTableConfig > } 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] } export type CoverableObjectConfig = V extends Record ? | Record | { [key: string | number | symbol]: T } : V type _CoverableProTablePropsMap = { actions: [ProTableTableActionType, ProTableProps['actions']] iconActions: [ProTableTableActionType, ProTableProps['iconActions']] columnActions: [ ( | ProTableTableActionPureType | ((item: any, ...args: any[]) => ProTableTableActionPureType) ), ProTableProps['columnActions'], ] batchActions: [ProTableTableActionType, ProTableProps['batchActions']] queryFields: [ProTableQueryFieldType, ProTableProps['queryFields']] addFields: [ProTableEditFieldType, ProTableProps['addFields']] editFields: [ProTableEditFieldType, ProTableProps['editFields']] viewFields: [ProTableEditFieldType, ProTableProps['viewFields']] columns: [ProTableColumnType, ProTableProps['columns']] } type _CoverableProTableProps = _CoverableProps<_CoverableProTablePropsMap> export type CoverableProTableProps = _CoverableProTableProps & Omit type _CoverableProTableConfig = _CoverableConfig<_CoverableProTablePropsMap, T> export type CoverableProTableConfig = Omit & (Omit & _CoverableProTableConfig)