import React, { useEffect, useState, useRef } from 'react' import { TreeNode } from '@designable/core' import { useHover, useSelection, usePrefix } from '../../hooks' import { IconWidget } from '../IconWidget' import { NodeTitleWidget } from '../NodeTitleWidget' import { Button } from 'antd' import { observer } from '@formily/reactive-react' const useMouseHover = ( ref: T, enter?: () => void, leave?: () => void ) => { useEffect(() => { let timer = null let unmounted = false const onMouseOver = (e: MouseEvent) => { const target: HTMLElement = e.target as any clearTimeout(timer) timer = setTimeout(() => { if (unmounted) return if (ref?.current?.contains(target)) { enter && enter() } else { leave && leave() } }, 100) } document.addEventListener('mouseover', onMouseOver) return () => { unmounted = true document.removeEventListener('mouseover', onMouseOver) } }, []) } export interface ISelectorProps { node: TreeNode style?: React.CSSProperties } export const Selector: React.FC = observer(({ node }) => { const hover = useHover() const [expand, setExpand] = useState(false) const ref = useRef(null) const selection = useSelection() const prefix = usePrefix('aux-selector') const renderIcon = (node: TreeNode) => { const icon = node.designerProps.icon if (icon) { return } if (node === node.root) { return } else if (node.designerProps?.droppable) { return } return } const renderMenu = () => { const parents = node.getParents() return (
{parents.slice(0, 4).map((parent) => { return ( ) })}
) } useMouseHover( ref, () => { setExpand(true) }, () => { setExpand(false) } ) return (
{expand && renderMenu()}
) }) Selector.displayName = 'Selector'