import React, { useEffect, useCallback, useLayoutEffect, useState } from "react"; import ReactDOM from "react-dom"; function handleTouchMove(e) { e.preventDefault(); } function Overlay({ shouldAnimate, closeModal, children }) { const [mounted, setMounted] = useState(); useLayoutEffect(() => { const timeout = setTimeout(() => { setMounted(true); }); const bodyOverflow = document.body.style.overflow; document.body.style.overflow = "hidden"; return () => { document.body.style.overflow = bodyOverflow; if (timeout != null) { clearTimeout(timeout); } }; }, []); const handleClick = useCallback( e => { if (e.target === e.currentTarget) { closeModal(); } }, [closeModal] ); const handleKeyDown = useCallback( e => { // Esc if (e.keyCode === 27) { closeModal(); } }, [closeModal] ); useEffect(() => { window.document.addEventListener("keydown", handleKeyDown); window.document.addEventListener("touchmove", handleTouchMove); return () => { window.document.removeEventListener("keydown", handleKeyDown); window.document.removeEventListener("touchmove", handleTouchMove); }; }, [handleKeyDown]); return ReactDOM.createPortal(
{ closeModal(); e.preventDefault(); }} aria-label="Close Modal" style={{ color: "#a7a394", position: "fixed", top: 10, right: 10, padding: 0, fontSize: 50, lineHeight: "25px", textDecoration: "none" }} > × {children}
, window.document.body ); } export default Overlay;