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