desktop/plugins/public/reactdevtools/DevToolsEmbedder.tsx (48 lines of code) (raw):
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {useEffect} from 'react';
// TODO: build abstraction of this: T62306732
const TARGET_CONTAINER_ID = 'flipper-out-of-contents-container'; // should be a hook in the future
export function DevToolsEmbedder({
offset,
nodeId,
}: {
offset: number;
nodeId: string;
}) {
useEffect(() => {
attachDevTools(createDevToolsNode(nodeId), offset);
return () => {
detachDevTools(findDevToolsNode(nodeId));
};
}, [offset, nodeId]);
return null;
}
function createDevToolsNode(nodeId: string): HTMLElement {
const existing = findDevToolsNode(nodeId);
if (existing) {
return existing;
}
const wrapper = document.createElement('div');
wrapper.id = nodeId;
wrapper.style.height = '100%';
wrapper.style.width = '100%';
document.getElementById(TARGET_CONTAINER_ID)!.appendChild(wrapper);
return wrapper;
}
function findDevToolsNode(nodeId: string): HTMLElement | null {
return document.querySelector('#' + nodeId);
}
function attachDevTools(devToolsNode: HTMLElement, offset: number = 0) {
devToolsNode.style.display = 'block';
const container = document.getElementById(TARGET_CONTAINER_ID)!;
container.style.display = 'block';
container.parentElement!.style.display = 'block';
container.parentElement!.style.height = `calc(100% - ${offset}px)`;
container.parentElement!.style.marginTop = '0px';
}
function detachDevTools(devToolsNode: HTMLElement | null) {
document.getElementById(TARGET_CONTAINER_ID)!.style.display = 'none';
document.getElementById(TARGET_CONTAINER_ID)!.parentElement!.style.display =
'none';
if (devToolsNode) {
devToolsNode.style.display = 'none';
}
}