Skip to content

Commit 2416958

Browse files
committed
refactor: remove enums from workspace actions
1 parent f793fe4 commit 2416958

File tree

2 files changed

+54
-74
lines changed

2 files changed

+54
-74
lines changed

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

Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,10 @@ import {
1414
UpdateButton,
1515
ActivateButton,
1616
} from "./Buttons";
17-
import {
18-
ButtonMapping,
19-
ButtonTypesEnum,
20-
actionsByWorkspaceStatus,
21-
} from "./constants";
22-
import SettingsOutlined from "@mui/icons-material/SettingsOutlined";
23-
import HistoryOutlined from "@mui/icons-material/HistoryOutlined";
24-
import DeleteOutlined from "@mui/icons-material/DeleteOutlined";
17+
import { ButtonMapping, actionsByWorkspaceStatus } from "./constants";
18+
import SettingsIcon from "@mui/icons-material/SettingsOutlined";
19+
import HistoryIcon from "@mui/icons-material/HistoryOutlined";
20+
import DeleteIcon from "@mui/icons-material/DeleteOutlined";
2521
import IconButton from "@mui/material/IconButton";
2622

2723
export interface WorkspaceActionsProps {
@@ -68,40 +64,30 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
6864

6965
// A mapping of button type to the corresponding React component
7066
const buttonMapping: ButtonMapping = {
71-
[ButtonTypesEnum.update]: <UpdateButton handleAction={handleUpdate} />,
72-
[ButtonTypesEnum.updating]: (
73-
<UpdateButton loading handleAction={handleUpdate} />
74-
),
75-
[ButtonTypesEnum.start]: (
76-
<StartButton workspace={workspace} handleAction={handleStart} />
77-
),
78-
[ButtonTypesEnum.starting]: (
67+
update: <UpdateButton handleAction={handleUpdate} />,
68+
updating: <UpdateButton loading handleAction={handleUpdate} />,
69+
start: <StartButton workspace={workspace} handleAction={handleStart} />,
70+
starting: (
7971
<StartButton loading workspace={workspace} handleAction={handleStart} />
8072
),
81-
[ButtonTypesEnum.stop]: <StopButton handleAction={handleStop} />,
82-
[ButtonTypesEnum.stopping]: (
83-
<StopButton loading handleAction={handleStop} />
84-
),
85-
[ButtonTypesEnum.restart]: (
73+
stop: <StopButton handleAction={handleStop} />,
74+
stopping: <StopButton loading handleAction={handleStop} />,
75+
restart: (
8676
<RestartButton workspace={workspace} handleAction={handleRestart} />
8777
),
88-
[ButtonTypesEnum.restarting]: (
78+
restarting: (
8979
<RestartButton
9080
loading
9181
workspace={workspace}
9282
handleAction={handleRestart}
9383
/>
9484
),
95-
[ButtonTypesEnum.deleting]: <ActionLoadingButton label="Deleting" />,
96-
[ButtonTypesEnum.canceling]: <DisabledButton label="Canceling..." />,
97-
[ButtonTypesEnum.deleted]: <DisabledButton label="Deleted" />,
98-
[ButtonTypesEnum.pending]: <ActionLoadingButton label="Pending..." />,
99-
[ButtonTypesEnum.activate]: (
100-
<ActivateButton handleAction={handleDormantActivate} />
101-
),
102-
[ButtonTypesEnum.activating]: (
103-
<ActivateButton loading handleAction={handleDormantActivate} />
104-
),
85+
deleting: <ActionLoadingButton label="Deleting" />,
86+
canceling: <DisabledButton label="Canceling..." />,
87+
deleted: <DisabledButton label="Deleted" />,
88+
pending: <ActionLoadingButton label="Pending..." />,
89+
activate: <ActivateButton handleAction={handleDormantActivate} />,
90+
activating: <ActivateButton loading handleAction={handleDormantActivate} />,
10591
};
10692

10793
// Returns a function that will execute the action and close the menu
@@ -113,10 +99,8 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
11399
return (
114100
<div className={styles.actions} data-testid="workspace-actions">
115101
{canBeUpdated &&
116-
(isUpdating
117-
? buttonMapping[ButtonTypesEnum.updating]
118-
: buttonMapping[ButtonTypesEnum.update])}
119-
{isRestarting && buttonMapping[ButtonTypesEnum.restarting]}
102+
(isUpdating ? buttonMapping.updating : buttonMapping.update)}
103+
{isRestarting && buttonMapping.restarting}
120104
{!isRestarting &&
121105
actionsByStatus.map((action) => (
122106
<Fragment key={action}>{buttonMapping[action]}</Fragment>
@@ -142,20 +126,20 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
142126
onClose={() => setIsMenuOpen(false)}
143127
>
144128
<MenuItem onClick={onMenuItemClick(handleSettings)}>
145-
<SettingsOutlined />
129+
<SettingsIcon />
146130
Settings
147131
</MenuItem>
148132
{canChangeVersions && (
149133
<MenuItem onClick={onMenuItemClick(handleChangeVersion)}>
150-
<HistoryOutlined />
134+
<HistoryIcon />
151135
Change version&hellip;
152136
</MenuItem>
153137
)}
154138
<MenuItem
155139
onClick={onMenuItemClick(handleDelete)}
156140
data-testid="delete-button"
157141
>
158-
<DeleteOutlined />
142+
<DeleteIcon />
159143
Delete&hellip;
160144
</MenuItem>
161145
</Menu>
Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
1-
import { Workspace, WorkspaceStatus } from "api/typesGenerated";
2-
import { ReactNode } from "react";
1+
import { type Workspace, type WorkspaceStatus } from "api/typesGenerated";
2+
import { type ReactElement } from "react";
33

4-
// the button types we have
5-
export enum ButtonTypesEnum {
6-
start = "start",
7-
starting = "starting",
8-
stop = "stop",
9-
stopping = "stopping",
10-
restart = "restart",
11-
restarting = "restarting",
12-
deleting = "deleting",
13-
update = "update",
14-
updating = "updating",
15-
activate = "activate",
16-
activating = "activating",
17-
// disabled buttons
18-
canceling = "canceling",
19-
deleted = "deleted",
20-
pending = "pending",
21-
}
4+
/**
5+
* Buttons supported by workspace actions. Canceling, Deleted, and Pending
6+
* should all be associated with disabled states
7+
*/
8+
type ButtonType =
9+
| Exclude<WorkspaceStatus, "failed" | "canceled" | "running" | "stopped">
10+
| "start"
11+
| "stop"
12+
| "restart"
13+
| "restarting"
14+
| "update"
15+
| "updating"
16+
| "activate"
17+
| "activating";
2218

2319
export type ButtonMapping = {
24-
[key in ButtonTypesEnum]: ReactNode;
20+
[key in ButtonType]: ReactElement;
2521
};
2622

2723
interface WorkspaceAbilities {
28-
actions: ButtonTypesEnum[];
24+
actions: readonly ButtonType[];
2925
canCancel: boolean;
3026
canAcceptJobs: boolean;
3127
}
@@ -36,67 +32,67 @@ export const actionsByWorkspaceStatus = (
3632
): WorkspaceAbilities => {
3733
if (workspace.dormant_at) {
3834
return {
39-
actions: [ButtonTypesEnum.activate],
35+
actions: ["activate"],
4036
canCancel: false,
4137
canAcceptJobs: false,
4238
};
4339
}
4440
return statusToActions[status];
4541
};
4642

47-
const statusToActions: Record<WorkspaceStatus, WorkspaceAbilities> = {
43+
const statusToActions = {
4844
starting: {
49-
actions: [ButtonTypesEnum.starting],
45+
actions: ["starting"],
5046
canCancel: true,
5147
canAcceptJobs: false,
5248
},
5349
running: {
54-
actions: [ButtonTypesEnum.stop, ButtonTypesEnum.restart],
50+
actions: ["stop", "restart"],
5551
canCancel: false,
5652
canAcceptJobs: true,
5753
},
5854
stopping: {
59-
actions: [ButtonTypesEnum.stopping],
55+
actions: ["stopping"],
6056
canCancel: true,
6157
canAcceptJobs: false,
6258
},
6359
stopped: {
64-
actions: [ButtonTypesEnum.start],
60+
actions: ["start"],
6561
canCancel: false,
6662
canAcceptJobs: true,
6763
},
6864
canceled: {
69-
actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop],
65+
actions: ["start", "stop"],
7066
canCancel: false,
7167
canAcceptJobs: true,
7268
},
7369
// in the case of an error
7470
failed: {
75-
actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop],
71+
actions: ["start", "stop"],
7672
canCancel: false,
7773
canAcceptJobs: true,
7874
},
7975
/**
8076
* disabled states
8177
*/
8278
canceling: {
83-
actions: [ButtonTypesEnum.canceling],
79+
actions: ["canceling"],
8480
canCancel: false,
8581
canAcceptJobs: false,
8682
},
8783
deleting: {
88-
actions: [ButtonTypesEnum.deleting],
84+
actions: ["deleting"],
8985
canCancel: true,
9086
canAcceptJobs: false,
9187
},
9288
deleted: {
93-
actions: [ButtonTypesEnum.deleted],
89+
actions: ["deleted"],
9490
canCancel: false,
9591
canAcceptJobs: false,
9692
},
9793
pending: {
98-
actions: [ButtonTypesEnum.pending],
94+
actions: ["pending"],
9995
canCancel: false,
10096
canAcceptJobs: false,
10197
},
102-
};
98+
} as const satisfies Record<WorkspaceStatus, WorkspaceAbilities>;

0 commit comments

Comments
 (0)