UNPKG

rsuite

Version:

A suite of react components

55 lines (47 loc) 1.75 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import React, { useRef, useEffect, useState, useCallback } from 'react'; import { createPortal } from 'react-dom'; import canUseDOM from 'dom-lib/canUseDOM'; var MountedPortal = /*#__PURE__*/React.memo(function (_ref) { var children = _ref.children, container = _ref.container; var _useState = useState(false), mounted = _useState[0], setMounted = _useState[1]; useEffect(function () { return setMounted(true); }, []); if (container && mounted) { return /*#__PURE__*/createPortal(children, container); } return null; }); function usePortal(props) { if (props === void 0) { props = {}; } var _props = props, container = _props.container, _props$waitMount = _props.waitMount, waitMount = _props$waitMount === void 0 ? false : _props$waitMount; var rootElemRef = useRef(canUseDOM ? document.body : null); useEffect(function () { var containerElement = typeof container === 'function' ? container() : container; // Parent is either a new root or the existing dom element var parentElement = containerElement || document.body; rootElemRef.current = parentElement; }, [rootElemRef, container]); var Portal = useCallback(function (_ref2) { var children = _ref2.children; return rootElemRef.current != null ? /*#__PURE__*/createPortal(children, rootElemRef.current) : null; }, []); var WaitMountPortal = useCallback(function (props) { return /*#__PURE__*/React.createElement(MountedPortal, _extends({ container: rootElemRef.current }, props)); }, []); return { target: rootElemRef.current, Portal: waitMount ? WaitMountPortal : Portal }; } export default usePortal;