@atlaskit/popper
Version:
A wrapper for React Popper for situations which require a bespoke popup where other ADS components are deemed unsuitable
93 lines (89 loc) • 4.16 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Popper = Popper;
Object.defineProperty(exports, "placements", {
enumerable: true,
get: function get() {
return _core.placements;
}
});
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _reactPopper = require("react-popper");
var _maxSize = require("./max-size");
var _core = require("@popperjs/core");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
// 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];
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 = (0, _slicedToArray2.default)(offset, 2),
offsetX = _offset[0],
offsetY = _offset[1];
var internalModifiers = (0, _react.useMemo)(function () {
var preventOverflowModifier = {
name: 'preventOverflow',
options: {
padding: viewportPadding,
rootBoundary: shouldFitViewport ? 'viewport' : 'document'
}
};
var offsetModifier = {
name: 'offset',
options: {
offset: [offsetX, offsetY]
}
};
var maxSizeModifiers = shouldFitViewport ? (0, _maxSize.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], (0, _toConsumableArray2.default)(maxSizeModifiers));
}, [offsetX, offsetY, shouldFitViewport]);
// Merge custom props and memoize
var mergedModifiers = (0, _react.useMemo)(function () {
if (modifiers == null) {
return internalModifiers;
}
return [].concat((0, _toConsumableArray2.default)(internalModifiers), (0, _toConsumableArray2.default)(modifiers));
}, [internalModifiers, modifiers]);
return /*#__PURE__*/_react.default.createElement(_reactPopper.Popper
// @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);
}