@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
JavaScript
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);
}