|
@@ -1,6 +1,6 @@
|
|
import "./Modal.scss";
|
|
import "./Modal.scss";
|
|
|
|
|
|
-import React, { useEffect, useState } from "react";
|
|
|
|
|
|
+import React, { useState, useLayoutEffect } from "react";
|
|
import { createPortal } from "react-dom";
|
|
import { createPortal } from "react-dom";
|
|
import { KEYS } from "../keys";
|
|
import { KEYS } from "../keys";
|
|
|
|
|
|
@@ -13,12 +13,17 @@ export const Modal = (props: {
|
|
}) => {
|
|
}) => {
|
|
const modalRoot = useBodyRoot();
|
|
const modalRoot = useBodyRoot();
|
|
|
|
|
|
|
|
+ if (!modalRoot) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
const handleKeydown = (event: React.KeyboardEvent) => {
|
|
const handleKeydown = (event: React.KeyboardEvent) => {
|
|
if (event.key === KEYS.ESCAPE) {
|
|
if (event.key === KEYS.ESCAPE) {
|
|
event.nativeEvent.stopImmediatePropagation();
|
|
event.nativeEvent.stopImmediatePropagation();
|
|
props.onCloseRequest();
|
|
props.onCloseRequest();
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
+
|
|
return createPortal(
|
|
return createPortal(
|
|
<div
|
|
<div
|
|
className={`Modal ${props.className ?? ""}`}
|
|
className={`Modal ${props.className ?? ""}`}
|
|
@@ -46,7 +51,9 @@ export const Modal = (props: {
|
|
};
|
|
};
|
|
|
|
|
|
const useBodyRoot = () => {
|
|
const useBodyRoot = () => {
|
|
- const createDiv = () => {
|
|
|
|
|
|
+ const [div, setDiv] = useState<HTMLDivElement | null>(null);
|
|
|
|
+
|
|
|
|
+ useLayoutEffect(() => {
|
|
const isDarkTheme = !!document
|
|
const isDarkTheme = !!document
|
|
.querySelector(".excalidraw")
|
|
.querySelector(".excalidraw")
|
|
?.classList.contains("Appearance_dark");
|
|
?.classList.contains("Appearance_dark");
|
|
@@ -59,13 +66,13 @@ const useBodyRoot = () => {
|
|
div.classList.add("Appearance_dark-background-none");
|
|
div.classList.add("Appearance_dark-background-none");
|
|
}
|
|
}
|
|
document.body.appendChild(div);
|
|
document.body.appendChild(div);
|
|
- return div;
|
|
|
|
- };
|
|
|
|
- const [div] = useState(createDiv);
|
|
|
|
- useEffect(() => {
|
|
|
|
|
|
+
|
|
|
|
+ setDiv(div);
|
|
|
|
+
|
|
return () => {
|
|
return () => {
|
|
document.body.removeChild(div);
|
|
document.body.removeChild(div);
|
|
};
|
|
};
|
|
- }, [div]);
|
|
|
|
|
|
+ }, []);
|
|
|
|
+
|
|
return div;
|
|
return div;
|
|
};
|
|
};
|