import React, { Fragment, useState, useLayoutEffect } from 'react' import { createPortal } from 'react-dom' import { observer, useField } from '@formily/react' import { FormLayout } from '@formily/antd-v5' import { IconWidget, usePrefix, useTreeNode } from '@pind/designable-react' import { Button, ButtonProps } from 'antd' import cls from 'classnames' import './styles.less' export interface IDrawerSetterProps { text: React.ReactNode triggerProps: ButtonProps } export const DrawerSetter: React.FC = observer((props) => { const node = useTreeNode() const field = useField() const [visible, setVisible] = useState(false) const [remove, setRemove] = useState(false) const [root, setRoot] = useState() const prefix = usePrefix('drawer-setter') const formWrapperCls = usePrefix('settings-form-wrapper') useLayoutEffect(() => { const wrapper = document.querySelector('.' + formWrapperCls) if (wrapper) { setRoot(wrapper) } }, [node]) const renderDrawer = () => { if (root && visible) { return createPortal(
{props.text || field.title}
{props.children}
, root ) } return null } const handleOpen = () => { setVisible(true) } const handleClose = () => { setRemove(true) setTimeout(() => { setVisible(false) setRemove(false) }, 150) } return ( {renderDrawer()} ) })