import "./Modal.scss"; import React, { useState, useLayoutEffect } from "react"; import { createPortal } from "react-dom"; import clsx from "clsx"; import { KEYS } from "../keys"; export const Modal = (props: { className?: string; children: React.ReactNode; maxWidth?: number; onCloseRequest(): void; labelledBy: string; }) => { const modalRoot = useBodyRoot(); if (!modalRoot) { return null; } const handleKeydown = (event: React.KeyboardEvent) => { if (event.key === KEYS.ESCAPE) { event.nativeEvent.stopImmediatePropagation(); props.onCloseRequest(); } }; return createPortal(
{props.children}
, modalRoot, ); }; const useBodyRoot = () => { const [div, setDiv] = useState(null); useLayoutEffect(() => { const isDarkTheme = !!document .querySelector(".excalidraw") ?.classList.contains("theme--dark"); const div = document.createElement("div"); div.classList.add("excalidraw", "excalidraw-modal-container"); if (isDarkTheme) { div.classList.add("theme--dark"); div.classList.add("theme--dark-background-none"); } document.body.appendChild(div); setDiv(div); return () => { document.body.removeChild(div); }; }, []); return div; };