import "./main-layout.scss"; import React from "react"; import { observable, reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { autobind, createStorage, cssNames } from "../../utils"; import { Sidebar } from "./sidebar"; import { ErrorBoundary } from "../error-boundary"; import { Dock } from "../dock"; import { getHostedCluster } from "../../../common/cluster-store"; import { ResizeDirection, ResizeGrowthDirection, ResizeSide, ResizingAnchor } from "../resizing-anchor"; interface Props { className?: any; footer?: React.ReactNode; headerClass?: string; footerClass?: string; } @observer export class MainLayout extends React.Component { public storage = createStorage("main_layout", { pinnedSidebar: true, sidebarWidth: 200, }); @observable isPinned = this.storage.get().pinnedSidebar; @observable isAccessible = true; @observable sidebarWidth = this.storage.get().sidebarWidth @disposeOnUnmount syncPinnedStateWithStorage = reaction( () => this.isPinned, (isPinned) => this.storage.merge({ pinnedSidebar: isPinned }) ); @disposeOnUnmount syncWidthStateWithStorage = reaction( () => this.sidebarWidth, (sidebarWidth) => this.storage.merge({ sidebarWidth }) ); toggleSidebar = () => { this.isPinned = !this.isPinned; this.isAccessible = false; setTimeout(() => (this.isAccessible = true), 250); }; getSidebarSize = () => { return { "--sidebar-width": `${this.sidebarWidth}px`, } } @autobind() adjustWidth(newWidth: number): void { this.sidebarWidth = newWidth } render() { const { className, headerClass, footer, footerClass, children } = this.props; const cluster = getHostedCluster(); if (!cluster) { return null; // fix: skip render when removing active (visible) cluster } return (
{cluster.preferences.clusterName || cluster.contextName}
{children}
); } }