import React, { ReactNode, useRef, useEffect, RefObject } from "react"; import styled, { css } from "styled-components"; import tinycolor from "tinycolor2"; import { invisible } from "constants/DefaultTheme"; import { Color } from "constants/Colors"; import { generateClassName, getCanvasClassName } from "utils/generators"; import WidgetStyleContainer, { WidgetStyleContainerProps, } from "components/designSystems/appsmith/WidgetStyleContainer"; import { pick } from "lodash"; import { ComponentProps } from "widgets/BaseComponent"; import { MAIN_CONTAINER_WIDGET_ID } from "constants/WidgetConstants"; const scrollContents = css` overflow-y: auto; `; const StyledContainerComponent = styled.div< ContainerComponentProps & { ref: RefObject; } >` height: 100%; width: 100%; background: ${(props) => props.backgroundColor}; opacity: ${(props) => (props.resizeDisabled ? "0.8" : "1")}; position: relative; ${(props) => (!props.isVisible ? invisible : "")}; box-shadow: ${(props) => props.selected ? "inset 0px 0px 0px 3px rgba(59,130,246,0.5)" : "none"}; border-radius: ${({ borderRadius }) => borderRadius}; ${(props) => props.shouldScrollContents === true ? scrollContents : props.shouldScrollContents === false ? css` overflow: hidden; ` : ""} &:hover { z-index: ${(props) => (props.onClickCapture ? "2" : "1")}; cursor: ${(props) => (props.onClickCapture ? "pointer" : "inherit")}; background: ${(props) => { return props.onClickCapture && props.backgroundColor ? tinycolor(props.backgroundColor) .darken(5) .toString() : props.backgroundColor; }}; } `; function ContainerComponentWrapper(props: ContainerComponentProps) { const containerStyle = props.containerStyle || "card"; 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) { return props.widgetId === MAIN_CONTAINER_WIDGET_ID ? ( ) : ( ); } export type ContainerStyle = "border" | "card" | "rounded-border" | "none"; export interface ContainerComponentProps extends ComponentProps, WidgetStyleContainerProps { children?: ReactNode; className?: string; backgroundColor?: Color; shouldScrollContents?: boolean; resizeDisabled?: boolean; selected?: boolean; focused?: boolean; minHeight?: number; } export default ContainerComponent;