UNPKG

@fluentui/react-northstar

Version:
56 lines (52 loc) 2.9 kB
"use strict"; exports.__esModule = true; exports.usePortalBox = void 0; var _reactBindings = require("@fluentui/react-bindings"); var React = _interopRequireWildcard(require("react")); var _isBrowser = require("../../utils/isBrowser"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var usePortalBox = function usePortalBox(options) { var className = options.className, rtl = options.rtl, target = options.target; var element = React.useMemo(function () { var newElement = (0, _isBrowser.isBrowser)() && target ? target.createElement('div') : null; // Element should be attached to DOM during render to make elements that will be rendered // inside accessible in effects of child components if (newElement) { target.body.appendChild(newElement); } return newElement; }, [target]); (0, _reactBindings.useIsomorphicLayoutEffect)(function () { var classes = className.split(' ').filter(Boolean); if (element) { var _element$classList; (_element$classList = element.classList).add.apply(_element$classList, classes); if (rtl) { element.setAttribute('dir', 'rtl'); } else { element.removeAttribute('dir'); } } return function () { if (element) { var _element$classList2; (_element$classList2 = element.classList).remove.apply(_element$classList2, classes); element.removeAttribute('dir'); } }; }, [className, element, rtl]); // This effect should always last as it removes element from HTML tree React.useEffect(function () { return function () { if (element) { target.body.removeChild(element); } }; }, [element, target]); return element; }; exports.usePortalBox = usePortalBox; //# sourceMappingURL=usePortalBox.js.map