import React, { RefObject, ReactNode, useEffect, useRef } from "react"; import styled, { css } from "styled-components"; import { ComponentProps } from "./BaseComponent"; import { TabsWidgetProps, TabContainerWidgetProps } from "widgets/TabsWidget"; import { generateClassName, getCanvasClassName } from "utils/generators"; import { scrollbarLight } from "constants/DefaultTheme"; interface TabsComponentProps extends ComponentProps { children?: ReactNode; shouldScrollContents?: boolean; selectedTabWidgetId: string; shouldShowTabs: boolean; onTabChange: (tabId: string) => void; tabs: Array<{ id: string; label: string; widgetId: string; }>; } const scrollContents = css` overflow-y: auto; position: absolute; `; const TabsContainerWrapper = styled.div<{ ref: RefObject; }>` display: flex; flex-direction: column; height: 100%; width: 100%; justify-content: center; align-items: center; border-bottom-right-radius: ${props => `${props.theme.radii[1]}px`}; border-bottom-left-radius: ${props => `${props.theme.radii[1]}px`}; border-top-right-radius: ${props => `${props.theme.radii[1]}px`}; border-top-left-radius: ${props => `${props.theme.radii[1]}px`}; box-shadow: ${props => props.theme.shadows[2]}; overflow: hidden; `; const ChildrenWrapper = styled.div` height: 100%; width: 100%; position: relative; background: ${props => props.theme.colors.builderBodyBG}; `; const ScrollableCanvasWrapper = styled.div< TabsWidgetProps & { ref: RefObject; } >` width: 100%; height: 100%; overflow: hidden; ${props => (props.shouldScrollContents ? scrollContents : "")} `; const TabsContainer = styled.div` width: 100%; overflow-x: auto; overflow-y: hidden; ${scrollbarLight}; overflow: hidden; && { height: 38px; width: 100%; display: flex; justify-content: flex-start; align-items: flex-start; } `; type TabProps = { selected?: boolean; onClick: (e: React.MouseEvent) => void; }; const StyledTab = styled.div` height: 30px; background: ${props => props.theme.colors.builderBodyBG}; border-bottom: 1px solid ${props => props.theme.colors.bodyBG}; border-color: ${props => props.theme.colors.bodyBG}; width: 100%; `; const StyledText = styled.div` white-space: nowrap; background: ${props => props.theme.colors.builderBodyBG}; color: ${props => props.theme.colors.menuIconColorInactive}; font-size: ${props => props.theme.fontSizes[3]}px; line-height: 30px; height: 30px; padding: 0 16px; border-bottom: ${props => (props.selected ? "0" : "1px")} solid; border-color: ${props => props.theme.colors.bodyBG}; cursor: pointer; box-shadow: ${props => (props.selected ? props.theme.shadows[0] : "")}; &:hover { background: ${props => props.selected ? props.theme.colors.textOnDarkBG : props.theme.colors.hover}; } &:first-child { box-shadow: ${props => (props.selected ? props.theme.shadows[1] : "")}; } `; const TabsComponent = (props: TabsComponentProps) => { const { onTabChange, ...remainingProps } = props; const tabContainerRef: RefObject = useRef( null, ); useEffect(() => { if (!props.shouldScrollContents) { tabContainerRef.current?.scrollTo({ top: 0, behavior: "smooth" }); } }, [props.shouldScrollContents]); return ( {props.shouldShowTabs ? ( {props.tabs && props.tabs.map((tab, index) => ( ) => { props.onTabChange(tab.widgetId); event.stopPropagation(); }} selected={props.selectedTabWidgetId === tab.widgetId} key={index} > {tab.label} ))} ) : ( undefined )} {props.children} ); }; export default TabsComponent;