mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
124 lines
2.7 KiB
TypeScript
124 lines
2.7 KiB
TypeScript
import { Workspace, WorkspaceStatus } from "api/typesGenerated";
|
|
import { ReactNode } from "react";
|
|
import { workspaceUpdatePolicy } from "utils/workspace";
|
|
|
|
// the button types we have
|
|
export enum ButtonTypesEnum {
|
|
start = "start",
|
|
starting = "starting",
|
|
stop = "stop",
|
|
stopping = "stopping",
|
|
restart = "restart",
|
|
restarting = "restarting",
|
|
deleting = "deleting",
|
|
update = "update",
|
|
updating = "updating",
|
|
activate = "activate",
|
|
activating = "activating",
|
|
// disabled buttons
|
|
canceling = "canceling",
|
|
deleted = "deleted",
|
|
pending = "pending",
|
|
}
|
|
|
|
export type ButtonMapping = {
|
|
[key in ButtonTypesEnum]: ReactNode;
|
|
};
|
|
|
|
interface WorkspaceAbilities {
|
|
actions: ButtonTypesEnum[];
|
|
canCancel: boolean;
|
|
canAcceptJobs: boolean;
|
|
}
|
|
|
|
export const actionsByWorkspaceStatus = (
|
|
workspace: Workspace,
|
|
status: WorkspaceStatus,
|
|
canChangeVersions: boolean,
|
|
): WorkspaceAbilities => {
|
|
if (workspace.dormant_at) {
|
|
return {
|
|
actions: [ButtonTypesEnum.activate],
|
|
canCancel: false,
|
|
canAcceptJobs: false,
|
|
};
|
|
}
|
|
if (
|
|
workspace.outdated &&
|
|
workspaceUpdatePolicy(workspace, canChangeVersions) === "always"
|
|
) {
|
|
if (status === "running") {
|
|
return {
|
|
actions: [ButtonTypesEnum.stop],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
};
|
|
}
|
|
if (status === "stopped") {
|
|
return {
|
|
actions: [],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
};
|
|
}
|
|
}
|
|
return statusToActions[status];
|
|
};
|
|
|
|
const statusToActions: Record<WorkspaceStatus, WorkspaceAbilities> = {
|
|
starting: {
|
|
actions: [ButtonTypesEnum.starting],
|
|
canCancel: true,
|
|
canAcceptJobs: false,
|
|
},
|
|
running: {
|
|
actions: [ButtonTypesEnum.stop, ButtonTypesEnum.restart],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
},
|
|
stopping: {
|
|
actions: [ButtonTypesEnum.stopping],
|
|
canCancel: true,
|
|
canAcceptJobs: false,
|
|
},
|
|
stopped: {
|
|
actions: [ButtonTypesEnum.start],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
},
|
|
canceled: {
|
|
actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
},
|
|
// in the case of an error
|
|
failed: {
|
|
actions: [ButtonTypesEnum.start, ButtonTypesEnum.stop],
|
|
canCancel: false,
|
|
canAcceptJobs: true,
|
|
},
|
|
/**
|
|
* disabled states
|
|
*/
|
|
canceling: {
|
|
actions: [ButtonTypesEnum.canceling],
|
|
canCancel: false,
|
|
canAcceptJobs: false,
|
|
},
|
|
deleting: {
|
|
actions: [ButtonTypesEnum.deleting],
|
|
canCancel: true,
|
|
canAcceptJobs: false,
|
|
},
|
|
deleted: {
|
|
actions: [ButtonTypesEnum.deleted],
|
|
canCancel: false,
|
|
canAcceptJobs: false,
|
|
},
|
|
pending: {
|
|
actions: [ButtonTypesEnum.pending],
|
|
canCancel: false,
|
|
canAcceptJobs: false,
|
|
},
|
|
};
|