import React from "react"; import { DevtoolsPin } from "./components/devtools-pin"; import { ResizablePane } from "./components/resizable-pane"; import { DevToolsContext, DevtoolsEvent, send, } from "@refinedev/devtools-shared"; import type { Placement } from "./interfaces/placement"; const MAX_IFRAME_WAIT_TIME = 1500; export const DevtoolsPanel = __DEV_CONDITION__ !== "development" ? () => null : () => { const [browser, setBrowser] = React.useState(false); const [visible, setVisible] = React.useState(false); const [placement] = React.useState("bottom"); const { httpUrl, ws } = React.useContext(DevToolsContext); const [width, setWidth] = React.useState(0); const [selectorActive, setSelectorActive] = React.useState(false); const [iframeStatus, setIframeStatus] = React.useState< "loading" | "loaded" | "failed" >("loading"); const onSelectorHighlight = React.useCallback( (name: string) => { if (ws) { send(ws, DevtoolsEvent.DEVTOOLS_HIGHLIGHT_IN_MONITOR, { name, }); } setVisible(true); }, [ws], ); React.useEffect(() => { if (selectorActive) { setVisible(false); } }, [selectorActive]); React.useEffect(() => { if (typeof window !== "undefined") { setBrowser(true); } }, []); React.useEffect(() => { if (browser) { // set width by window size dynamically setWidth(window.innerWidth); const onResize = () => { setWidth(window.innerWidth); }; window.addEventListener("resize", onResize); return () => { window.removeEventListener("resize", onResize); }; } return () => undefined; }, [browser]); React.useEffect(() => { if (iframeStatus !== "loaded") { const onMessage = (event: MessageEvent) => { if (event.data.type === "refine-devtools-iframe-loaded") { setIframeStatus("loaded"); } }; window.addEventListener("message", onMessage); return () => { window.removeEventListener("message", onMessage); }; } return () => 0; }, []); React.useEffect(() => { let timeout: number; if (iframeStatus === "loading") { timeout = window.setTimeout(() => { setIframeStatus("failed"); if (timeout) { clearInterval(timeout); } }, MAX_IFRAME_WAIT_TIME); } return () => { if (typeof timeout !== "undefined") { clearInterval(timeout); } }; }, [iframeStatus]); if (!browser) { return null; } return (
{ setVisible((v) => !v); setSelectorActive(false); }} onSelectorHighlight={onSelectorHighlight} selectorActive={selectorActive} setSelectorActive={setSelectorActive} /> {({ resizing }) => (