import React, { use, FC, useEffect, useRef } 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: "modal-lg" | "modal-xl"; isUpper: boolean; toggleOpen: () => void; children: React.ReactNode; }> = ({ 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?: "modal-lg" | "modal-xl"; isOpen: boolean; isUpper?: boolean; toggleOpen: () => void; onExited?: () => void; children: React.ReactNode; }> = ({ size = "modal-lg", isOpen, isUpper = false, toggleOpen, onExited, children, }) => { const context = use(ThemeContext); const modalRef = useRef(null); const backdropRef = useRef(null); return ReactDOM.createPortal( <>
{children}
, document.body, ); }; export { Modal, ModalInner };