import React from "react"; import { createPortal } from "react-dom"; import { Popover } from "../popover"; import { styled, theme } from "../theme"; import { InputSearchContext } from "./InputSearchRoot"; const StyledContent = styled("div", { backgroundColor: theme.colors.background, borderTop: `1px solid ${theme.colors.gray300}`, color: theme.colors.primary, marginTop: "-1px", overflow: "hidden", }); export type InputSearchPopoverProps = React.ComponentPropsWithRef< typeof Popover.Content > & { portal?: boolean; portalDomNode?: HTMLElement }; export const InputSearchPopover = ({ css, children, portal = true, portalDomNode, ...rest }: InputSearchPopoverProps) => { const { popoverRef, state, containerRef, setUsePortal, setPortalDomNode } = React.useContext(InputSearchContext); const [key, setKey] = React.useState(0); React.useEffect(() => { setPortalDomNode(portalDomNode || document.body); // There is a race condition where the portalDomNode is not yet mounted // Force a re-render to ensure content is rendered setTimeout(() => { setKey((prev) => prev + 1); }, 30); }, [portalDomNode, setPortalDomNode, setKey]); React.useEffect(() => { setUsePortal(portal); }, [portal, setUsePortal]); if (!state.isOpen) return null; if (portal) { return ( { event.preventDefault(); }} css={{ width: "var(--radix-popper-anchor-width)", padding: 0, ...css, }} {...rest} > {children} ); } else { return createPortal( {children} , popoverRef.current as unknown as HTMLElement ); } }; InputSearchPopover.displayName = "InputSearchPopover";