/** * Copyright (c) Facebook, Inc. and its 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 React from 'react'; import ReactDOM from 'react-dom'; import {Element} from './ElementsInspector'; import styled from '@emotion/styled'; export function VisualizerPortal(props: { container: HTMLElement; highlightedElement: string | null; elements: {[key: string]: Element}; screenshotURL: string; screenDimensions: {width: number; height: number}; }) { const element: Element | null | '' = props.highlightedElement && props.elements[props.highlightedElement]; const position = element && typeof element.data.View?.positionOnScreenX == 'number' && typeof element.data.View?.positionOnScreenY == 'number' && typeof element.data.View.width === 'object' && element.data.View.width.value != null && typeof element.data.View.height === 'object' && element.data.View.height.value != null ? { x: element.data.View.positionOnScreenX, y: element.data.View.positionOnScreenY, width: element.data.View.width.value, height: element.data.View.height.value, } : null; return ReactDOM.createPortal( , props.container, ); } const VisualizerContainer = styled.div({ position: 'relative', top: 0, left: 0, width: '100%', height: '100%', userSelect: 'none', }); const DeviceImage = styled.img<{ width?: number | string; height?: number | string; }>(({width, height}) => ({ width, height, userSelect: 'none', })); /** * Component that displays a static picture of a device * and renders "highlighted" rectangles over arbitrary points on it. * Used for emulating the layout plugin when a device isn't connected. */ function Visualizer(props: { screenDimensions: {width: number; height: number}; element: {x: number; y: number; width: number; height: number} | null; imageURL: string; }) { const containerRef: React.Ref = React.createRef(); const imageRef: React.Ref = React.createRef(); let w: number = 0; let h: number = 0; const [scale, updateScale] = React.useState(1); React.useLayoutEffect(() => { w = containerRef.current?.offsetWidth || 0; h = containerRef.current?.offsetHeight || 0; const xScale = props.screenDimensions.width / w; const yScale = props.screenDimensions.height / h; updateScale(Math.max(xScale, yScale)); imageRef.current?.setAttribute('draggable', 'false'); }); return ( {props.element && (
)}
); }