/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import styles from "./main-layout.module.scss"; import React from "react"; import { observer } from "mobx-react"; import { cssNames, StorageHelper } from "../../utils"; import { ErrorBoundary } from "../error-boundary"; import { ResizeDirection, ResizeGrowthDirection, ResizeSide, ResizingAnchor } from "../resizing-anchor"; import { withInjectables } from "@ogre-tools/injectable-react"; import sidebarStorageInjectable, { defaultSidebarWidth, SidebarStorageState, } from "./sidebar-storage/sidebar-storage.injectable"; interface Props { sidebar: React.ReactNode; className?: string; footer?: React.ReactNode; } /** * Main layout is commonly used as a wrapper for "global pages" * * @link https://api-docs.k8slens.dev/master/extensions/capabilities/common-capabilities/#global-pages */ interface Dependencies { sidebarStorage: StorageHelper } @observer class NonInjectedMainLayout extends React.Component { onSidebarResize = (width: number) => { this.props.sidebarStorage.merge({ width }); }; render() { const { className, footer, children, sidebar } = this.props; const { width: sidebarWidth } = this.props.sidebarStorage.get(); const style = { "--sidebar-width": `${sidebarWidth}px` } as React.CSSProperties; return (
{sidebar} sidebarWidth} onDrag={this.onSidebarResize} onDoubleClick={() => this.onSidebarResize(defaultSidebarWidth)} minExtent={120} maxExtent={400} />
{children}
{footer}
); } } export const MainLayout = withInjectables( NonInjectedMainLayout, { getProps: (di, props) => ({ sidebarStorage: di.inject(sidebarStorageInjectable), ...props, }), }, );