From 898d24c4ba2daafc6e827f8614741fee1285e2f3 Mon Sep 17 00:00:00 2001 From: Jack Kavanagh Date: Tue, 4 Oct 2022 23:33:18 +0200 Subject: [PATCH] Refactor/wrapper-tsx-fc (#5242) * wrapper-fc squashed * undrill setFilter * extract hooks * eliminate wrapper.tsx --- .../activity-toggle/activity-toggle.tsx | 2 +- .../dropdowns/environments-dropdown.tsx | 23 +- .../dropdowns/git-sync-dropdown.tsx | 4 +- .../components/modals/git-branches-modal.tsx | 4 +- .../src/ui/components/panes/request-pane.tsx | 3 - .../src/ui/components/panes/response-pane.tsx | 23 +- .../src/ui/components/request-url-bar.tsx | 39 +- .../ui/components/workspace-page-header.tsx | 132 ++++- .../src/ui/components/wrapper-debug.tsx | 81 +-- .../src/ui/components/wrapper-design.tsx | 23 +- .../src/ui/components/wrapper-unit-test.tsx | 24 +- .../insomnia/src/ui/components/wrapper.tsx | 465 ---------------- .../insomnia/src/ui/containers/app-hooks.tsx | 14 +- packages/insomnia/src/ui/containers/app.tsx | 504 +++++++++--------- .../insomnia/src/ui/hooks/use-app-commands.ts | 24 + .../hooks/use-drag-and-drop-import-file.tsx | 54 ++ packages/insomnia/src/ui/hooks/use-git-vcs.ts | 97 ++++ .../insomnia/src/ui/hooks/use-theme-change.ts | 17 + packages/insomnia/src/ui/hooks/use-vcs.ts | 53 ++ 19 files changed, 719 insertions(+), 867 deletions(-) delete mode 100644 packages/insomnia/src/ui/components/wrapper.tsx create mode 100644 packages/insomnia/src/ui/hooks/use-app-commands.ts create mode 100644 packages/insomnia/src/ui/hooks/use-drag-and-drop-import-file.tsx create mode 100644 packages/insomnia/src/ui/hooks/use-git-vcs.ts create mode 100644 packages/insomnia/src/ui/hooks/use-theme-change.ts create mode 100644 packages/insomnia/src/ui/hooks/use-vcs.ts diff --git a/packages/insomnia/src/ui/components/activity-toggle/activity-toggle.tsx b/packages/insomnia/src/ui/components/activity-toggle/activity-toggle.tsx index c8fc9274c8..86ad0ab390 100644 --- a/packages/insomnia/src/ui/components/activity-toggle/activity-toggle.tsx +++ b/packages/insomnia/src/ui/components/activity-toggle/activity-toggle.tsx @@ -5,7 +5,7 @@ import styled from 'styled-components'; import type { GlobalActivity } from '../../../common/constants'; import { ACTIVITY_DEBUG, ACTIVITY_SPEC, ACTIVITY_UNIT_TEST } from '../../../common/constants'; import { isDesign, Workspace } from '../../../models/workspace'; -import { HandleActivityChange } from '../wrapper'; +import { HandleActivityChange } from '../workspace-page-header'; const StyledNav = styled.nav({ display: 'flex', diff --git a/packages/insomnia/src/ui/components/dropdowns/environments-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/environments-dropdown.tsx index c8b6832808..61cb474832 100644 --- a/packages/insomnia/src/ui/components/dropdowns/environments-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/environments-dropdown.tsx @@ -2,9 +2,10 @@ import { EnvironmentHighlightColorStyle } from 'insomnia-common'; import React, { FC, useCallback, useRef } from 'react'; import { useSelector } from 'react-redux'; +import * as models from '../../../models'; import type { Environment } from '../../../models/environment'; import type { Workspace } from '../../../models/workspace'; -import { selectEnvironments, selectHotKeyRegistry } from '../../redux/selectors'; +import { selectActiveWorkspaceMeta, selectEnvironments, selectHotKeyRegistry } from '../../redux/selectors'; import { type DropdownHandle, Dropdown } from '../base/dropdown/dropdown'; import { DropdownButton } from '../base/dropdown/dropdown-button'; import { DropdownDivider } from '../base/dropdown/dropdown-divider'; @@ -18,18 +19,17 @@ import { Tooltip } from '../tooltip'; interface Props { activeEnvironment?: Environment | null; environmentHighlightColorStyle: EnvironmentHighlightColorStyle; - handleSetActiveEnvironment: (id: string | null) => void; workspace: Workspace; } export const EnvironmentsDropdown: FC = ({ activeEnvironment, environmentHighlightColorStyle, - handleSetActiveEnvironment, workspace, }) => { const environments = useSelector(selectEnvironments); const hotKeyRegistry = useSelector(selectHotKeyRegistry); + const activeWorkspaceMeta = useSelector(selectActiveWorkspaceMeta); const dropdownRef = useRef(null); const handleShowEnvironmentModal = useCallback(() => { showModal(WorkspaceEnvironmentsEditModal, workspace); @@ -48,7 +48,7 @@ export const EnvironmentsDropdown: FC = ({ const subEnvironments = environments .filter(environment => environment.parentId === (baseEnvironment && baseEnvironment._id)) .sort((e1, e2) => e1.metaSortKey - e2.metaSortKey); - const description = (!activeEnvironment || activeEnvironment === baseEnvironment) ? 'No Environment' : activeEnvironment.name; + const description = (!activeEnvironment || activeEnvironment === baseEnvironment) ? 'No Environment' : activeEnvironment.name; return ( @@ -82,8 +82,11 @@ export const EnvironmentsDropdown: FC = ({ {subEnvironments.map(environment => ( { + if (activeWorkspaceMeta) { + models.workspaceMeta.update(activeWorkspaceMeta, { activeEnvironmentId: environment._id }); + } + }} > = ({ ))} - + { + if (activeWorkspaceMeta) { + models.workspaceMeta.update(activeWorkspaceMeta, { activeEnvironmentId: null }); + } + }} + > No Environment diff --git a/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx b/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx index d2b45ada18..1d8bf66454 100644 --- a/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx +++ b/packages/insomnia/src/ui/components/dropdowns/git-sync-dropdown.tsx @@ -29,7 +29,6 @@ import { GitLogModal } from '../modals/git-log-modal'; import { GitStagingModal } from '../modals/git-staging-modal'; type Props = ReturnType & { - handleGitBranchChanged: (branch: string) => void; workspace: Workspace; vcs: GitVCS; gitRepository: GitRepository | null; @@ -64,7 +63,7 @@ class GitSyncDropdown extends PureComponent { } async _refreshState(otherState?: Record) { - const { vcs, workspace, handleGitBranchChanged } = this.props; + const { vcs, workspace } = this.props; const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(workspace._id); // Clear cached items and return if no state @@ -101,7 +100,6 @@ class GitSyncDropdown extends PureComponent { cachedGitLastAuthor, cachedGitLastCommitTime, }); - handleGitBranchChanged(branch); } async _handleOpen() { diff --git a/packages/insomnia/src/ui/components/modals/git-branches-modal.tsx b/packages/insomnia/src/ui/components/modals/git-branches-modal.tsx index 6cb19f3a27..c908cb2d8e 100644 --- a/packages/insomnia/src/ui/components/modals/git-branches-modal.tsx +++ b/packages/insomnia/src/ui/components/modals/git-branches-modal.tsx @@ -20,7 +20,6 @@ import { PromptButton } from '../base/prompt-button'; type Props = ReturnType & { vcs: GitVCS; gitRepository: GitRepository; - handleGitBranchChanged: (branch: string) => void; }; interface State { @@ -75,7 +74,7 @@ export class GitBranchesModalClass extends PureComponent { } async _refreshState(newState?: Record) { - const { vcs, handleGitBranchChanged } = this.props; + const { vcs } = this.props; const branch = await vcs.getBranch(); const branches = await vcs.listBranches(); const remoteBranches = await vcs.listRemoteBranches(); @@ -85,7 +84,6 @@ export class GitBranchesModalClass extends PureComponent { remoteBranches, ...newState, }); - handleGitBranchChanged(branch); } _handleClearError() { diff --git a/packages/insomnia/src/ui/components/panes/request-pane.tsx b/packages/insomnia/src/ui/components/panes/request-pane.tsx index cdcdbbe464..80ff1f6df0 100644 --- a/packages/insomnia/src/ui/components/panes/request-pane.tsx +++ b/packages/insomnia/src/ui/components/panes/request-pane.tsx @@ -52,7 +52,6 @@ const TabPanelBody = styled.div({ interface Props { environmentId: string; - handleImport: Function; request?: Request | null; settings: Settings; workspace: Workspace; @@ -60,7 +59,6 @@ interface Props { export const RequestPane: FC = ({ environmentId, - handleImport, request, settings, workspace, @@ -172,7 +170,6 @@ export const RequestPane: FC = ({ uniquenessKey={uniqueKey} onUrlChange={updateRequestUrl} handleAutocompleteUrls={autocompleteUrls} - handleImport={handleImport} nunjucksPowerUserMode={settings.nunjucksPowerUserMode} request={request} /> diff --git a/packages/insomnia/src/ui/components/panes/response-pane.tsx b/packages/insomnia/src/ui/components/panes/response-pane.tsx index e7fff444a8..db5d261c8d 100644 --- a/packages/insomnia/src/ui/components/panes/response-pane.tsx +++ b/packages/insomnia/src/ui/components/panes/response-pane.tsx @@ -13,6 +13,7 @@ import * as models from '../../../models'; import type { Request } from '../../../models/request'; import type { Response } from '../../../models/response'; import { cancelRequestById } from '../../../network/network'; +import { updateRequestMetaByParentId } from '../../hooks/create-request'; import { selectActiveResponse, selectLoadStartTime, selectResponseFilter, selectResponseFilterHistory, selectResponsePreviewMode, selectSettings } from '../../redux/selectors'; import { Button } from '../base/button'; import { PreviewModeDropdown } from '../dropdowns/preview-mode-dropdown'; @@ -32,11 +33,9 @@ import { Pane, paneBodyClasses, PaneHeader } from './pane'; import { PlaceholderResponsePane } from './placeholder-response-pane'; interface Props { - handleSetFilter: (filter: string) => void; request?: Request | null; } export const ResponsePane: FC = ({ - handleSetFilter, request, }) => { const response = useSelector(selectActiveResponse) as Response | null; @@ -45,7 +44,24 @@ export const ResponsePane: FC = ({ const settings = useSelector(selectSettings); const loadStartTime = useSelector(selectLoadStartTime); const previewMode = useSelector(selectResponsePreviewMode); - + const handleSetFilter = async (responseFilter: string) => { + if (!response) { + return; + } + const requestId = response.parentId; + await updateRequestMetaByParentId(requestId, { responseFilter }); + const meta = await models.requestMeta.getByParentId(requestId); + if (!meta) { + return; + } + const responseFilterHistory = meta.responseFilterHistory.slice(0, 10); + // Already in history or empty? + if (!responseFilter || responseFilterHistory.includes(responseFilter)) { + return; + } + responseFilterHistory.unshift(responseFilter); + updateRequestMetaByParentId(requestId, { responseFilterHistory }); + }; const handleGetResponseBody = useCallback(() => { if (!response) { return null; @@ -58,7 +74,6 @@ export const ResponsePane: FC = ({ clipboard.writeText(bodyBuffer.toString('utf8')); } }, [handleGetResponseBody]); - const handleDownloadResponseBody = useCallback(async (prettify: boolean) => { if (!response || !request) { console.warn('Nothing to download'); diff --git a/packages/insomnia/src/ui/components/request-url-bar.tsx b/packages/insomnia/src/ui/components/request-url-bar.tsx index f9dec3bf92..35b1f5aebe 100644 --- a/packages/insomnia/src/ui/components/request-url-bar.tsx +++ b/packages/insomnia/src/ui/components/request-url-bar.tsx @@ -1,5 +1,6 @@ import type { SaveDialogOptions } from 'electron'; import fs from 'fs'; +import * as importers from 'insomnia-importers'; import { extension as mimeExtension } from 'mime-types'; import path from 'path'; import React, { forwardRef, useCallback, useImperativeHandle, useRef, useState } from 'react'; @@ -7,15 +8,16 @@ import { useDispatch, useSelector } from 'react-redux'; import { useInterval } from 'react-use'; import { SegmentEvent, trackSegmentEvent } from '../../common/analytics'; +import { database } from '../../common/database'; import { getContentDispositionHeader } from '../../common/misc'; import * as models from '../../models'; import { update } from '../../models/helpers/request-operations'; -import type { Request } from '../../models/request'; +import { isRequest, Request } from '../../models/request'; import * as network from '../../network/network'; import { updateRequestMetaByParentId } from '../hooks/create-request'; import { useTimeoutWhen } from '../hooks/useTimeoutWhen'; import { loadRequestStart, loadRequestStop } from '../redux/modules/global'; -import { selectActiveEnvironment, selectHotKeyRegistry, selectResponseDownloadPath, selectSettings } from '../redux/selectors'; +import { selectActiveEnvironment, selectActiveRequest, selectHotKeyRegistry, selectResponseDownloadPath, selectSettings } from '../redux/selectors'; import { type DropdownHandle, Dropdown } from './base/dropdown/dropdown'; import { DropdownButton } from './base/dropdown/dropdown-button'; import { DropdownDivider } from './base/dropdown/dropdown-divider'; @@ -31,7 +33,6 @@ import { RequestRenderErrorModal } from './modals/request-render-error-modal'; interface Props { handleAutocompleteUrls: () => Promise; - handleImport: Function; nunjucksPowerUserMode: boolean; onUrlChange: (r: Request, url: string) => Promise; request: Request; @@ -44,7 +45,6 @@ export interface RequestUrlBarHandle { export const RequestUrlBar = forwardRef(({ handleAutocompleteUrls, - handleImport, onUrlChange, request, uniquenessKey, @@ -52,6 +52,7 @@ export const RequestUrlBar = forwardRef(({ const downloadPath = useSelector(selectResponseDownloadPath); const hotKeyRegistry = useSelector(selectHotKeyRegistry); const activeEnvironment = useSelector(selectActiveEnvironment); + const activeRequest = useSelector(selectActiveRequest); const settings = useSelector(selectSettings); const dispatch = useDispatch(); const methodDropdownRef = useRef(null); @@ -302,6 +303,36 @@ export const RequestUrlBar = forwardRef(({ }); const [lastPastedText, setLastPastedText] = useState(); + const handleImport = useCallback(async (text: string) => { + // Allow user to paste any import file into the url. If it results in + // only one item, it will overwrite the current request. + try { + const { data } = await importers.convert(text); + const { resources } = data; + const r = resources[0]; + if (r && r._type === 'request' && activeRequest && isRequest(activeRequest)) { + // Only pull fields that we want to update + return database.update({ + ...activeRequest, + modified: Date.now(), + url: r.url, + method: r.method, + headers: r.headers, + body: r.body, + authentication: r.authentication, + parameters: r.parameters, + }, + // Pass true to indicate that this is an import + true + ); + } + } catch (error) { + // Import failed, that's alright + console.error(error); + } + return null; + }, [activeRequest]); + const handleUrlChange = useCallback(async (url: string) => { const pastedText = lastPastedText; // If no pasted text in the queue, just fire the regular change handler diff --git a/packages/insomnia/src/ui/components/workspace-page-header.tsx b/packages/insomnia/src/ui/components/workspace-page-header.tsx index df29a188f5..3548631f2e 100644 --- a/packages/insomnia/src/ui/components/workspace-page-header.tsx +++ b/packages/insomnia/src/ui/components/workspace-page-header.tsx @@ -1,37 +1,113 @@ -import React, { FunctionComponent, ReactNode, useCallback } from 'react'; -import { useSelector } from 'react-redux'; +import React, { FC, useCallback } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; -import { ACTIVITY_HOME } from '../../common/constants'; -import { selectActiveActivity, selectActiveApiSpec, selectActiveProjectName, selectActiveWorkspace } from '../redux/selectors'; +import { ACTIVITY_DEBUG, ACTIVITY_HOME, ACTIVITY_SPEC, ACTIVITY_UNIT_TEST, GlobalActivity } from '../../common/constants'; +import { importRaw } from '../../common/import'; +import { initializeSpectral, isLintError } from '../../common/spectral'; +import * as models from '../../models'; +import { isRemoteProject } from '../../models/project'; +import { isCollection, isDesign } from '../../models/workspace'; +import { useGitVCS } from '../hooks/use-git-vcs'; +import { useVCS } from '../hooks/use-vcs'; +import { setActiveActivity } from '../redux/modules/global'; +import { selectActiveActivity, selectActiveApiSpec, selectActiveGitRepository, selectActiveProject, selectActiveProjectName, selectActiveWorkspace, selectIsLoggedIn } from '../redux/selectors'; import { ActivityToggle } from './activity-toggle/activity-toggle'; import { AppHeader } from './app-header'; +import { DropdownButton } from './base/dropdown/dropdown-button'; +import GitSyncDropdown from './dropdowns/git-sync-dropdown'; +import { SyncDropdown } from './dropdowns/sync-dropdown'; import { WorkspaceDropdown } from './dropdowns/workspace-dropdown'; -import { HandleActivityChange } from './wrapper'; +import { showModal } from './modals'; +import { AlertModal } from './modals/alert-modal'; -interface Props { - handleActivityChange: HandleActivityChange; - gridRight: ReactNode; -} +export type HandleActivityChange = (options: { + workspaceId?: string; + nextActivity: GlobalActivity; +}) => Promise; -export const WorkspacePageHeader: FunctionComponent = ({ - gridRight, - handleActivityChange, -}) => { +// TODO(jackkav): find the right place to initializeSpectral +const spectral = initializeSpectral(); +export const WorkspacePageHeader: FC = () => { const activeApiSpec = useSelector(selectActiveApiSpec); const activeWorkspace = useSelector(selectActiveWorkspace); - const activity = useSelector(selectActiveActivity); + const activeActivity = useSelector(selectActiveActivity); + const dispatch = useDispatch(); + + const handleActivityChange = useCallback(async ({ workspaceId, nextActivity }) => { + // Remember last activity on workspace for later, but only if it isn't HOME + if (workspaceId && nextActivity !== ACTIVITY_HOME) { + await models.workspaceMeta.updateByParentId(workspaceId, { + activeActivity: nextActivity, + }); + } + const editingASpec = activeActivity === ACTIVITY_SPEC; + if (!editingASpec) { + dispatch(setActiveActivity(nextActivity)); + return; + } + if (!activeApiSpec || !workspaceId) { + return; + } + const goingToDebugOrTest = nextActivity === ACTIVITY_DEBUG || nextActivity === ACTIVITY_UNIT_TEST; + // If editing a spec and not going to debug or test, don't regenerate anything + if (editingASpec && !goingToDebugOrTest) { + dispatch(setActiveActivity(nextActivity)); + return; + } + // Handle switching away from the spec design activity. For this, we want to generate + // requests that can be accessed from debug or test. + // If there are errors in the spec, show the user a warning first + const results = (await spectral.run(activeApiSpec.contents)).filter(isLintError); + if (activeApiSpec.contents && results && results.length) { + showModal(AlertModal, { + title: 'Error Generating Configuration', + message: 'Some requests may not be available due to errors found in the specification. We recommend fixing errors before proceeding.', + okLabel: 'Proceed', + addCancel: true, + onConfirm: () => { + dispatch(setActiveActivity(nextActivity)); + }, + }); + return; + } + + // TODO(gatzjames): make import on navigation optional + // Delaying generation so design to debug mode is smooth + dispatch(setActiveActivity(nextActivity)); + setTimeout(() => { + importRaw(activeApiSpec.contents, { + getWorkspaceId: () => Promise.resolve(workspaceId), + enableDiffBasedPatching: true, + enableDiffDeep: true, + bypassDiffProps: { + url: true, + }, + }); + }, 1000); + }, [activeActivity, activeApiSpec, dispatch]); - const homeCallback = useCallback(() => { - handleActivityChange({ workspaceId: activeWorkspace?._id, nextActivity: ACTIVITY_HOME }); - }, [activeWorkspace, handleActivityChange]); const activeProjectName = useSelector(selectActiveProjectName); + const activeProject = useSelector(selectActiveProject); + const isLoggedIn = useSelector(selectIsLoggedIn); + const activeGitRepository = useSelector(selectActiveGitRepository); - if (!activeWorkspace || !activeApiSpec || !activity) { + const vcs = useVCS({ + workspaceId: activeWorkspace?._id, + }); + + const gitVCS = useGitVCS({ + workspaceId: activeWorkspace?._id, + projectId: activeProject?._id, + gitRepository: activeGitRepository, + }); + const isTeamSync = isLoggedIn && activeWorkspace && isCollection(activeWorkspace) && isRemoteProject(activeProject) && vcs; + const isGitSync = activeWorkspace && gitVCS && isDesign(activeWorkspace); + if (!activeWorkspace || !activeApiSpec || !activeActivity) { return null; } const crumbs = [ - { id: 'project', node: activeProjectName, onClick: homeCallback }, + { id: 'project', node: activeProjectName, onClick: () => handleActivityChange({ workspaceId: activeWorkspace?._id, nextActivity: ACTIVITY_HOME }) }, { id: 'workspace', node: }, ]; @@ -41,11 +117,25 @@ export const WorkspacePageHeader: FunctionComponent = ({ gridCenter={ } - gridRight={gridRight} + gridRight={isTeamSync ? : isGitSync ? ( + + {children} + + )} + /> : null} /> ); }; diff --git a/packages/insomnia/src/ui/components/wrapper-debug.tsx b/packages/insomnia/src/ui/components/wrapper-debug.tsx index 4ca9a4a385..3a8b004810 100644 --- a/packages/insomnia/src/ui/components/wrapper-debug.tsx +++ b/packages/insomnia/src/ui/components/wrapper-debug.tsx @@ -1,4 +1,4 @@ -import React, { FC, Fragment, ReactNode, useEffect } from 'react'; +import React, { FC, Fragment, useEffect } from 'react'; import { useSelector } from 'react-redux'; import { SegmentEvent, trackSegmentEvent } from '../../common/analytics'; @@ -6,25 +6,19 @@ import * as models from '../../models'; import { isGrpcRequest } from '../../models/grpc-request'; import { getByParentId as getGrpcRequestMetaByParentId } from '../../models/grpc-request-meta'; import * as requestOperations from '../../models/helpers/request-operations'; -import { isRemoteProject } from '../../models/project'; import { getByParentId as getRequestMetaByParentId } from '../../models/request-meta'; import { isWebSocketRequest } from '../../models/websocket-request'; -import { isCollection, isDesign } from '../../models/workspace'; -import { VCS } from '../../sync/vcs/vcs'; import { updateRequestMetaByParentId } from '../hooks/create-request'; import { createRequestGroup } from '../hooks/create-request-group'; import { selectActiveEnvironment, - selectActiveProject, selectActiveRequest, selectActiveWorkspace, selectActiveWorkspaceMeta, - selectIsLoggedIn, selectSettings, } from '../redux/selectors'; import { selectSidebarFilter } from '../redux/sidebar-selectors'; import { EnvironmentsDropdown } from './dropdowns/environments-dropdown'; -import { SyncDropdown } from './dropdowns/sync-dropdown'; import { ErrorBoundary } from './error-boundary'; import { useDocBodyKeyboardShortcuts } from './keydown-binder'; import { showModal } from './modals'; @@ -46,25 +40,8 @@ import { SidebarFilter } from './sidebar/sidebar-filter'; import { WebSocketRequestPane } from './websockets/websocket-request-pane'; import { WebSocketResponsePane } from './websockets/websocket-response-pane'; import { WorkspacePageHeader } from './workspace-page-header'; -import type { HandleActivityChange } from './wrapper'; - -interface Props { - gitSyncDropdown: ReactNode; - handleActivityChange: HandleActivityChange; - handleSetActiveEnvironment: (id: string | null) => void; - handleImport: Function; - vcs: VCS | null; -} -export const WrapperDebug: FC = ({ - gitSyncDropdown, - handleActivityChange, - handleSetActiveEnvironment, - handleImport, - vcs, -}) => { - const activeProject = useSelector(selectActiveProject); - const isLoggedIn = useSelector(selectIsLoggedIn); +export const WrapperDebug: FC = () => { const activeEnvironment = useSelector(selectActiveEnvironment); const activeRequest = useSelector(selectActiveRequest); const activeWorkspace = useSelector(selectActiveWorkspace); @@ -72,7 +49,6 @@ export const WrapperDebug: FC = ({ const sidebarFilter = useSelector(selectSidebarFilter); const activeWorkspaceMeta = useSelector(selectActiveWorkspaceMeta); - const isTeamSync = isLoggedIn && activeWorkspace && isCollection(activeWorkspace) && isRemoteProject(activeProject) && vcs; useDocBodyKeyboardShortcuts({ request_togglePin: async () => { @@ -177,53 +153,16 @@ export const WrapperDebug: FC = ({ }; }, [activeEnvironment?._id]); - async function handleSetResponseFilter(responseFilter: string) { - if (!activeRequest) { - return; - } - const requestId = activeRequest._id; - await updateRequestMetaByParentId(requestId, { responseFilter }); - - const meta = await models.requestMeta.getByParentId(requestId); - if (!meta) { - return; - } - const responseFilterHistory = meta.responseFilterHistory.slice(0, 10); - - // Already in history? - if (responseFilterHistory.includes(responseFilter)) { - return; - } - - // Blank? - if (!responseFilter) { - return; - } - - responseFilterHistory.unshift(responseFilter); - await updateRequestMetaByParentId(requestId, { - responseFilterHistory, - }); - } - return ( : isDesign(activeWorkspace) ? gitSyncDropdown : null} - /> + : null} renderPageSidebar={activeWorkspace ?