From 6d3b3f3ef9e7f9910f8da0f372e40390a928f6fe Mon Sep 17 00:00:00 2001 From: cahrens Date: Wed, 20 Mar 2024 17:22:14 -0400 Subject: [PATCH] Remove withSubmissionStats. --- src/workspaces/list/WorkspacesList.test.ts | 32 ++++----- src/workspaces/list/WorkspacesList.ts | 25 ++++++- .../state/useWorkspacesWithSubmissionStats.ts | 71 ------------------- 3 files changed, 37 insertions(+), 91 deletions(-) delete mode 100644 src/workspaces/list/state/useWorkspacesWithSubmissionStats.ts diff --git a/src/workspaces/list/WorkspacesList.test.ts b/src/workspaces/list/WorkspacesList.test.ts index 4348ee2687..5b70dc19cf 100644 --- a/src/workspaces/list/WorkspacesList.test.ts +++ b/src/workspaces/list/WorkspacesList.test.ts @@ -4,7 +4,7 @@ import { h } from 'react-hyperscript-helpers'; import { Ajax } from 'src/libs/ajax'; import { asMockedFn, renderWithAppContexts as render } from 'src/testing/test-utils'; import { defaultAzureWorkspace, defaultGoogleWorkspace } from 'src/testing/workspace-fixtures'; -import { useWorkspacesWithSubmissionStats } from 'src/workspaces/list/state/useWorkspacesWithSubmissionStats'; +import { useWorkspaces } from 'src/workspaces/common/state/useWorkspaces'; import { WorkspacesList } from 'src/workspaces/list/WorkspacesList'; import { WorkspaceWrapper as Workspace } from 'src/workspaces/utils'; @@ -52,12 +52,11 @@ jest.mock('src/workspaces/list/WorkspaceFilters', () => WorkspaceFilters: jest.fn().mockReturnValue(null), })); -jest.mock('src/workspaces/list/state/useWorkspacesWithSubmissionStats', () => ({ - ...jest.requireActual('src/workspaces/list/state/useWorkspacesWithSubmissionStats'), - useWorkspacesWithSubmissionStats: jest.fn(), +type UseWorkspacesExports = typeof import('src/workspaces/common/state/useWorkspaces'); +jest.mock('src/workspaces/common/state/useWorkspaces', () => ({ + ...jest.requireActual('src/workspaces/common/state/useWorkspaces'), + useWorkspaces: jest.fn(), })); -type UseWorkspaceWithSubmissionStatsExports = - typeof import('src/workspaces/list/state/useWorkspacesWithSubmissionStats'); describe('WorkspaceList', () => { afterEach(() => { @@ -66,11 +65,10 @@ describe('WorkspaceList', () => { it('does not poll workspaces that are not deleting', async () => { // Arrange - asMockedFn(useWorkspacesWithSubmissionStats).mockReturnValue({ + asMockedFn(useWorkspaces).mockReturnValue({ workspaces: [defaultAzureWorkspace, defaultGoogleWorkspace], - refresh: () => jest.fn(), - loadingWorkspaces: false, - loadingSubmissionStats: false, + refresh: jest.fn(), + loading: false, }); const mockDetailsFn = jest.fn(); const mockAjax: DeepPartial = { @@ -112,11 +110,10 @@ describe('WorkspaceList', () => { state: 'Deleting', }, }; - asMockedFn(useWorkspacesWithSubmissionStats).mockReturnValue({ + asMockedFn(useWorkspaces).mockReturnValue({ workspaces: [deletingWorkspace, defaultGoogleWorkspace], - refresh: () => jest.fn(), - loadingWorkspaces: false, - loadingSubmissionStats: false, + refresh: jest.fn(), + loading: false, }); const mockDetailsFn: ReturnType['details'] = jest .fn() @@ -183,11 +180,10 @@ describe('WorkspaceList', () => { }, ]; - asMockedFn(useWorkspacesWithSubmissionStats).mockReturnValue({ + asMockedFn(useWorkspaces).mockReturnValue({ workspaces: deletingWorkspaces, - refresh: () => jest.fn(), - loadingWorkspaces: false, - loadingSubmissionStats: false, + refresh: jest.fn(), + loading: false, }); const mockDetailsFn: ReturnType['details'] = jest .fn() diff --git a/src/workspaces/list/WorkspacesList.ts b/src/workspaces/list/WorkspacesList.ts index 0331c0aeec..134f51208c 100644 --- a/src/workspaces/list/WorkspacesList.ts +++ b/src/workspaces/list/WorkspacesList.ts @@ -13,9 +13,9 @@ import { useOnMount } from 'src/libs/react-utils'; import { elements as StyleElements } from 'src/libs/style'; import { newTabLinkProps } from 'src/libs/utils'; import { useDeletionPolling } from 'src/workspaces/common/state/useDeletionPolling'; +import { useWorkspaces } from 'src/workspaces/common/state/useWorkspaces'; import { categorizeWorkspaces } from 'src/workspaces/list/CategorizedWorkspaces'; import { RecentlyViewedWorkspaces } from 'src/workspaces/list/RecentlyViewedWorkspaces'; -import { useWorkspacesWithSubmissionStats } from 'src/workspaces/list/state/useWorkspacesWithSubmissionStats'; import { getWorkspaceFiltersFromQuery, WorkspaceFilters, @@ -32,7 +32,28 @@ export const getWorkspace = (id: string, workspaces: Workspace[]): Workspace => _.find({ workspace: { workspaceId: id } }, workspaces)!; export const WorkspacesList = (): ReactNode => { - const { workspaces, refresh: refreshWorkspaces, loadingWorkspaces } = useWorkspacesWithSubmissionStats(); + const { + workspaces, + refresh: refreshWorkspaces, + loading: loadingWorkspaces, + } = useWorkspaces( + [ + 'accessLevel', + 'public', + 'workspace.attributes.description', + 'workspace.attributes.tag:tags', + 'workspace.authorizationDomain', + 'workspace.cloudPlatform', + 'workspace.createdBy', + 'workspace.lastModified', + 'workspace.name', + 'workspace.namespace', + 'workspace.workspaceId', + 'workspace.state', + 'workspace.errorMessage', + ], + 250 + ); const [featuredList, setFeaturedList] = useState<{ name: string; namespace: string }[]>(); useDeletionPolling(workspaces); diff --git a/src/workspaces/list/state/useWorkspacesWithSubmissionStats.ts b/src/workspaces/list/state/useWorkspacesWithSubmissionStats.ts deleted file mode 100644 index 61ddb94f47..0000000000 --- a/src/workspaces/list/state/useWorkspacesWithSubmissionStats.ts +++ /dev/null @@ -1,71 +0,0 @@ -import _ from 'lodash/fp'; -import { useEffect, useMemo, useState } from 'react'; -import { Ajax } from 'src/libs/ajax'; -import { withErrorReporting } from 'src/libs/error'; -import { useCancellation } from 'src/libs/react-utils'; -import * as Utils from 'src/libs/utils'; -import { useWorkspaces } from 'src/workspaces/common/state/useWorkspaces'; -import { WorkspaceSubmissionStats, WorkspaceWrapper as Workspace } from 'src/workspaces/utils'; - -interface WorkspacesWithSubmissionStatsReturn { - workspaces: Workspace[]; - refresh: () => void; - loadingWorkspaces: boolean; - loadingSubmissionStats: boolean; -} - -export const useWorkspacesWithSubmissionStats = (): WorkspacesWithSubmissionStatsReturn => { - const { - workspaces, - loading: loadingWorkspaces, - refresh, - } = useWorkspaces( - [ - 'accessLevel', - 'public', - 'workspace.attributes.description', - 'workspace.attributes.tag:tags', - 'workspace.authorizationDomain', - 'workspace.cloudPlatform', - 'workspace.createdBy', - 'workspace.lastModified', - 'workspace.name', - 'workspace.namespace', - 'workspace.workspaceId', - 'workspace.state', - 'workspace.errorMessage', - ], - 250 - ); - - const signal = useCancellation(); - const [loadingSubmissionStats, setLoadingSubmissionStats] = useState(true); - const [submissionStats, setSubmissionStats] = useState>(); - - useEffect(() => { - // After the inital load, workspaces are refreshed after deleting a workspace or locking a workspace. - // We don't need to reload submission stats in those cases. - if (workspaces && workspaces.length > 0 && !submissionStats) { - const loadSubmissionStats: () => Promise = _.flow( - withErrorReporting('Error loading submission stats'), - Utils.withBusyState(setLoadingSubmissionStats) - )(async () => { - const response = await Ajax(signal).Workspaces.list(['workspace.workspaceId', 'workspaceSubmissionStats']); - setSubmissionStats( - _.fromPairs(_.map((ws: Workspace) => [ws.workspace.workspaceId, ws.workspaceSubmissionStats], response)) - ); - }) as () => Promise; - - loadSubmissionStats(); - } - }, [workspaces, submissionStats, signal]); - - const workspacesWithSubmissionStats = useMemo(() => { - return _.map( - (ws) => _.set('workspaceSubmissionStats', _.get(ws.workspace.workspaceId, submissionStats), ws), - workspaces - ); - }, [workspaces, submissionStats]); - - return { workspaces: workspacesWithSubmissionStats, refresh, loadingWorkspaces, loadingSubmissionStats }; -};