47cbb5b6fb
* refactor device to editor interface and derive styles panel * allow host app to control form factor and ui mode * add editor interface event listener * put new props inside UIOptions * refactor: move related apis into one file * expose getFormFactor * privatize the setting of desktop mode and fix snapshots * refactor and fix test * remove unimplemented code * export getFormFactor() * replace `getFormFactor` with `getEditorInterface` * remove dead & useless * comment * fix ts --------- Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import { useState, useLayoutEffect } from "react";
|
|
|
|
import { THEME } from "@excalidraw/common";
|
|
|
|
import { useEditorInterface, useExcalidrawContainer } from "../components/App";
|
|
import { useUIAppState } from "../context/ui-appState";
|
|
|
|
export const useCreatePortalContainer = (opts?: {
|
|
className?: string;
|
|
parentSelector?: string;
|
|
}) => {
|
|
const [div, setDiv] = useState<HTMLDivElement | null>(null);
|
|
|
|
const editorInterface = useEditorInterface();
|
|
const { theme } = useUIAppState();
|
|
|
|
const { container: excalidrawContainer } = useExcalidrawContainer();
|
|
|
|
useLayoutEffect(() => {
|
|
if (div) {
|
|
div.className = "";
|
|
div.classList.add("excalidraw", ...(opts?.className?.split(/\s+/) || []));
|
|
div.classList.toggle(
|
|
"excalidraw--mobile",
|
|
editorInterface.formFactor === "phone",
|
|
);
|
|
div.classList.toggle("theme--dark", theme === THEME.DARK);
|
|
}
|
|
}, [div, theme, editorInterface.formFactor, opts?.className]);
|
|
|
|
useLayoutEffect(() => {
|
|
const container = opts?.parentSelector
|
|
? excalidrawContainer?.querySelector(opts.parentSelector)
|
|
: document.body;
|
|
|
|
if (!container) {
|
|
return;
|
|
}
|
|
|
|
const div = document.createElement("div");
|
|
|
|
container.appendChild(div);
|
|
|
|
setDiv(div);
|
|
|
|
return () => {
|
|
container.removeChild(div);
|
|
};
|
|
}, [excalidrawContainer, opts?.parentSelector]);
|
|
|
|
return div;
|
|
};
|