import React, { MouseEventHandler, PropsWithChildren, ReactNode, RefObject, useEffect, useRef, } from "react"; import styled from "styled-components"; import { generateClassName, getCanvasClassName } from "utils/generators"; import WidgetStyleContainer, { WidgetStyleContainerProps, } from "components/designSystems/appsmith/WidgetStyleContainer"; import tinycolor from "tinycolor2"; import { WidgetType } from "utils/WidgetFactory"; import { scrollCSS } from "widgets/WidgetUtils"; const StyledContainerComponent = styled.div< Omit >` height: 100%; width: 100%; overflow: hidden; ${(props) => (props.shouldScrollContents ? scrollCSS : ``)} opacity: ${(props) => (props.resizeDisabled ? "0.8" : "1")}; background: ${(props) => props.backgroundColor}; &:hover { background-color: ${(props) => { return props.onClickCapture && props.backgroundColor ? tinycolor(props.backgroundColor) .darken(5) .toString() : props.backgroundColor; }}; z-index: ${(props) => (props.onClickCapture ? "2" : "1")}; cursor: ${(props) => (props.onClickCapture ? "pointer" : "inherit")}; } `; interface ContainerWrapperProps { onClickCapture?: MouseEventHandler; resizeDisabled?: boolean; shouldScrollContents?: boolean; backgroundColor?: string; widgetId: string; type: WidgetType; } function ContainerComponentWrapper( props: PropsWithChildren, ) { const containerRef: RefObject = useRef(null); useEffect(() => { if (!props.shouldScrollContents) { const supportsNativeSmoothScroll = "scrollBehavior" in document.documentElement.style; if (supportsNativeSmoothScroll) { containerRef.current?.scrollTo({ top: 0, behavior: "smooth" }); } else { if (containerRef.current) { containerRef.current.scrollTop = 0; } } } }, [props.shouldScrollContents]); return ( {props.children} ); } function ContainerComponent(props: ContainerComponentProps) { if (props.detachFromLayout) { return ( {props.children} ); } return ( {props.children} ); } export type ContainerStyle = "border" | "card" | "rounded-border" | "none"; export interface ContainerComponentProps extends WidgetStyleContainerProps { children?: ReactNode; shouldScrollContents?: boolean; resizeDisabled?: boolean; detachFromLayout?: boolean; onClickCapture?: MouseEventHandler; backgroundColor?: string; type: WidgetType; noScroll?: boolean; } export default ContainerComponent;