import React, { useLayoutEffect } from 'react' import classNames from 'classnames' import { DismissButton, Overlay, usePopover } from 'react-aria' import { useSingleSelectContext } from '../../context' import { type PopoverProps, type SelectItem } from '../../types' import { usePositioningStyles, useSupportsAnchorPositioning } from './utils' import styles from './Popover.module.css' export const Popover = ({ state, popoverRef, children, clearButtonRef, ...restProps }: PopoverProps): React.ReactElement => { const { anchorName } = useSingleSelectContext() const manualPopoverRef = React.useRef(null) const { popoverProps } = usePopover( { ...restProps, popoverRef, shouldCloseOnInteractOutside: (element) => { if (clearButtonRef?.current?.contains(element)) { return false } return true }, }, state, ) const supportsAnchorPositioning = useSupportsAnchorPositioning() const { popoverStyle, isPositioned, updatePosition } = usePositioningStyles( restProps.triggerRef as React.RefObject, manualPopoverRef, anchorName, ) useLayoutEffect(() => { if (!supportsAnchorPositioning || !state.isOpen) return updatePosition() const popover = manualPopoverRef?.current if (popover?.showPopover) { popover.showPopover() } return () => { if (popover?.hidePopover) { popover.hidePopover() } } }, [state.isOpen, supportsAnchorPositioning, updatePosition, isPositioned]) useLayoutEffect(() => { if (!supportsAnchorPositioning || state.isOpen) return const popover = manualPopoverRef?.current if (popover?.hidePopover) { popover.hidePopover() } }, [state.isOpen, supportsAnchorPositioning]) const manualPopover = (
{children}
) return ( <> {state.isOpen && (
{supportsAnchorPositioning ? manualPopover : children}
)} ) }