import { useContext, useCallback, useEffect } from 'react'; import { runInAction } from 'mobx'; import { observer } from 'mobx-react'; import { isNode, Anchor, Node, AnchorEnd } from '../types'; import ElementContext from '../utils/ElementContext'; type AnchorConstructor = new (element?: Node) => Anchor; export const useAnchor = ( anchorCallback: ((element: Node) => Anchor | undefined) | AnchorConstructor, end: AnchorEnd = AnchorEnd.both, type?: string ): void => { const element = useContext(ElementContext); if (!isNode(element)) { throw new Error('useAnchor must be used within the scope of a Node'); } useEffect(() => { runInAction(() => { const anchor = anchorCallback.prototype ? new (anchorCallback as any)(element) : (anchorCallback as any)(element); if (anchor) { element.setAnchor(anchor, end, type); } }); }, [anchorCallback, element, end, type]); }; export const withAnchor =
(anchor: Anchor, end?: AnchorEnd, type?: string) => (WrappedComponent: React.ComponentType
) => { const Component: React.FunctionComponent
= (props) => {
useAnchor(
useCallback(() => anchor, []),
end,
type
);
return