UNPKG

@trap_stevo/legendarybuilderproreact-ui

Version:

The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton

72 lines 1.9 kB
import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import React, { useLayoutEffect, useRef, useState } from "react"; import { createPortal } from "react-dom"; var registryKey = "__HUD_PORTAL_REGISTRY__"; function getRegistry() { if (typeof window === "undefined") return null; if (!window[registryKey]) { window[registryKey] = new Map(); } return window[registryKey]; } ; function HUDPortal(_ref) { var _ref$id = _ref.id, id = _ref$id === void 0 ? "hud-portal-root" : _ref$id, container = _ref.container, children = _ref.children; var _useState = useState(null), _useState2 = _slicedToArray(_useState, 2), host = _useState2[0], setHost = _useState2[1]; useLayoutEffect(function () { if (typeof document === "undefined") { return; } if (container instanceof Element) { setHost(container); return function () {}; } var registry = getRegistry(); if (!registry) { return; } var entry = registry.get(id); if (entry && entry.el && document.contains(entry.el)) { entry.count += 1; setHost(entry.el); } else { var el = document.createElement("div"); el.id = id; el.style.position = "relative"; document.body.appendChild(el); entry = { el: el, count: 1, createdFromOrigin: true }; registry.set(id, entry); setHost(el); } return function () { var reg = getRegistry(); var e = reg && reg.get(id); if (!e) { return; } e.count -= 1; if (e.count <= 0) { if (e.createdFromOrigin && e.el && e.el.parentNode) { e.el.parentNode.removeChild(e.el); } reg["delete"](id); } }; }, [id, container]); if (!host) { return null; } return /*#__PURE__*/createPortal(children, host); } ; export default HUDPortal;