X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/3d5a1c29aad86476f2e789e1e54cabf8b4605aa2..4a9e5c926179b3ab8ff7231904e2db93d42149e0:/services/workbench2/src/views-components/side-panel/side-panel.tsx diff --git a/services/workbench2/src/views-components/side-panel/side-panel.tsx b/services/workbench2/src/views-components/side-panel/side-panel.tsx index 18aed873aa..80cfe75b27 100644 --- a/services/workbench2/src/views-components/side-panel/side-panel.tsx +++ b/services/workbench2/src/views-components/side-panel/side-panel.tsx @@ -2,13 +2,13 @@ // // SPDX-License-Identifier: AGPL-3.0 -import React from 'react'; +import React, { useRef, useEffect } from 'react'; import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; import { ArvadosTheme } from 'common/custom-theme'; import { SidePanelTree, SidePanelTreeProps } from 'views-components/side-panel-tree/side-panel-tree'; import { Dispatch } from 'redux'; import { connect } from 'react-redux'; -import { navigateFromSidePanel } from 'store/side-panel/side-panel-action'; +import { navigateFromSidePanel, setCurrentSideWidth } from 'store/side-panel/side-panel-action'; import { Grid } from '@material-ui/core'; import { SidePanelButton } from 'views-components/side-panel-button/side-panel-button'; import { RootState } from 'store/store'; @@ -36,30 +36,70 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ const mapDispatchToProps = (dispatch: Dispatch): SidePanelTreeProps => ({ onItemActivation: id => { dispatch(navigateFromSidePanel(id)); + }, + setCurrentSideWidth: width => { + dispatch(setCurrentSideWidth(width)) } }); -const mapStateToProps = ({ router, sidePanel }: RootState) => ({ +const mapStateToProps = ({ router, sidePanel, detailsPanel }: RootState) => ({ currentRoute: router.location ? router.location.pathname : '', - isCollapsed: sidePanel.collapsedState + isCollapsed: sidePanel.collapsedState, + isDetailsPanelTransitioning: detailsPanel.isTransitioning }); export const SidePanel = withStyles(styles)( connect(mapStateToProps, mapDispatchToProps)( - ({ classes, ...props }: WithStyles & SidePanelTreeProps & { currentRoute: string }) => - - {props.isCollapsed ? - <> - - - - : - <> - - - + ({ classes, ...props }: WithStyles & SidePanelTreeProps & { currentRoute: string, isDetailsPanelTransitioning: boolean }) =>{ + + const splitPaneRef = useRef(null) + + useEffect(()=>{ + const splitPane = splitPaneRef?.current as Element + + if (!splitPane) return; + + const observerCallback: ResizeObserverCallback = (entries: ResizeObserverEntry[]) => { + try { + //prevents potential infinite resize triggers + window.requestAnimationFrame((): void | undefined => { + if (!Array.isArray(entries) || !entries.length) { + return; + } + const width = entries[0].contentRect.width + props.setCurrentSideWidth(width) + }); + } catch (error) { + console.error('Error in resize observer callback', error); + } + }; + + const observer = new ResizeObserver(observerCallback) + + observer.observe(splitPane) + return ()=> observer.disconnect() + }, [props]) + + return ( + + {props.isCollapsed ? +
+ <> + + + +
+ : + <> +
+ + + + + +
+ + }
- - } -
+ )} ));