Skip to content

Commit ab8977c

Browse files
committed
Extract update workspace
1 parent 3e1de93 commit ab8977c

File tree

3 files changed

+50
-77
lines changed

3 files changed

+50
-77
lines changed

site/src/api/queries/workspaces.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,33 @@ export const changeVersion = (
139139
return API.changeWorkspaceVersion(workspace, versionId, buildParameters);
140140
},
141141
onSuccess: (build: WorkspaceBuild) => {
142-
const workspaceKey = workspaceByOwnerAndNameKey(
143-
build.workspace_owner_name,
144-
build.workspace_name,
145-
);
146-
const previousData = queryClient.getQueryData(workspaceKey) as Workspace;
147-
queryClient.setQueryData(workspaceKey, {
148-
...previousData,
149-
latest_build: build,
150-
});
142+
updateWorkspaceBuild(build, queryClient);
151143
},
152144
};
153145
};
146+
147+
export const update = (workspace: Workspace, queryClient: QueryClient) => {
148+
return {
149+
mutationFn: (buildParameters?: WorkspaceBuildParameter[]) => {
150+
return API.updateWorkspace(workspace, buildParameters);
151+
},
152+
onSuccess: (build: WorkspaceBuild) => {
153+
updateWorkspaceBuild(build, queryClient);
154+
},
155+
};
156+
};
157+
158+
const updateWorkspaceBuild = (
159+
build: WorkspaceBuild,
160+
queryClient: QueryClient,
161+
) => {
162+
const workspaceKey = workspaceByOwnerAndNameKey(
163+
build.workspace_owner_name,
164+
build.workspace_name,
165+
);
166+
const previousData = queryClient.getQueryData(workspaceKey) as Workspace;
167+
queryClient.setQueryData(workspaceKey, {
168+
...previousData,
169+
latest_build: build,
170+
});
171+
};

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
changeVersion,
3838
decreaseDeadline,
3939
increaseDeadline,
40+
update,
4041
} from "api/queries/workspaces";
4142
import { getErrorMessage } from "api/errors";
4243
import { displaySuccess, displayError } from "components/GlobalSnackbar/utils";
@@ -76,21 +77,18 @@ export const WorkspaceReadyPage = ({
7677
const queryClient = useQueryClient();
7778
const { buildInfo } = useDashboard();
7879
const featureVisibility = useFeatureVisibility();
79-
const { buildError, cancellationError, missedParameters } =
80-
workspaceState.context;
80+
const { buildError, cancellationError } = workspaceState.context;
8181
if (workspace === undefined) {
8282
throw Error("Workspace is undefined");
8383
}
84-
const canUpdateWorkspace = Boolean(permissions?.updateWorkspace);
85-
const canUpdateTemplate = Boolean(permissions?.updateTemplate);
84+
8685
const { data: deploymentValues } = useQuery({
8786
...deploymentConfig(),
8887
enabled: permissions?.viewDeploymentValues,
8988
});
9089
const canRetryDebugMode = Boolean(
9190
deploymentValues?.config.enable_terraform_debug_mode,
9291
);
93-
const [isConfirmingUpdate, setIsConfirmingUpdate] = useState(false);
9492

9593
// Build logs
9694
const buildLogs = useWorkspaceBuildLogs(workspace.latest_build.id);
@@ -157,6 +155,7 @@ export const WorkspaceReadyPage = ({
157155
}, []);
158156

159157
// Change version
158+
const canChangeVersions = Boolean(permissions?.updateTemplate);
160159
const [changeVersionDialogOpen, setChangeVersionDialogOpen] = useState(false);
161160
const changeVersionMutation = useMutation(
162161
changeVersion(workspace, queryClient),
@@ -172,6 +171,11 @@ export const WorkspaceReadyPage = ({
172171
enabled: workspace.outdated,
173172
});
174173

174+
// Update workspace
175+
const canUpdateWorkspace = Boolean(permissions?.updateWorkspace);
176+
const [isConfirmingUpdate, setIsConfirmingUpdate] = useState(false);
177+
const updateWorkspaceMutation = useMutation(update(workspace, queryClient));
178+
175179
return (
176180
<>
177181
<Helmet>
@@ -198,7 +202,7 @@ export const WorkspaceReadyPage = ({
198202
deadline,
199203
),
200204
}}
201-
isUpdating={workspaceState.matches("ready.build.requestingUpdate")}
205+
isUpdating={updateWorkspaceMutation.isLoading}
202206
isRestarting={isRestarting}
203207
workspace={workspace}
204208
handleStart={(buildParameters) =>
@@ -227,7 +231,7 @@ export const WorkspaceReadyPage = ({
227231
canUpdateWorkspace={canUpdateWorkspace}
228232
updateMessage={latestVersion?.message}
229233
canRetryDebugMode={canRetryDebugMode}
230-
canChangeVersions={canUpdateTemplate}
234+
canChangeVersions={canChangeVersions}
231235
hideSSHButton={featureVisibility["browser_only"]}
232236
hideVSCodeDesktopButton={featureVisibility["browser_only"]}
233237
workspaceErrors={{
@@ -277,15 +281,19 @@ export const WorkspaceReadyPage = ({
277281
}}
278282
/>
279283
<UpdateBuildParametersDialog
280-
missedParameters={missedParameters ?? []}
281-
open={workspaceState.matches(
282-
"ready.build.askingForMissedBuildParameters",
283-
)}
284+
missedParameters={
285+
updateWorkspaceMutation.error instanceof MissingBuildParameters
286+
? updateWorkspaceMutation.error.parameters
287+
: []
288+
}
289+
open={updateWorkspaceMutation.error instanceof MissingBuildParameters}
284290
onClose={() => {
285-
workspaceSend({ type: "CANCEL" });
291+
updateWorkspaceMutation.reset();
286292
}}
287293
onUpdate={(buildParameters) => {
288-
workspaceSend({ type: "UPDATE", buildParameters });
294+
if (updateWorkspaceMutation.error instanceof MissingBuildParameters) {
295+
updateWorkspaceMutation.mutate(buildParameters);
296+
}
289297
}}
290298
/>
291299
<ChangeVersionDialog
@@ -306,7 +314,7 @@ export const WorkspaceReadyPage = ({
306314
<WarningDialog
307315
open={isConfirmingUpdate}
308316
onConfirm={() => {
309-
workspaceSend({ type: "UPDATE" });
317+
updateWorkspaceMutation.mutate(undefined);
310318
setIsConfirmingUpdate(false);
311319
}}
312320
onClose={() => setIsConfirmingUpdate(false)}

site/src/xServices/workspace/workspaceXService.ts

Lines changed: 1 addition & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ export interface WorkspaceContext {
1919
// Builds
2020
builds?: TypesGen.WorkspaceBuild[];
2121
getBuildsError?: unknown;
22-
missedParameters?: TypesGen.TemplateVersionParameter[];
2322
// error creating a new WorkspaceBuild
2423
buildError?: unknown;
2524
cancellationMessage?: TypesGen.Response;
@@ -37,7 +36,6 @@ export type WorkspaceEvent =
3736
| { type: "ASK_DELETE" }
3837
| { type: "DELETE" }
3938
| { type: "CANCEL_DELETE" }
40-
| { type: "UPDATE"; buildParameters?: TypesGen.WorkspaceBuildParameter[] }
4139
| { type: "CANCEL" }
4240
| {
4341
type: "REFRESH_TIMELINE";
@@ -54,9 +52,6 @@ export const workspaceMachine = createMachine(
5452
context: {} as WorkspaceContext,
5553
events: {} as WorkspaceEvent,
5654
services: {} as {
57-
updateWorkspace: {
58-
data: TypesGen.WorkspaceBuild;
59-
};
6055
startWorkspace: {
6156
data: TypesGen.WorkspaceBuild;
6257
};
@@ -92,7 +87,6 @@ export const workspaceMachine = createMachine(
9287
START: "requestingStart",
9388
STOP: "requestingStop",
9489
ASK_DELETE: "askingDelete",
95-
UPDATE: "requestingUpdate",
9690
CANCEL: "requestingCancel",
9791
RETRY_BUILD: [
9892
{
@@ -124,33 +118,6 @@ export const workspaceMachine = createMachine(
124118
},
125119
},
126120
},
127-
requestingUpdate: {
128-
entry: ["clearBuildError"],
129-
invoke: {
130-
src: "updateWorkspace",
131-
onDone: {
132-
target: "idle",
133-
actions: ["assignBuild"],
134-
},
135-
onError: [
136-
{
137-
target: "askingForMissedBuildParameters",
138-
cond: "isMissingBuildParameterError",
139-
actions: ["assignMissedParameters"],
140-
},
141-
{
142-
target: "idle",
143-
actions: ["assignBuildError"],
144-
},
145-
],
146-
},
147-
},
148-
askingForMissedBuildParameters: {
149-
on: {
150-
CANCEL: "idle",
151-
UPDATE: [{ target: "requestingUpdate" }],
152-
},
153-
},
154121
requestingStart: {
155122
entry: ["clearBuildError"],
156123
invoke: {
@@ -283,22 +250,12 @@ export const workspaceMachine = createMachine(
283250
const message = getErrorMessage(data, "Error activate workspace.");
284251
displayError(message);
285252
},
286-
assignMissedParameters: assign({
287-
missedParameters: (_, { data }) => {
288-
if (!(data instanceof API.MissingBuildParameters)) {
289-
throw new Error("data is not a MissingBuildParameters error");
290-
}
291-
return data.parameters;
292-
},
293-
}),
253+
294254
// Debug mode when build fails
295255
enableDebugMode: assign({ createBuildLogLevel: (_) => "debug" as const }),
296256
disableDebugMode: assign({ createBuildLogLevel: (_) => undefined }),
297257
},
298258
guards: {
299-
isMissingBuildParameterError: (_, { data }) => {
300-
return data instanceof API.MissingBuildParameters;
301-
},
302259
lastBuildWasStarting: ({ workspace }) => {
303260
return workspace?.latest_build.transition === "start";
304261
},
@@ -310,16 +267,6 @@ export const workspaceMachine = createMachine(
310267
},
311268
},
312269
services: {
313-
updateWorkspace:
314-
({ workspace }, { buildParameters }) =>
315-
async (send) => {
316-
if (!workspace) {
317-
throw new Error("Workspace is not set");
318-
}
319-
const build = await API.updateWorkspace(workspace, buildParameters);
320-
send({ type: "REFRESH_TIMELINE" });
321-
return build;
322-
},
323270
startWorkspace: (context, data) => async (send) => {
324271
if (context.workspace) {
325272
const startWorkspacePromise = await API.startWorkspace(

0 commit comments

Comments
 (0)