UNPKG

@atlaskit/popper

Version:

A wrapper for React Popper for situations which require a bespoke popup where other ADS components are deemed unsuitable

78 lines (75 loc) 3 kB
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import React, { useMemo } from 'react'; import { Popper as ReactPopper } from 'react-popper'; import { getMaxSizeModifiers } from './max-size'; export { placements } from '@popperjs/core'; // Export types from PopperJS / React Popper var viewportPadding = 5; var constantModifiers = [{ name: 'flip', options: { flipVariations: false, padding: viewportPadding, boundary: 'clippingParents', rootBoundary: 'viewport' } }]; function defaultChildrenFn() { return null; } var defaultOffset = [0, 8]; export function Popper(_ref) { var _ref$children = _ref.children, children = _ref$children === void 0 ? defaultChildrenFn : _ref$children, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? defaultOffset : _ref$offset, _ref$placement = _ref.placement, placement = _ref$placement === void 0 ? 'bottom-start' : _ref$placement, _ref$referenceElement = _ref.referenceElement, referenceElement = _ref$referenceElement === void 0 ? undefined : _ref$referenceElement, modifiers = _ref.modifiers, _ref$strategy = _ref.strategy, strategy = _ref$strategy === void 0 ? 'fixed' : _ref$strategy, _ref$shouldFitViewpor = _ref.shouldFitViewport, shouldFitViewport = _ref$shouldFitViewpor === void 0 ? false : _ref$shouldFitViewpor; var _offset = _slicedToArray(offset, 2), offsetX = _offset[0], offsetY = _offset[1]; var internalModifiers = useMemo(function () { var preventOverflowModifier = { name: 'preventOverflow', options: { padding: viewportPadding, rootBoundary: shouldFitViewport ? 'viewport' : 'document' } }; var offsetModifier = { name: 'offset', options: { offset: [offsetX, offsetY] } }; var maxSizeModifiers = shouldFitViewport ? getMaxSizeModifiers({ viewportPadding: viewportPadding }) : []; // @ts-ignore Type errors from incompatible @popperjs/core versions between Jira and AFM Platform... we are using ts-ignore here because ts-expect-error will cause an "Unused '@ts-expect-error' directive." error return [].concat(constantModifiers, [preventOverflowModifier, offsetModifier], _toConsumableArray(maxSizeModifiers)); }, [offsetX, offsetY, shouldFitViewport]); // Merge custom props and memoize var mergedModifiers = useMemo(function () { if (modifiers == null) { return internalModifiers; } return [].concat(_toConsumableArray(internalModifiers), _toConsumableArray(modifiers)); }, [internalModifiers, modifiers]); return /*#__PURE__*/React.createElement(ReactPopper // @ts-expect-error - No overload matches this call // This error was introduced after upgrading to TypeScript 5 , { modifiers: mergedModifiers, placement: placement, strategy: strategy, referenceElement: referenceElement }, children); }