import React, { useEffect, useRef, useState } from "react";
import styled from "styled-components";
import Resizer, {
ResizerCSS,
} from "components/editorComponents/Debugger/Resizer";
import { CodeEditorWithGutterStyles } from "pages/Editor/JSEditor/styledComponents";
import { ViewDisplayMode, ViewHideBehaviour } from "IDE/Interfaces/View";
import { Button } from "@appsmith/ads";
import classNames from "classnames";
const VIEW_MIN_HEIGHT = 38;
const Container = styled.div<{ displayMode: ViewDisplayMode }>`
${ResizerCSS};
width: 100%;
background-color: var(--ads-v2-color-bg);
border-top: 1px solid var(--ads-v2-color-border);
${(props) => {
switch (props.displayMode) {
case ViewDisplayMode.OVERLAY:
return `
position: absolute;
bottom: 0;
`;
}
}}
`;
const ViewWrapper = styled.div`
height: 100%;
&&& {
ul.ads-v2-tabs__list {
margin: 0 var(--ads-v2-spaces-8);
height: ${VIEW_MIN_HEIGHT}px;
}
}
& {
.ads-v2-tabs__list {
padding: var(--ads-v2-spaces-1) var(--ads-v2-spaces-7);
}
}
& {
.ads-v2-tabs__panel {
${CodeEditorWithGutterStyles};
overflow-y: auto;
height: 100%;
}
}
`;
const MIN_HEIGHT = {
[ViewHideBehaviour.COLLAPSE]: `${VIEW_MIN_HEIGHT}px`,
[ViewHideBehaviour.CLOSE]: "0px",
};
interface Props {
className?: string;
behaviour: ViewHideBehaviour;
displayMode?: ViewDisplayMode;
height: number;
setHeight: (height: number) => void;
hidden: boolean;
onHideClick: () => void;
children: React.ReactNode;
}
const ViewHideButton = styled(Button)`
&.view-hide-button {
position: absolute;
top: 3px;
right: 0;
padding: 9px 11px;
}
`;
interface ViewHideProps {
hideBehaviour: ViewHideBehaviour;
isHidden: boolean;
onToggle: () => void;
}
const ViewHide = (props: ViewHideProps) => {
const [icon, setIcon] = useState(() => {
return props.hideBehaviour === ViewHideBehaviour.CLOSE
? "close-modal"
: "arrow-down-s-line";
});
useEffect(() => {
if (props.hideBehaviour === ViewHideBehaviour.COLLAPSE) {
if (props.isHidden) {
setIcon("arrow-up-s-line");
} else {
setIcon("arrow-down-s-line");
}
}
}, [props.isHidden]);
return (
);
};
const BottomView = (props: Props) => {
const panelRef = useRef(null);
const { className = "" } = props;
// Handle the height of the view when toggling the hidden state
useEffect(() => {
const panel = panelRef.current;
if (!panel) return;
if (props.hidden) {
panel.style.height = MIN_HEIGHT[props.behaviour];
} else {
panel.style.height = `${props.height}px`;
}
}, [props.hidden, props.behaviour]);
return (
{!props.hidden && (
)}
{props.children}
);
};
export default BottomView;