import { useDocumentRect } from '@/Hooks/useDocumentRect' import { useAutoElementRect } from '@/Hooks/useElementRect' import { classNames } from '@/Utils/ConcatenateClassNames' import { useState } from 'react' import Icon from '../Icon/Icon' import Portal from '../Portal/Portal' import HorizontalSeparator from '../Shared/HorizontalSeparator' import { getPositionedPopoverStyles } from './GetPositionedPopoverStyles' import { PopoverContentProps } from './Types' import { getPopoverMaxHeight, getAppRect } from './Utils/Rect' import { usePopoverCloseOnClickOutside } from './Utils/usePopoverCloseOnClickOutside' const PositionedPopoverContent = ({ align = 'end', anchorElement, anchorPoint, children, childPopovers, className, id, overrideZIndex, side = 'bottom', togglePopover, }: PopoverContentProps) => { const [popoverElement, setPopoverElement] = useState(null) const popoverRect = useAutoElementRect(popoverElement) const anchorElementRect = useAutoElementRect(anchorElement, { updateOnWindowResize: true, }) const anchorPointRect = DOMRect.fromRect({ x: anchorPoint?.x, y: anchorPoint?.y, }) const anchorRect = anchorPoint ? anchorPointRect : anchorElementRect const documentRect = useDocumentRect() const [styles, positionedSide, positionedAlignment] = getPositionedPopoverStyles({ align, anchorRect, documentRect, popoverRect: popoverRect ?? popoverElement?.getBoundingClientRect(), side, }) usePopoverCloseOnClickOutside({ popoverElement, anchorElement, togglePopover, childPopovers, }) return (
{ setPopoverElement(node) }} data-popover={id} >
{children}
) } export default PositionedPopoverContent