PromucFlow_constructor/app/client/src/pages/Editor/MainContainer.tsx

90 lines
2.6 KiB
TypeScript

import styled from "styled-components";
import * as Sentry from "@sentry/react";
import { useDispatch, useSelector } from "react-redux";
import React, { useState, useCallback } from "react";
import { Route, Switch } from "react-router";
import EditorsRouter from "./routes";
import BottomBar from "./BottomBar";
import { DEFAULT_ENTITY_EXPLORER_WIDTH } from "constants/AppConstants";
import WidgetsEditor from "./WidgetsEditor";
import { updateExplorerWidthAction } from "actions/explorerActions";
import { BUILDER_PATH, BUILDER_PATH_DEPRECATED } from "constants/routes";
import EntityExplorerSidebar from "components/editorComponents/Sidebar";
import classNames from "classnames";
import { previewModeSelector } from "selectors/editorSelectors";
const SentryRoute = Sentry.withSentryRouting(Route);
const Container = styled.div`
display: flex;
height: calc(
100vh - ${(props) => props.theme.smallHeaderHeight} -
${(props) => props.theme.bottomBarHeight}
);
background-color: ${(props) => props.theme.appBackground};
`;
function MainContainer() {
const dispatch = useDispatch();
const [sidebarWidth, setSidebarWidth] = useState(
DEFAULT_ENTITY_EXPLORER_WIDTH,
);
/**
* on entity explorer sidebar width change
*
* @return void
*/
const onLeftSidebarWidthChange = useCallback((newWidth) => {
setSidebarWidth(newWidth);
}, []);
/**
* on entity explorer sidebar drag end
*
* @return void
*/
const onLeftSidebarDragEnd = useCallback(() => {
dispatch(updateExplorerWidthAction(sidebarWidth));
}, [sidebarWidth]);
const isPreviewMode = useSelector(previewModeSelector);
return (
<>
<Container className="w-full overflow-x-hidden">
<EntityExplorerSidebar
onDragEnd={onLeftSidebarDragEnd}
onWidthChange={onLeftSidebarWidthChange}
width={sidebarWidth}
/>
<div
className="relative flex flex-col w-full overflow-auto"
id="app-body"
>
<Switch key={BUILDER_PATH}>
<SentryRoute component={WidgetsEditor} exact path={BUILDER_PATH} />
<SentryRoute
component={WidgetsEditor}
exact
path={BUILDER_PATH_DEPRECATED}
/>
<SentryRoute component={EditorsRouter} />
</Switch>
</div>
</Container>
<BottomBar
className={classNames({
"translate-y-full fixed bottom-0": isPreviewMode,
"translate-y-0 relative opacity-100": !isPreviewMode,
"transition-all transform duration-400": true,
})}
/>
</>
);
}
MainContainer.displayName = "MainContainer";
export default MainContainer;