import React, { useEffect, useMemo, useState } from 'react' import Tooltip, { TooltipProps, TooltipTypes } from '../tooltip/tooltip' import useClasses from '../use-classes' import useScale, { withScale } from '../use-scale' import { getReactNode } from '../utils/collections' import { Placement, TriggerTypes } from '../utils/prop-types' import { PopoverConfig, PopoverContext } from './popover-context' export type PopoverTriggerTypes = TriggerTypes export type PopoverPlacement = Placement interface Props { content?: React.ReactNode | (() => React.ReactNode) trigger?: PopoverTriggerTypes placement?: Placement disableItemsAutoClose?: boolean } const defaultProps = { disableItemsAutoClose: false, trigger: 'click' as PopoverTriggerTypes, placement: 'bottom' as Placement, portalClassName: '', initialVisible: false, hideArrow: false, type: 'default' as TooltipTypes, enterDelay: 100, leaveDelay: 150, offset: 12, className: '', onVisibleChange: () => { return } } type ExcludeTooltipProps = { type: any text: any trigger: any placement: any } export type PopoverProps = Props & Omit const PopoverComponent: React.FC> = ({ content, children, trigger, placement, initialVisible, portalClassName, disableItemsAutoClose, onVisibleChange, visible: customVisible, ...props }) => { const { SCALES } = useScale() const [visible, setVisible] = useState(!!initialVisible) const textNode = useMemo(() => getReactNode(content), [content]) const onChildClick = () => { onPopoverVisibleChange(false) } const value = useMemo( () => ({ onItemClick: onChildClick, disableItemsAutoClose: !!disableItemsAutoClose }), [disableItemsAutoClose] ) const classes = useClasses('popover', portalClassName) const onPopoverVisibleChange = (next: boolean) => { setVisible(next) onVisibleChange && onVisibleChange(next) } useEffect(() => { if (customVisible === undefined) return onPopoverVisibleChange(customVisible) }, [customVisible]) return ( {children} ) } PopoverComponent.defaultProps = defaultProps PopoverComponent.displayName = 'HuiPopover' const Popover = withScale(PopoverComponent) export default Popover