UNPKG

react-super

Version:
107 lines (100 loc) 5.36 kB
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import * as React from 'react'; import { createPortal } from 'react-dom'; import canUseDom from 'rc-util/lib/Dom/canUseDom'; import { supportRef, useComposeRef } from 'rc-util/lib/ref'; import OrderContext from "./Context"; import useDom from "./useDom"; import useScrollLocker from "./useScrollLocker"; import { inlineMock } from "./mock"; import { jsx as _jsx } from "react/jsx-runtime"; var getPortalContainer = function getPortalContainer(getContainer) { if (getContainer === false) { return false; } if (!canUseDom() || !getContainer) { return null; } if (typeof getContainer === 'string') { return document.querySelector(getContainer); } if (typeof getContainer === 'function') { return getContainer(); } return getContainer; }; var Portal = /*#__PURE__*/React.forwardRef(function (props, ref) { var open = props.open, autoLock = props.autoLock, getContainer = props.getContainer, debug = props.debug, _props$autoDestroy = props.autoDestroy, autoDestroy = _props$autoDestroy === void 0 ? true : _props$autoDestroy, children = props.children; var _React$useState = React.useState(open), _React$useState2 = _slicedToArray(_React$useState, 2), shouldRender = _React$useState2[0], setShouldRender = _React$useState2[1]; var mergedRender = shouldRender || open; // ====================== Should Render ====================== React.useEffect(function () { if (autoDestroy || open) { setShouldRender(open); } }, [open, autoDestroy]); // ======================== Container ======================== var _React$useState3 = React.useState(function () { return getPortalContainer(getContainer); }), _React$useState4 = _slicedToArray(_React$useState3, 2), innerContainer = _React$useState4[0], setInnerContainer = _React$useState4[1]; React.useEffect(function () { var customizeContainer = getPortalContainer(getContainer); // Tell component that we check this in effect which is safe to be `null` setInnerContainer(customizeContainer !== null && customizeContainer !== void 0 ? customizeContainer : null); }); var _useDom = useDom(mergedRender && !innerContainer, debug), _useDom2 = _slicedToArray(_useDom, 2), defaultContainer = _useDom2[0], queueCreate = _useDom2[1]; var mergedContainer = innerContainer !== null && innerContainer !== void 0 ? innerContainer : defaultContainer; // ========================= Locker ========================== // if (autoLock) { useScrollLocker(autoLock && open && canUseDom() && (mergedContainer === (innerContainer ? innerContainer : defaultContainer) || mergedContainer === document.body)); // } // =========================== Ref =========================== var childRef = null; if (children && supportRef(children) && ref) { var _ref = children; childRef = _ref.ref; } var mergedRef = useComposeRef(childRef, ref); // ========================= Render ========================== // Do not render when nothing need render // When innerContainer is `undefined`, it may not ready since user use ref in the same render if (!mergedRender || !canUseDom() || innerContainer === undefined) { return null; } // Render inline var renderInline = mergedContainer === false || inlineMock(); var reffedChildren = children; if (ref) { reffedChildren = /*#__PURE__*/React.cloneElement(children, { ref: mergedRef }); } return /*#__PURE__*/_jsx(OrderContext.Provider, { value: queueCreate, children: renderInline ? reffedChildren : /*#__PURE__*/createPortal(reffedChildren, mergedContainer) }); }); if (process.env.NODE_ENV !== 'production') { Portal.displayName = 'Portal'; } export default Portal;