UNPKG

@primer/components

Version:
62 lines (55 loc) 2.13 kB
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } import React, { useCallback, useContext } from 'react'; import { useAnchoredPosition } from '../hooks'; import Overlay from '../Overlay'; import { AutocompleteContext } from './AutocompleteContext'; import { useCombinedRefs } from '../hooks/useCombinedRefs'; // TODO: consider making 'aria-labelledby' required function AutocompleteOverlay({ menuAnchorRef, overlayProps, children }) { const autocompleteContext = useContext(AutocompleteContext); if (autocompleteContext === null) { throw new Error('AutocompleteContext returned null values'); } const { inputRef, scrollContainerRef, selectedItemLength, setShowMenu, showMenu = false } = autocompleteContext; const { floatingElementRef, position } = useAnchoredPosition({ side: 'outside-bottom', align: 'start', anchorElementRef: menuAnchorRef ? menuAnchorRef : inputRef }, [showMenu, selectedItemLength]); const combinedOverlayRef = useCombinedRefs(scrollContainerRef, floatingElementRef); const closeOptionList = useCallback(() => { setShowMenu(false); }, [setShowMenu]); if (typeof window === 'undefined') { return null; } return /*#__PURE__*/React.createElement(Overlay, _extends({ returnFocusRef: inputRef, preventFocusOnOpen: true, onClickOutside: closeOptionList, onEscape: closeOptionList, ref: combinedOverlayRef, top: position === null || position === void 0 ? void 0 : position.top, left: position === null || position === void 0 ? void 0 : position.left, visibility: showMenu ? 'visible' : 'hidden', sx: { overflow: 'auto' } }, overlayProps), children); } AutocompleteOverlay.displayName = "AutocompleteOverlay"; AutocompleteOverlay.displayName = 'AutocompleteOverlay'; export default AutocompleteOverlay;