import { Component } from 'react'; import { findDOMNode } from 'react-dom'; import Context, { IPopoverContext } from './Context'; export type PopoverAnchorGetElementFn = ( node: Element | Text | null ) => Element | Text | null; export interface IPopoverAnchorProps { onClick?: () => void; /** * Anchor on some internal node. * * e.g. Always anchor in the node when using with prefix/suffix */ getElement?: PopoverAnchorGetElementFn; } export class PopoverAnchor extends Component { static contextType = Context; declare context: IPopoverContext; getElement() { const { getElement } = this.props; const node = findDOMNode(this); return getElement ? getElement(node) : node; } componentDidMount() { this.context.popover.getAnchor = () => this.getElement(); } componentWillUnmount() { this.context.popover.getAnchor = null; } render() { if (process.env.NODE_ENV !== 'production') { if (!this.props.children) { throw new Error('Popover Anchor requires a child'); } } return this.props.children; } } export default PopoverAnchor;