don't touch DOM outside useEffect (#2215)

pull/2251/head
David Luzar 4 years ago committed by GitHub
parent b3263c2a69
commit 25d460be96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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…
Cancel
Save