diff --git a/packages/insomnia/src/ui/components/sidebar/sidebar-children.tsx b/packages/insomnia/src/ui/components/sidebar/sidebar-children.tsx index 65fd2d3165..e534423e85 100644 --- a/packages/insomnia/src/ui/components/sidebar/sidebar-children.tsx +++ b/packages/insomnia/src/ui/components/sidebar/sidebar-children.tsx @@ -1,15 +1,12 @@ -import { autoBindMethodsForReact } from 'class-autobind-decorator'; import { HotKeyRegistry } from 'insomnia-common'; -import React, { Fragment, PureComponent } from 'react'; +import React, { FC, Fragment } from 'react'; import ReactDOM from 'react-dom'; -import { connect } from 'react-redux'; +import { useSelector } from 'react-redux'; -import { AUTOBIND_CFG } from '../../../common/constants'; import { GrpcRequest, isGrpcRequest } from '../../../models/grpc-request'; import { isRequest, Request } from '../../../models/request'; import type { RequestGroup } from '../../../models/request-group'; -import { RootState } from '../../redux/modules'; -import { selectActiveRequest, selectActiveWorkspace } from '../../redux/selectors'; +import { selectActiveRequest } from '../../redux/selectors'; import { SidebarCreateDropdown } from './sidebar-create-dropdown'; import { SidebarRequestGroupRow } from './sidebar-request-group-row'; import { SidebarRequestRow } from './sidebar-request-row'; @@ -26,134 +23,98 @@ export interface SidebarChildObjects { all: Child[]; } -type ReduxProps = ReturnType; +function hasActiveChild(children: Child[], activeRequestId: string): boolean { + return !!children.find(c => c.doc._id === activeRequestId || hasActiveChild(c.children || [], activeRequestId)); +} +interface RecursiveSidebarRowsProps { + rows: Child[]; + isInPinnedList: boolean; +} -const mapStateToProps = (state: RootState) => ({ - activeRequest: selectActiveRequest(state), - workspace: selectActiveWorkspace(state), -}); - -interface Props extends ReduxProps { +interface Props { + childObjects: SidebarChildObjects; + filter: string; handleActivateRequest: Function; - handleSetRequestPinned: Function; - handleSetRequestGroupCollapsed: Function; + handleCopyAsCurl: Function; handleDuplicateRequest: Function; handleDuplicateRequestGroup: (requestGroup: RequestGroup) => any; handleGenerateCode: Function; - handleCopyAsCurl: Function; - childObjects: SidebarChildObjects; - filter: string; + handleSetRequestGroupCollapsed: Function; + handleSetRequestPinned: Function; hotKeyRegistry: HotKeyRegistry; } - -@autoBindMethodsForReact(AUTOBIND_CFG) -class UnconnectedSidebarChildren extends PureComponent { - _renderChildren(children: Child[], isInPinnedList: boolean) { - const { - filter, - handleSetRequestPinned, - handleSetRequestGroupCollapsed, - handleDuplicateRequest, - handleDuplicateRequestGroup, - handleGenerateCode, - handleCopyAsCurl, - handleActivateRequest, - activeRequest, - hotKeyRegistry, - } = this.props; +export const SidebarChildren: FC = ({ + childObjects, + filter, + handleActivateRequest, + handleCopyAsCurl, + handleDuplicateRequest, + handleDuplicateRequestGroup, + handleGenerateCode, + handleSetRequestGroupCollapsed, + handleSetRequestPinned, + hotKeyRegistry, +}) => { + const RecursiveSidebarRows: FC = ({ rows, isInPinnedList }) => { + const activeRequest = useSelector(selectActiveRequest); const activeRequestId = activeRequest ? activeRequest._id : 'n/a'; - return children.map(child => { - if (!isInPinnedList && child.hidden) { - return null; - } - - if (isRequest(child.doc) || isGrpcRequest(child.doc)) { - return ( - - ); - } - - // We have a RequestGroup! - const requestGroup = child.doc; - - function hasActiveChild(children: Child[]) { - for (const c of children) { - if (hasActiveChild(c.children || [])) { - return true; - } else if (c.doc._id === activeRequestId) { - return true; - } - } - - // Didn't find anything, so return - return false; - } - - const isActive = hasActiveChild(child.children); - - const children = this._renderChildren(child.children, isInPinnedList); - - return ( - - {children} - - ); - }); - } - - _renderList(children: Child[], pinnedList: boolean) { return ( -
    - {this._renderChildren(children, pinnedList)} + <> + {rows.map(row => (!isInPinnedList && row.hidden) + ? null + : (isRequest(row.doc) || isGrpcRequest(row.doc)) + ? ( + + ) : ( + + {row.children.filter(Boolean).length > 0 ? : null} + + ))} + ); + }; + const { all, pinned } = childObjects; + const showSeparator = childObjects.pinned.length > 0; + const contextMenuPortal = ReactDOM.createPortal( +
    + +
    , + document.querySelector('#dropdowns-container') as any, + ); + return ( + +
      +
    - ); - } - - render() { - const { childObjects, hotKeyRegistry } = this.props; - const showSeparator = childObjects.pinned.length > 0; - const contextMenuPortal = ReactDOM.createPortal( -
    - -
    , - document.querySelector('#dropdowns-container') as any, - ); - return ( - - {this._renderList(childObjects.pinned, true)} -
    - {this._renderList(childObjects.all, false)} - {contextMenuPortal} - - ); - } -} - -export const SidebarChildren = connect(mapStateToProps)(UnconnectedSidebarChildren); +
    +
      + +
    + {contextMenuPortal} + + ); +};