import React, { FC, useEffect } from "react"; import ReactDOM from "react-dom"; import { CSSTransition } from "react-transition-group"; import { disableBodyScroll, enableBodyScroll } from "body-scroll-lock"; import { useHotkeys } from "react-hotkeys-hook"; import { ThemeContext } from "Components/Theme"; const ModalInner: FC<{ size: "lg" | "xl"; isUpper: boolean; toggleOpen: () => void; }> = ({ size, isUpper, toggleOpen, children }) => { // needed for tests to spy on useRef const ref = React.useRef(null); useEffect(() => { if (ref.current !== null) { document.body.classList.add("modal-open"); disableBodyScroll(ref.current, { reserveScrollBarGap: true }); const modal = ref.current; return () => { if (!isUpper) document.body.classList.remove("modal-open"); enableBodyScroll(modal); }; } }, [isUpper]); useHotkeys("esc", toggleOpen); return (
{children}
); }; const Modal: FC<{ size?: "lg" | "xl"; isOpen: boolean; isUpper?: boolean; toggleOpen: () => void; onExited?: () => void; }> = ({ size = "lg", isOpen, isUpper = false, toggleOpen, onExited, children, }) => { const context = React.useContext(ThemeContext); return ReactDOM.createPortal( {children}
, document.body ); }; export { Modal, ModalInner };