import React, { Fragment, useRef, useMemo } from 'react' import { FormItem, IFormItemProps } from '@formily/antd-v5' import { useField, observer, ReactFC } from '@formily/react' import { observable } from '@formily/reactive' import { IconWidget, usePrefix } from '@pind/designable-react' import cls from 'classnames' import './styles.less' const ExpandedMap = new Map() const InternalFoldItem: ReactFC & { Base?: React.FC Extra?: React.FC } = observer(({ className, children, ...props }) => { const prefix = usePrefix('fold-item') const field = useField() const expand = useMemo( () => observable.ref(ExpandedMap.get(field.address.toString())), [] ) const slots = useRef({ base: null, extra: null }) React.Children.forEach(children, (node) => { const props = node?.['props'] if (React.isValidElement(node)) { if (node?.['type']?.['displayName'] === 'FoldItem.Base') { slots.current.base = props.children } if (node?.['type']?.['displayName'] === 'FoldItem.Extra') { slots.current.extra = props.children } } }) return (
{ expand.value = !expand.value ExpandedMap.set(field.address.toString(), expand.value) }} > {slots.current.extra && } {props.label} } >
{ e.stopPropagation() }} > {slots.current.base}
{expand.value && slots.current.extra && (
{slots.current.extra}
)}
) }) const Base: ReactFC = () => { return } Base.displayName = 'FoldItem.Base' const Extra: ReactFC = () => { return } Extra.displayName = 'FoldItem.Extra' export const FoldItem = Object.assign(InternalFoldItem, { Base, Extra, })