import React, { useEffect, useState } from 'react'; import ReactDOM from 'react-dom'; import { canUseDOM } from '../../helpers/dom'; const createContainer = (zIndex: number): HTMLDivElement => { const container = document.createElement('div'); container.setAttribute('class', 'portal'); container.setAttribute('style', `z-index: ${zIndex};`); return container; }; type Props = { zIndex?: number; children: React.ReactNode; }; const Portal: React.FC = ({ zIndex = 0, children = '' }) => { const [container, setContainer] = useState( canUseDOM() ? createContainer(zIndex) : undefined, ); useEffect(() => { if (container) { document.body.appendChild(container); } else { const newContainer = createContainer(zIndex); setContainer(newContainer); } return (): void => { if (container) { document.body.removeChild(container); } }; }, []); return container ? ReactDOM.createPortal(children, container) : null; }; export default Portal;