From b78f0b5f1da1b92df128c2e9c401a00a056591ba Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Tue, 7 Jun 2022 18:31:13 +0000 Subject: [PATCH 1/6] added deleted workspace banner --- site/src/api/api.ts | 5 ++- site/src/components/Workspace/Workspace.tsx | 12 +++++- .../WorkspaceDeletedBanner.tsx | 41 +++++++++++++++++++ .../src/pages/WorkspacePage/WorkspacePage.tsx | 4 +- site/src/util/workspace.ts | 2 +- .../xServices/workspace/workspaceXService.ts | 2 + 6 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 4e06ccc5306e8..31280e379b584 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -107,8 +107,9 @@ export const getTemplateVersionResources = async (versionId: string): Promise => { - const response = await axios.get(`/api/v2/workspaces/${workspaceId}`) +export const getWorkspace = async (workspaceId: string, params?: any): Promise => { + console.log("in here", params) + const response = await axios.get(`/api/v2/workspaces/${workspaceId}`, { params }) return response.data } diff --git a/site/src/components/Workspace/Workspace.tsx b/site/src/components/Workspace/Workspace.tsx index 3903dcdd2a1c6..fc7f24ca07e19 100644 --- a/site/src/components/Workspace/Workspace.tsx +++ b/site/src/components/Workspace/Workspace.tsx @@ -3,10 +3,12 @@ import Typography from "@material-ui/core/Typography" import { FC } from "react" import * as TypesGen from "../../api/typesGenerated" import { MONOSPACE_FONT_FAMILY } from "../../theme/constants" +import { getWorkspaceStatus, succeededToStatus } from "../../util/workspace" import { BuildsTable } from "../BuildsTable/BuildsTable" import { Resources } from "../Resources/Resources" import { Stack } from "../Stack/Stack" import { WorkspaceActions } from "../WorkspaceActions/WorkspaceActions" +import { WorkspaceDeletedBanner } from "../WorkspaceDeletedBanner/WorkspaceDeletedBanner" import { WorkspaceSchedule } from "../WorkspaceSchedule/WorkspaceSchedule" import { WorkspaceScheduleBanner } from "../WorkspaceScheduleBanner/WorkspaceScheduleBanner" import { WorkspaceSection } from "../WorkspaceSection/WorkspaceSection" @@ -44,7 +46,9 @@ export const Workspace: FC = ({ builds, }) => { const styles = useStyles() - + console.log("workspace", workspace) + const isDeleted = getWorkspaceStatus(workspace.latest_build) === succeededToStatus["delete"] + console.log("isDeleted", isDeleted) return (
@@ -82,9 +86,13 @@ export const Workspace: FC = ({ workspace={workspace} /> + {isDeleted && } + - + {!!resources && !!resources.length && ( + + )} diff --git a/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx new file mode 100644 index 0000000000000..23abfe4cc86ea --- /dev/null +++ b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx @@ -0,0 +1,41 @@ +import Button from "@material-ui/core/Button" +import { makeStyles } from "@material-ui/core/styles" +import Alert from "@material-ui/lab/Alert" +import AlertTitle from "@material-ui/lab/AlertTitle" +import { FC } from "react" +import { useNavigate } from "react-router-dom" + +const Language = { + bannerTitle: "This workspace has been deleted and cannot be edited.", + createWorkspaceCta: "Create new workspace", +} + +export const WorkspaceDeletedBanner: FC = () => { + const styles = useStyles() + const navigate = useNavigate() + + return ( + navigate(`/workspaces/new`)} size="small"> + {Language.createWorkspaceCta} + + } + severity="warning" + > + {Language.bannerTitle} + + ) +} + +export const useStyles = makeStyles(() => { + return { + root: { + alignItems: "center", + "& .MuiAlertTitle-root": { + marginBottom: "0px", + }, + }, + } +}) diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index 5dced78ba09e1..9f3762565867f 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -1,6 +1,6 @@ import { useMachine } from "@xstate/react" import React, { useEffect } from "react" -import { useNavigate, useParams } from "react-router-dom" +import { useParams } from "react-router-dom" import { DeleteWorkspaceDialog } from "../../components/DeleteWorkspaceDialog/DeleteWorkspaceDialog" import { ErrorSummary } from "../../components/ErrorSummary/ErrorSummary" import { FullScreenLoader } from "../../components/Loader/FullScreenLoader" @@ -13,7 +13,6 @@ import { workspaceScheduleBannerMachine } from "../../xServices/workspaceSchedul export const WorkspacePage: React.FC = () => { const { workspace: workspaceQueryParam } = useParams() - const navigate = useNavigate() const workspaceId = firstOrItem(workspaceQueryParam, null) const [workspaceState, workspaceSend] = useMachine(workspaceMachine) @@ -60,7 +59,6 @@ export const WorkspacePage: React.FC = () => { handleCancel={() => workspaceSend("CANCEL_DELETE")} handleConfirm={() => { workspaceSend("DELETE") - navigate("/workspaces") }} /> diff --git a/site/src/util/workspace.ts b/site/src/util/workspace.ts index f717e262a4587..3af7a71a7c69c 100644 --- a/site/src/util/workspace.ts +++ b/site/src/util/workspace.ts @@ -25,7 +25,7 @@ const inProgressToStatus: Record = { delete: "deleting", } -const succeededToStatus: Record = { +export const succeededToStatus: Record = { start: "started", stop: "stopped", delete: "deleted", diff --git a/site/src/xServices/workspace/workspaceXService.ts b/site/src/xServices/workspace/workspaceXService.ts index a41ddb578cf27..eedac5871967f 100644 --- a/site/src/xServices/workspace/workspaceXService.ts +++ b/site/src/xServices/workspace/workspaceXService.ts @@ -431,6 +431,7 @@ export const workspaceMachine = createMachine( }, services: { getWorkspace: async (_, event) => { + // { deleted: true } return await API.getWorkspace(event.workspaceId) }, getTemplate: async (context) => { @@ -470,6 +471,7 @@ export const workspaceMachine = createMachine( }, refreshWorkspace: async (context) => { if (context.workspace) { + // need to add {deleted: true} here but there is a BE bug rn return await API.getWorkspace(context.workspace.id) } else { throw Error("Cannot refresh workspace without id") From 2931b60bf0625907e25df8fa94790d9f579b3cd1 Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Wed, 8 Jun 2022 11:29:02 +0000 Subject: [PATCH 2/6] x state pass --- site/src/api/api.ts | 7 ++-- site/src/components/Workspace/Workspace.tsx | 2 -- .../WorkspaceScheduleBanner.tsx | 2 +- .../src/pages/WorkspacePage/WorkspacePage.tsx | 4 +-- .../xServices/workspace/workspaceXService.ts | 32 +++++++++++++++++-- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 70c3445289115..cc1a906ae2991 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -108,8 +108,11 @@ export const getTemplateVersionResources = async (versionId: string): Promise => { - console.log("in here", params) +export const getWorkspace = async ( + workspaceId: string, + params?: TypesGen.WorkspaceOptions, +): Promise => { + console.log("in get Workspace API method", params) const response = await axios.get(`/api/v2/workspaces/${workspaceId}`, { params }) return response.data } diff --git a/site/src/components/Workspace/Workspace.tsx b/site/src/components/Workspace/Workspace.tsx index 2cb2ca176013d..1113f2f4599e2 100644 --- a/site/src/components/Workspace/Workspace.tsx +++ b/site/src/components/Workspace/Workspace.tsx @@ -46,9 +46,7 @@ export const Workspace: FC = ({ builds, }) => { const styles = useStyles() - console.log("workspace", workspace) const isDeleted = getWorkspaceStatus(workspace.latest_build) === succeededToStatus["delete"] - console.log("isDeleted", isDeleted) return ( { if (!isWorkspaceOn(workspace)) { return false } else { - // a mannual shutdown has a deadline of '"0001-01-01T00:00:00Z"' + // a manual shutdown has a deadline of '"0001-01-01T00:00:00Z"' // SEE: #1834 const deadline = dayjs(workspace.latest_build.deadline).utc() const hasDeadline = deadline.year() > 1 diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index f33b1c31cf8ab..7584c8d193a4e 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -1,7 +1,7 @@ import { useMachine } from "@xstate/react" import React, { useEffect } from "react" import { Helmet } from "react-helmet" -import { useNavigate, useParams } from "react-router-dom" +import { useParams } from "react-router-dom" import { DeleteWorkspaceDialog } from "../../components/DeleteWorkspaceDialog/DeleteWorkspaceDialog" import { ErrorSummary } from "../../components/ErrorSummary/ErrorSummary" import { FullScreenLoader } from "../../components/Loader/FullScreenLoader" @@ -13,7 +13,6 @@ import { workspaceScheduleBannerMachine } from "../../xServices/workspaceSchedul export const WorkspacePage: React.FC = () => { const { username: usernameQueryParam, workspace: workspaceQueryParam } = useParams() - const navigate = useNavigate() const username = firstOrItem(usernameQueryParam, null) const workspaceName = firstOrItem(workspaceQueryParam, null) @@ -63,7 +62,6 @@ export const WorkspacePage: React.FC = () => { handleCancel={() => workspaceSend("CANCEL_DELETE")} handleConfirm={() => { workspaceSend("DELETE") - navigate("/workspaces") }} /> diff --git a/site/src/xServices/workspace/workspaceXService.ts b/site/src/xServices/workspace/workspaceXService.ts index d552e961a6b65..9d7e9a2757f34 100644 --- a/site/src/xServices/workspace/workspaceXService.ts +++ b/site/src/xServices/workspace/workspaceXService.ts @@ -58,6 +58,9 @@ export const workspaceMachine = createMachine( getWorkspace: { data: TypesGen.Workspace } + getDeletedWorkspace: { + data: TypesGen.Workspace + } getTemplate: { data: TypesGen.Template } @@ -93,6 +96,9 @@ export const workspaceMachine = createMachine( idle: { tags: "loading", }, + deleted: { + tags: "deleted", + }, gettingWorkspace: { entry: ["clearGetWorkspaceError", "clearContext"], invoke: { @@ -183,10 +189,10 @@ export const workspaceMachine = createMachine( requestingDelete: { entry: "clearBuildError", invoke: { - id: "deleteWorkspace", + id: "deleteWorkspace", // delete the workspace src: "deleteWorkspace", onDone: { - target: "idle", + target: "gettingDeletedWorkspace", actions: ["assignBuild", "refreshTimeline"], }, onError: { @@ -195,6 +201,21 @@ export const workspaceMachine = createMachine( }, }, }, + gettingDeletedWorkspace: { + entry: ["clearGetWorkspaceError", "clearContext"], + invoke: { + id: "getDeletedWorkspace", // request deleted workspace + src: "getDeletedWorkspace", + onDone: { + target: "idle", + actions: ["assignBuild", "refreshTimeline"], + }, + onError: { + target: "idle", // error + actions: ["assignBuildError", "displayBuildError"], + }, + }, + }, requestingCancel: { entry: "clearCancellationMessage", invoke: { @@ -433,6 +454,13 @@ export const workspaceMachine = createMachine( getWorkspace: async (_, event) => { return await API.getWorkspaceByOwnerAndName(event.username, event.workspaceName) }, + getDeletedWorkspace: async (context) => { + if (context.workspace) { + return await API.getWorkspace(context.workspace.id, { deleted: true }) + } else { + throw Error("Cannot get workspace without id") + } + }, getTemplate: async (context) => { if (context.workspace) { return await API.getTemplate(context.workspace.template_id) From e48cc71f0f7949b7aa55add354da907dbfdf3bed Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Thu, 9 Jun 2022 13:31:23 +0000 Subject: [PATCH 3/6] added include_deleted param --- site/src/api/api.ts | 6 ++++-- site/src/xServices/workspace/workspaceXService.ts | 12 +++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index cc1a906ae2991..39de3d7aff046 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -112,7 +112,6 @@ export const getWorkspace = async ( workspaceId: string, params?: TypesGen.WorkspaceOptions, ): Promise => { - console.log("in get Workspace API method", params) const response = await axios.get(`/api/v2/workspaces/${workspaceId}`, { params }) return response.data } @@ -145,8 +144,11 @@ export const getWorkspaces = async (filter?: TypesGen.WorkspaceFilter): Promise< export const getWorkspaceByOwnerAndName = async ( username = "me", workspaceName: string, + params?: TypesGen.WorkspaceByOwnerAndNameParams, ): Promise => { - const response = await axios.get(`/api/v2/users/${username}/workspace/${workspaceName}`) + const response = await axios.get(`/api/v2/users/${username}/workspace/${workspaceName}`, { + params, + }) return response.data } diff --git a/site/src/xServices/workspace/workspaceXService.ts b/site/src/xServices/workspace/workspaceXService.ts index 9d7e9a2757f34..6caf0bced3a48 100644 --- a/site/src/xServices/workspace/workspaceXService.ts +++ b/site/src/xServices/workspace/workspaceXService.ts @@ -189,7 +189,7 @@ export const workspaceMachine = createMachine( requestingDelete: { entry: "clearBuildError", invoke: { - id: "deleteWorkspace", // delete the workspace + id: "deleteWorkspace", src: "deleteWorkspace", onDone: { target: "gettingDeletedWorkspace", @@ -204,14 +204,14 @@ export const workspaceMachine = createMachine( gettingDeletedWorkspace: { entry: ["clearGetWorkspaceError", "clearContext"], invoke: { - id: "getDeletedWorkspace", // request deleted workspace + id: "getDeletedWorkspace", src: "getDeletedWorkspace", onDone: { target: "idle", actions: ["assignBuild", "refreshTimeline"], }, onError: { - target: "idle", // error + target: "idle", actions: ["assignBuildError", "displayBuildError"], }, }, @@ -452,7 +452,7 @@ export const workspaceMachine = createMachine( }, services: { getWorkspace: async (_, event) => { - return await API.getWorkspaceByOwnerAndName(event.username, event.workspaceName) + return await API.getWorkspaceByOwnerAndName(event.username, event.workspaceName, { include_deleted: true }) }, getDeletedWorkspace: async (context) => { if (context.workspace) { @@ -498,7 +498,9 @@ export const workspaceMachine = createMachine( }, refreshWorkspace: async (context) => { if (context.workspace) { - return await API.getWorkspaceByOwnerAndName(context.workspace.owner_name, context.workspace.name) + return await API.getWorkspaceByOwnerAndName(context.workspace.owner_name, context.workspace.name, { + include_deleted: true, + }) } else { throw Error("Cannot refresh workspace without id") } From aa0101ee3537800132c51ec74596a5d5147e7eb7 Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Thu, 9 Jun 2022 13:52:56 +0000 Subject: [PATCH 4/6] clean up x state --- .../xServices/workspace/workspaceXService.ts | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/site/src/xServices/workspace/workspaceXService.ts b/site/src/xServices/workspace/workspaceXService.ts index 6caf0bced3a48..db47ad17d7a5a 100644 --- a/site/src/xServices/workspace/workspaceXService.ts +++ b/site/src/xServices/workspace/workspaceXService.ts @@ -96,9 +96,6 @@ export const workspaceMachine = createMachine( idle: { tags: "loading", }, - deleted: { - tags: "deleted", - }, gettingWorkspace: { entry: ["clearGetWorkspaceError", "clearContext"], invoke: { @@ -191,21 +188,6 @@ export const workspaceMachine = createMachine( invoke: { id: "deleteWorkspace", src: "deleteWorkspace", - onDone: { - target: "gettingDeletedWorkspace", - actions: ["assignBuild", "refreshTimeline"], - }, - onError: { - target: "idle", - actions: ["assignBuildError", "displayBuildError"], - }, - }, - }, - gettingDeletedWorkspace: { - entry: ["clearGetWorkspaceError", "clearContext"], - invoke: { - id: "getDeletedWorkspace", - src: "getDeletedWorkspace", onDone: { target: "idle", actions: ["assignBuild", "refreshTimeline"], @@ -454,13 +436,6 @@ export const workspaceMachine = createMachine( getWorkspace: async (_, event) => { return await API.getWorkspaceByOwnerAndName(event.username, event.workspaceName, { include_deleted: true }) }, - getDeletedWorkspace: async (context) => { - if (context.workspace) { - return await API.getWorkspace(context.workspace.id, { deleted: true }) - } else { - throw Error("Cannot get workspace without id") - } - }, getTemplate: async (context) => { if (context.workspace) { return await API.getTemplate(context.workspace.template_id) From da40d492fc117265e8eaf90ed3d27d2f6a2f8ffe Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Thu, 9 Jun 2022 15:24:20 +0000 Subject: [PATCH 5/6] added teests --- site/src/components/Workspace/Workspace.tsx | 7 ++-- .../WorkspaceDeletedBanner.stories.tsx | 28 +++++++++++++ .../WorkspaceDeletedBanner.tsx | 17 ++++++-- site/src/util/workspace.test.ts | 40 ++++++++++++++++++- site/src/util/workspace.ts | 4 ++ 5 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.stories.tsx diff --git a/site/src/components/Workspace/Workspace.tsx b/site/src/components/Workspace/Workspace.tsx index 1113f2f4599e2..e607017341687 100644 --- a/site/src/components/Workspace/Workspace.tsx +++ b/site/src/components/Workspace/Workspace.tsx @@ -1,7 +1,7 @@ import { makeStyles } from "@material-ui/core/styles" import { FC } from "react" +import { useNavigate } from "react-router-dom" import * as TypesGen from "../../api/typesGenerated" -import { getWorkspaceStatus, succeededToStatus } from "../../util/workspace" import { BuildsTable } from "../BuildsTable/BuildsTable" import { Margins } from "../Margins/Margins" import { PageHeader, PageHeaderSubtitle, PageHeaderTitle } from "../PageHeader/PageHeader" @@ -46,7 +46,8 @@ export const Workspace: FC = ({ builds, }) => { const styles = useStyles() - const isDeleted = getWorkspaceStatus(workspace.latest_build) === succeededToStatus["delete"] + const navigate = useNavigate() + return ( = ({ workspace={workspace} /> - {isDeleted && } + navigate(`/workspaces/new`)} /> diff --git a/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.stories.tsx b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.stories.tsx new file mode 100644 index 0000000000000..a53d234579332 --- /dev/null +++ b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.stories.tsx @@ -0,0 +1,28 @@ +import { action } from "@storybook/addon-actions" +import { Story } from "@storybook/react" +import * as Mocks from "../../testHelpers/entities" +import { WorkspaceDeletedBanner, WorkspaceDeletedBannerProps } from "./WorkspaceDeletedBanner" + +export default { + title: "components/WorkspaceDeletedBanner", + component: WorkspaceDeletedBanner, +} + +const Template: Story = (args) => + +export const Example = Template.bind({}) +Example.args = { + handleClick: action("extend"), + workspace: { + ...Mocks.MockWorkspace, + + latest_build: { + ...Mocks.MockWorkspaceBuild, + job: { + ...Mocks.MockProvisionerJob, + status: "succeeded", + }, + transition: "delete", + }, + }, +} diff --git a/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx index 23abfe4cc86ea..310a18fac95f1 100644 --- a/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx +++ b/site/src/components/WorkspaceDeletedBanner/WorkspaceDeletedBanner.tsx @@ -3,22 +3,31 @@ import { makeStyles } from "@material-ui/core/styles" import Alert from "@material-ui/lab/Alert" import AlertTitle from "@material-ui/lab/AlertTitle" import { FC } from "react" -import { useNavigate } from "react-router-dom" +import * as TypesGen from "../../api/typesGenerated" +import { isWorkspaceDeleted } from "../../util/workspace" const Language = { bannerTitle: "This workspace has been deleted and cannot be edited.", createWorkspaceCta: "Create new workspace", } -export const WorkspaceDeletedBanner: FC = () => { +export interface WorkspaceDeletedBannerProps { + workspace: TypesGen.Workspace + handleClick: () => void +} + +export const WorkspaceDeletedBanner: FC = ({ workspace, handleClick }) => { const styles = useStyles() - const navigate = useNavigate() + + if (!isWorkspaceDeleted(workspace)) { + return null + } return ( navigate(`/workspaces/new`)} size="small"> + } diff --git a/site/src/util/workspace.test.ts b/site/src/util/workspace.test.ts index 7c139b72d0ea1..a7789dfbf8285 100644 --- a/site/src/util/workspace.test.ts +++ b/site/src/util/workspace.test.ts @@ -1,7 +1,7 @@ import dayjs from "dayjs" import * as TypesGen from "../api/typesGenerated" import * as Mocks from "../testHelpers/entities" -import { defaultWorkspaceExtension, isWorkspaceOn, workspaceQueryToFilter } from "./workspace" +import { defaultWorkspaceExtension, isWorkspaceDeleted, isWorkspaceOn, workspaceQueryToFilter } from "./workspace" describe("util > workspace", () => { describe("isWorkspaceOn", () => { @@ -42,6 +42,44 @@ describe("util > workspace", () => { }) }) + describe("isWorkspaceDeleted", () => { + it.each<[TypesGen.WorkspaceTransition, TypesGen.ProvisionerJobStatus, boolean]>([ + ["delete", "canceled", false], + ["delete", "canceling", false], + ["delete", "failed", false], + ["delete", "pending", false], + ["delete", "running", false], + ["delete", "succeeded", true], + + ["stop", "canceled", false], + ["stop", "canceling", false], + ["stop", "failed", false], + ["stop", "pending", false], + ["stop", "running", false], + ["stop", "succeeded", false], + + ["start", "canceled", false], + ["start", "canceling", false], + ["start", "failed", false], + ["start", "pending", false], + ["start", "running", false], + ["start", "succeeded", false], + ])(`transition=%p, status=%p, isWorkspaceDeleted=%p`, (transition, status, isDeleted) => { + const workspace: TypesGen.Workspace = { + ...Mocks.MockWorkspace, + latest_build: { + ...Mocks.MockWorkspaceBuild, + job: { + ...Mocks.MockProvisionerJob, + status, + }, + transition, + }, + } + expect(isWorkspaceDeleted(workspace)).toBe(isDeleted) + }) + }) + describe("defaultWorkspaceExtension", () => { it.each<[string, TypesGen.PutExtendWorkspaceRequest]>([ [ diff --git a/site/src/util/workspace.ts b/site/src/util/workspace.ts index f4446e9ba9c59..a8ebade57ab28 100644 --- a/site/src/util/workspace.ts +++ b/site/src/util/workspace.ts @@ -249,6 +249,10 @@ export const isWorkspaceOn = (workspace: TypesGen.Workspace): boolean => { return transition === "start" && status === "succeeded" } +export const isWorkspaceDeleted = (workspace: TypesGen.Workspace): boolean => { + return getWorkspaceStatus(workspace.latest_build) === succeededToStatus["delete"] +} + export const defaultWorkspaceExtension = (__startDate?: dayjs.Dayjs): TypesGen.PutExtendWorkspaceRequest => { const now = __startDate ? dayjs(__startDate) : dayjs() const fourHoursFromNow = now.add(4, "hours").utc() From b4391e3863e669e4c91cd87fba502cb11241881b Mon Sep 17 00:00:00 2001 From: Kira Pilot Date: Thu, 9 Jun 2022 15:29:51 +0000 Subject: [PATCH 6/6] cleaning up unneeded xstate service --- site/src/util/workspace.ts | 2 +- site/src/xServices/workspace/workspaceXService.ts | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/site/src/util/workspace.ts b/site/src/util/workspace.ts index a8ebade57ab28..94758aebd00d7 100644 --- a/site/src/util/workspace.ts +++ b/site/src/util/workspace.ts @@ -25,7 +25,7 @@ const inProgressToStatus: Record = { delete: "deleting", } -export const succeededToStatus: Record = { +const succeededToStatus: Record = { start: "started", stop: "stopped", delete: "deleted", diff --git a/site/src/xServices/workspace/workspaceXService.ts b/site/src/xServices/workspace/workspaceXService.ts index db47ad17d7a5a..c24c5b968c8de 100644 --- a/site/src/xServices/workspace/workspaceXService.ts +++ b/site/src/xServices/workspace/workspaceXService.ts @@ -58,9 +58,6 @@ export const workspaceMachine = createMachine( getWorkspace: { data: TypesGen.Workspace } - getDeletedWorkspace: { - data: TypesGen.Workspace - } getTemplate: { data: TypesGen.Template }