don't touch DOM outside useEffect (#2215)
This commit is contained in:
parent
b3263c2a69
commit
25d460be96
@ -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;
|
|
||||||
};
|
setDiv(div);
|
||||||
const [div] = useState(createDiv);
|
|
||||||
useEffect(() => {
|
|
||||||
return () => {
|
return () => {
|
||||||
document.body.removeChild(div);
|
document.body.removeChild(div);
|
||||||
};
|
};
|
||||||
}, [div]);
|
}, []);
|
||||||
|
|
||||||
return div;
|
return div;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user