@braineet/ui
Version:
Braineet design system
36 lines • 1.13 kB
JavaScript
/* eslint-disable no-param-reassign */
import { useState, forwardRef, useLayoutEffect, useEffect } from 'react';
import { createPortal } from 'react-dom';
var useEnhancedEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
var setRef = function setRef(ref, value) {
if (typeof ref === 'function') {
ref(value);
} else if (ref) {
ref.current = value;
}
};
var Portal = /*#__PURE__*/forwardRef(function (_ref, ref) {
var children = _ref.children,
container = _ref.container;
var _useState = useState(null),
mountNode = _useState[0],
setMountNode = _useState[1];
useEnhancedEffect(function () {
setMountNode(container && container.current ? container.current : document.body);
}, [container]);
useEnhancedEffect(function () {
if (mountNode) {
setRef(ref, mountNode);
return function () {
setRef(ref, null);
};
}
return undefined;
}, [ref, mountNode]);
return mountNode ? /*#__PURE__*/createPortal(children, mountNode) : mountNode;
});
Portal.defaultProps = {
container: null
};
Portal.displayName = 'Portal';
export default Portal;