import { useDocumentRect } from '@/Hooks/useDocumentRect' import { useAutoElementRect } from '@/Hooks/useElementRect' import { classNames } from '@standardnotes/utils' import { useCallback, useLayoutEffect, 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 { usePopoverCloseOnClickOutside } from './Utils/usePopoverCloseOnClickOutside' import { useDisableBodyScrollOnMobile } from '@/Hooks/useDisableBodyScrollOnMobile' import { MediaQueryBreakpoints, useMediaQuery } from '@/Hooks/useMediaQuery' const PositionedPopoverContent = ({ align = 'end', anchorElement, anchorPoint, children, childPopovers, className, id, overrideZIndex, side = 'bottom', togglePopover, disableClickOutside, disableMobileFullscreenTakeover, maxHeight, }: 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 isDesktopScreen = useMediaQuery(MediaQueryBreakpoints.md) const styles = getPositionedPopoverStyles({ align, anchorRect, documentRect, popoverRect: popoverRect ?? popoverElement?.getBoundingClientRect(), side, disableMobileFullscreenTakeover: disableMobileFullscreenTakeover, maxHeightFunction: maxHeight, }) usePopoverCloseOnClickOutside({ popoverElement, anchorElement, togglePopover, childPopovers, disabled: disableClickOutside, }) useDisableBodyScrollOnMobile() const correctInitialScrollForOverflowedContent = useCallback(() => { if (popoverElement) { setTimeout(() => { popoverElement.scrollTop = 0 }, 10) } }, [popoverElement]) useLayoutEffect(() => { correctInitialScrollForOverflowedContent() }, [popoverElement, correctInitialScrollForOverflowedContent]) return (
{children}
) } export default PositionedPopoverContent