import { useState, useCallback } from 'react'; import { observer } from 'mobx-react'; import { Edge } from '../types'; import DefaultRemoveConnector from '../components/DefaultRemoveConnector'; interface ElementProps { element: Edge; } export interface WithRemoveConnectorProps { onShowRemoveConnector?: () => void; onHideRemoveConnector?: () => void; } type RemoveRenderer = (edge: Edge, onRemove: (e: Edge) => void, size?: number) => React.ReactElement; const defaultRenderRemove: RemoveRenderer = (edge: Edge, onRemove: (e: Edge) => void) => { const removeEdge = () => { onRemove(edge); }; return ( ); }; export const withRemoveConnector =

( onRemove: (edge: Edge) => void, renderRemove: RemoveRenderer = defaultRenderRemove ) => (WrappedComponent: React.ComponentType

) => { const Component: React.FunctionComponent> = (props) => { const [show, setShow] = useState(false); const onShowRemoveConnector = useCallback(() => setShow(true), []); const onHideRemoveConnector = useCallback(() => setShow(false), []); return ( {show && renderRemove(props.element, onRemove)} ); }; Component.displayName = `withRemoveConnector(${WrappedComponent.displayName || WrappedComponent.name})`; return observer(Component); };