// Copyright (C) 2020 Intel Corporation // // SPDX-License-Identifier: MIT import './styles.scss'; import React, { Dispatch, useEffect } from 'react'; import { AnyAction } from 'redux'; import { connect } from 'react-redux'; import Text from 'antd/lib/typography/Text'; import Icon from 'antd/lib/icon'; import Tabs from 'antd/lib/tabs'; import Layout from 'antd/lib/layout'; import { Canvas } from 'cvat-canvas-wrapper'; import { CombinedState } from 'reducers/interfaces'; import LabelsListContainer from 'containers/annotation-page/standard-workspace/objects-side-bar/labels-list'; import { collapseSidebar as collapseSidebarAction, updateTabContentHeight as updateTabContentHeightAction, } from 'actions/annotation-actions'; import AppearanceBlock, { computeHeight } from 'components/annotation-page/appearance-block'; import IssuesListComponent from 'components/annotation-page/standard-workspace/objects-side-bar/issues-list'; interface OwnProps { objectsList: JSX.Element; } interface StateToProps { sidebarCollapsed: boolean; canvasInstance: Canvas; } interface DispatchToProps { collapseSidebar(): void; updateTabContentHeight(): void; } function mapStateToProps(state: CombinedState): StateToProps { const { annotation: { sidebarCollapsed, canvas: { instance: canvasInstance }, }, } = state; return { sidebarCollapsed, canvasInstance, }; } function mapDispatchToProps(dispatch: Dispatch): DispatchToProps { return { collapseSidebar(): void { dispatch(collapseSidebarAction()); }, updateTabContentHeight(): void { const height = computeHeight(); dispatch(updateTabContentHeightAction(height)); }, }; } function ObjectsSideBar(props: StateToProps & DispatchToProps & OwnProps): JSX.Element { const { sidebarCollapsed, canvasInstance, collapseSidebar, updateTabContentHeight, objectsList, } = props; useEffect(() => { const alignTabHeight = (): void => { if (!sidebarCollapsed) { updateTabContentHeight(); } }; window.addEventListener('resize', alignTabHeight); alignTabHeight(); return () => { window.removeEventListener('resize', alignTabHeight); }; }, []); useEffect(() => { const listener = (event: Event): void => { if ( (event as TransitionEvent).propertyName === 'width' && ((event.target as any).classList as DOMTokenList).contains('ant-tabs-tab-prev') ) { canvasInstance.fit(); } }; const [sidebar] = window.document.getElementsByClassName('cvat-objects-sidebar'); sidebar.addEventListener('transitionstart', listener); return () => { sidebar.removeEventListener('transitionstart', listener); }; }, []); return ( {/* eslint-disable-next-line */} {sidebarCollapsed ? : } Objects} key='objects'> {objectsList} Labels} key='labels'> Issues} key='issues'> {!sidebarCollapsed && } ); } export default connect(mapStateToProps, mapDispatchToProps)(React.memo(ObjectsSideBar));