import classNames from 'classnames'; import * as React from 'react'; import { ConfigContext } from '../config-provider'; import type { AbstractTooltipProps } from '../tooltip'; import Tooltip from '../tooltip'; import type { RenderFunction } from '../_util/getRenderPropValue'; import { getRenderPropValue } from '../_util/getRenderPropValue'; import { getTransitionName } from '../_util/motion'; import PurePanel from './PurePanel'; // CSSINJS import useStyle from './style'; export interface PopoverProps extends AbstractTooltipProps { title?: React.ReactNode | RenderFunction; content?: React.ReactNode | RenderFunction; } interface OverlayPorps { prefixCls?: string; title?: PopoverProps['title']; content?: PopoverProps['content']; } const Overlay: React.FC = ({ title, content, prefixCls }) => { if (!title && !content) { return null; } return ( <> {title &&
{getRenderPropValue(title)}
}
{getRenderPropValue(content)}
); }; const Popover = React.forwardRef((props, ref) => { const { prefixCls: customizePrefixCls, title, content, overlayClassName, placement = 'top', trigger = 'hover', mouseEnterDelay = 0.1, mouseLeaveDelay = 0.1, overlayStyle = {}, arrowPointAtCenter, arrow, ...otherProps } = props; const { getPrefixCls } = React.useContext(ConfigContext); const prefixCls = getPrefixCls('popover', customizePrefixCls); const [wrapSSR, hashId] = useStyle(prefixCls); const rootPrefixCls = getPrefixCls(); const overlayCls = classNames(overlayClassName, hashId); const mergedArrowPointAtCenter = (typeof arrow !== 'boolean' && arrow?.arrowPointAtCenter) ?? arrowPointAtCenter ?? false; const mergedArrow = arrow ?? { arrowPointAtCenter: mergedArrowPointAtCenter }; return wrapSSR( } transitionName={getTransitionName(rootPrefixCls, 'zoom-big', otherProps.transitionName)} data-popover-inject />, ); }) as React.ForwardRefExoticComponent< React.PropsWithoutRef & React.RefAttributes > & { _InternalPanelDoNotUseOrYouWillBeFired: typeof PurePanel; }; if (process.env.NODE_ENV !== 'production') { Popover.displayName = 'Popover'; } Popover._InternalPanelDoNotUseOrYouWillBeFired = PurePanel; export default Popover;