Skip to content

Commit 0af0352

Browse files
committed
refactor: remove workspace error enums
1 parent e97cdd8 commit 0af0352

File tree

4 files changed

+58
-49
lines changed

4 files changed

+58
-49
lines changed

site/src/pages/WorkspacePage/Workspace.stories.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Meta, StoryObj } from "@storybook/react";
33
import { WatchAgentMetadataContext } from "components/Resources/AgentMetadata";
44
import { ProvisionerJobLog } from "api/typesGenerated";
55
import * as Mocks from "testHelpers/entities";
6-
import { Workspace, WorkspaceErrors } from "./Workspace";
6+
import { Workspace } from "./Workspace";
77
import { withReactContext } from "storybook-react-context";
88
import EventSource from "eventsourcemock";
99
import { ProxyContext, getPreferredProxy } from "contexts/ProxyContext";
@@ -133,7 +133,7 @@ export const Failed: Story = {
133133
...Running.args,
134134
workspace: Mocks.MockFailedWorkspace,
135135
workspaceErrors: {
136-
[WorkspaceErrors.BUILD_ERROR]: Mocks.mockApiError({
136+
buildError: Mocks.mockApiError({
137137
message: "A workspace build is already active.",
138138
}),
139139
},
@@ -216,7 +216,7 @@ export const GetBuildsError: Story = {
216216
args: {
217217
...Running.args,
218218
workspaceErrors: {
219-
[WorkspaceErrors.GET_BUILDS_ERROR]: Mocks.mockApiError({
219+
getBuildsError: Mocks.mockApiError({
220220
message: "There is a problem fetching builds.",
221221
}),
222222
},
@@ -227,7 +227,7 @@ export const CancellationError: Story = {
227227
args: {
228228
...Failed.args,
229229
workspaceErrors: {
230-
[WorkspaceErrors.CANCELLATION_ERROR]: Mocks.mockApiError({
230+
cancellationError: Mocks.mockApiError({
231231
message: "Job could not be canceled.",
232232
}),
233233
},

site/src/pages/WorkspacePage/Workspace.tsx

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ import { useLocalStorage } from "hooks";
3030
import AlertTitle from "@mui/material/AlertTitle";
3131
import dayjs from "dayjs";
3232

33-
export enum WorkspaceErrors {
34-
GET_BUILDS_ERROR = "getBuildsError",
35-
BUILD_ERROR = "buildError",
36-
CANCELLATION_ERROR = "cancellationError",
37-
}
33+
export type WorkspaceError =
34+
| "getBuildsError"
35+
| "buildError"
36+
| "cancellationError";
37+
3838
export interface WorkspaceProps {
3939
scheduleProps: {
4040
onDeadlinePlus: (hours: number) => void;
@@ -62,7 +62,7 @@ export interface WorkspaceProps {
6262
canChangeVersions: boolean;
6363
hideSSHButton?: boolean;
6464
hideVSCodeDesktopButton?: boolean;
65-
workspaceErrors: Partial<Record<WorkspaceErrors, unknown>>;
65+
workspaceErrors: Partial<Record<WorkspaceError, unknown>>;
6666
buildInfo?: TypesGen.BuildInfoResponse;
6767
sshPrefix?: string;
6868
template?: TypesGen.Template;
@@ -117,20 +117,12 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
117117
const serverVersion = buildInfo?.version || "";
118118
const { saveLocal, getLocal } = useLocalStorage();
119119

120-
const buildError = Boolean(workspaceErrors[WorkspaceErrors.BUILD_ERROR]) && (
121-
<ErrorAlert
122-
error={workspaceErrors[WorkspaceErrors.BUILD_ERROR]}
123-
dismissible
124-
/>
120+
const buildError = Boolean(workspaceErrors.buildError) && (
121+
<ErrorAlert error={workspaceErrors.buildError} dismissible />
125122
);
126123

127-
const cancellationError = Boolean(
128-
workspaceErrors[WorkspaceErrors.CANCELLATION_ERROR],
129-
) && (
130-
<ErrorAlert
131-
error={workspaceErrors[WorkspaceErrors.CANCELLATION_ERROR]}
132-
dismissible
133-
/>
124+
const cancellationError = Boolean(workspaceErrors.cancellationError) && (
125+
<ErrorAlert error={workspaceErrors.cancellationError} dismissible />
134126
);
135127

136128
let transitionStats: TypesGen.TransitionStats | undefined = undefined;
@@ -346,10 +338,8 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
346338
/>
347339
)}
348340

349-
{workspaceErrors[WorkspaceErrors.GET_BUILDS_ERROR] ? (
350-
<ErrorAlert
351-
error={workspaceErrors[WorkspaceErrors.GET_BUILDS_ERROR]}
352-
/>
341+
{workspaceErrors.getBuildsError ? (
342+
<ErrorAlert error={workspaceErrors.getBuildsError} />
353343
) : (
354344
<BuildsTable
355345
builds={builds}

site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import MenuItem from "@mui/material/MenuItem";
2-
import Menu from "@mui/material/Menu";
3-
import { makeStyles } from "@mui/styles";
4-
import MoreVertOutlined from "@mui/icons-material/MoreVertOutlined";
5-
import { FC, Fragment, ReactNode, useRef, useState } from "react";
6-
import { Workspace, WorkspaceBuildParameter } from "api/typesGenerated";
1+
import { type FC, Fragment, type ReactNode, useRef, useState } from "react";
2+
import { ButtonMapping, actionsByWorkspaceStatus } from "./constants";
3+
import {
4+
type Workspace,
5+
type WorkspaceBuildParameter,
6+
} from "api/typesGenerated";
7+
78
import {
89
ActionLoadingButton,
910
CancelButton,
@@ -14,11 +15,17 @@ import {
1415
UpdateButton,
1516
ActivateButton,
1617
} from "./Buttons";
17-
import { ButtonMapping, actionsByWorkspaceStatus } from "./constants";
18+
19+
import { makeStyles } from "@mui/styles";
20+
import Menu from "@mui/material/Menu";
21+
import MenuItem from "@mui/material/MenuItem";
22+
import IconButton from "@mui/material/IconButton";
23+
1824
import SettingsIcon from "@mui/icons-material/SettingsOutlined";
1925
import HistoryIcon from "@mui/icons-material/HistoryOutlined";
2026
import DeleteIcon from "@mui/icons-material/DeleteOutlined";
21-
import IconButton from "@mui/material/IconButton";
27+
import MoreOptionsIcon from "@mui/icons-material/MoreVertOutlined";
28+
import CloneIcon from "@mui/icons-material/ContentCopyOutlined";
2229

2330
export interface WorkspaceActionsProps {
2431
workspace: Workspace;
@@ -52,16 +59,6 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
5259
isRestarting,
5360
canChangeVersions,
5461
}) => {
55-
const styles = useStyles();
56-
const {
57-
canCancel,
58-
canAcceptJobs,
59-
actions: actionsByStatus,
60-
} = actionsByWorkspaceStatus(workspace, workspace.latest_build.status);
61-
const canBeUpdated = workspace.outdated && canAcceptJobs;
62-
const menuTriggerRef = useRef<HTMLButtonElement>(null);
63-
const [isMenuOpen, setIsMenuOpen] = useState(false);
64-
6562
// A mapping of button type to the corresponding React component
6663
const buttonMapping: ButtonMapping = {
6764
update: <UpdateButton handleAction={handleUpdate} />,
@@ -90,21 +87,35 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
9087
activating: <ActivateButton loading handleAction={handleDormantActivate} />,
9188
};
9289

90+
const styles = useStyles();
91+
const menuTriggerRef = useRef<HTMLButtonElement>(null);
92+
const [isMenuOpen, setIsMenuOpen] = useState(false);
93+
9394
// Returns a function that will execute the action and close the menu
9495
const onMenuItemClick = (actionFn: () => void) => () => {
9596
setIsMenuOpen(false);
9697
actionFn();
9798
};
9899

100+
const {
101+
canCancel,
102+
canAcceptJobs,
103+
actions: actionsByStatus,
104+
} = actionsByWorkspaceStatus(workspace, workspace.latest_build.status);
105+
const canBeUpdated = workspace.outdated && canAcceptJobs;
106+
99107
return (
100108
<div className={styles.actions} data-testid="workspace-actions">
101109
{canBeUpdated &&
102110
(isUpdating ? buttonMapping.updating : buttonMapping.update)}
111+
103112
{isRestarting && buttonMapping.restarting}
113+
104114
{!isRestarting &&
105115
actionsByStatus.map((action) => (
106116
<Fragment key={action}>{buttonMapping[action]}</Fragment>
107117
))}
118+
108119
{canCancel && <CancelButton handleAction={handleCancel} />}
109120
<div>
110121
<IconButton
@@ -117,8 +128,9 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
117128
ref={menuTriggerRef}
118129
onClick={() => setIsMenuOpen(true)}
119130
>
120-
<MoreVertOutlined />
131+
<MoreOptionsIcon />
121132
</IconButton>
133+
122134
<Menu
123135
id="workspace-options"
124136
anchorEl={menuTriggerRef.current}
@@ -129,12 +141,19 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
129141
<SettingsIcon />
130142
Settings
131143
</MenuItem>
144+
132145
{canChangeVersions && (
133146
<MenuItem onClick={onMenuItemClick(handleChangeVersion)}>
134147
<HistoryIcon />
135148
Change version&hellip;
136149
</MenuItem>
137150
)}
151+
152+
<MenuItem>
153+
<CloneIcon />
154+
Clone&hellip;
155+
</MenuItem>
156+
138157
<MenuItem
139158
onClick={onMenuItemClick(handleDelete)}
140159
data-testid="delete-button"

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
} from "utils/schedule";
1414
import { StateFrom } from "xstate";
1515
import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog";
16-
import { Workspace, WorkspaceErrors } from "./Workspace";
16+
import { Workspace } from "./Workspace";
1717
import { pageTitle } from "utils/page";
1818
import { getFaviconByStatus, hasJobError } from "utils/workspace";
1919
import {
@@ -194,9 +194,9 @@ export const WorkspaceReadyPage = ({
194194
hideSSHButton={featureVisibility["browser_only"]}
195195
hideVSCodeDesktopButton={featureVisibility["browser_only"]}
196196
workspaceErrors={{
197-
[WorkspaceErrors.GET_BUILDS_ERROR]: buildsError,
198-
[WorkspaceErrors.BUILD_ERROR]: buildError || restartBuildError,
199-
[WorkspaceErrors.CANCELLATION_ERROR]: cancellationError,
197+
getBuildsError: buildsError,
198+
buildError: buildError || restartBuildError,
199+
cancellationError: cancellationError,
200200
}}
201201
buildInfo={buildInfo}
202202
sshPrefix={sshPrefix}

0 commit comments

Comments
 (0)