import React, { CSSProperties, ReactNode, useCallback, useMemo } from "react"; import { BaseStyle } from "widgets/BaseWidget"; import { WIDGET_PADDING } from "constants/WidgetConstants"; import { generateClassName } from "utils/generators"; import styled from "styled-components"; import { useClickOpenPropPane } from "utils/hooks/useClickOpenPropPane"; import { Layers } from "constants/Layers"; import { useSelector } from "react-redux"; import { snipingModeSelector } from "../../../selectors/editorSelectors"; const PositionedWidget = styled.div` &:hover { z-index: ${Layers.positionedWidget + 1} !important; } `; type PositionedContainerProps = { style: BaseStyle; children: ReactNode; widgetId: string; widgetType: string; selected?: boolean; focused?: boolean; resizeDisabled?: boolean; }; export function PositionedContainer(props: PositionedContainerProps) { const x = props.style.xPosition + (props.style.xPositionUnit || "px"); const y = props.style.yPosition + (props.style.yPositionUnit || "px"); const padding = WIDGET_PADDING; const openPropertyPane = useClickOpenPropPane(); const isSnipingMode = useSelector(snipingModeSelector); // memoized classname const containerClassName = useMemo(() => { return ( generateClassName(props.widgetId) + " positioned-widget " + `t--widget-${props.widgetType .split("_") .join("") .toLowerCase()}` ); }, [props.widgetType, props.widgetId]); const containerStyle: CSSProperties = useMemo(() => { return { position: "absolute", left: x, top: y, height: props.style.componentHeight + (props.style.heightUnit || "px"), width: props.style.componentWidth + (props.style.widthUnit || "px"), padding: padding + "px", zIndex: props.selected || props.focused ? Layers.selectedWidget : Layers.positionedWidget, backgroundColor: "inherit", }; }, [props.style]); const openPropPane = useCallback( (e) => { openPropertyPane(e, props.widgetId); }, [props.widgetId, openPropertyPane], ); // TODO: Experimental fix for sniping mode. This should be handled with a single event const stopEventPropagation = (e: any) => { !isSnipingMode && e.stopPropagation(); }; return ( {props.children} ); } PositionedContainer.padding = WIDGET_PADDING; export default PositionedContainer;