Skip to content

Commit 7bb0061

Browse files
chore(site): remove workspace build machine (coder#9813)
1 parent df0c597 commit 7bb0061

File tree

6 files changed

+70
-212
lines changed

6 files changed

+70
-212
lines changed

site/src/api/api.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -792,11 +792,11 @@ export const getWorkspaceBuildByNumber = async (
792792
};
793793

794794
export const getWorkspaceBuildLogs = async (
795-
buildname: string,
795+
buildId: string,
796796
before: Date,
797797
): Promise<TypesGen.ProvisionerJobLog[]> => {
798798
const response = await axios.get<TypesGen.ProvisionerJobLog[]>(
799-
`/api/v2/workspacebuilds/${buildname}/logs?before=${before.getTime()}`,
799+
`/api/v2/workspacebuilds/${buildId}/logs?before=${before.getTime()}`,
800800
);
801801
return response.data;
802802
};
@@ -1432,8 +1432,8 @@ export const watchWorkspaceAgentLogs = (
14321432
type WatchBuildLogsByBuildIdOptions = {
14331433
after?: number;
14341434
onMessage: (log: TypesGen.ProvisionerJobLog) => void;
1435-
onDone: () => void;
1436-
onError: (error: Error) => void;
1435+
onDone?: () => void;
1436+
onError?: (error: Error) => void;
14371437
};
14381438
export const watchBuildLogsByBuildId = (
14391439
buildId: string,
@@ -1454,12 +1454,12 @@ export const watchBuildLogsByBuildId = (
14541454
onMessage(JSON.parse(event.data) as TypesGen.ProvisionerJobLog),
14551455
);
14561456
socket.addEventListener("error", () => {
1457-
onError(new Error("Connection for logs failed."));
1457+
onError && onError(new Error("Connection for logs failed."));
14581458
socket.close();
14591459
});
14601460
socket.addEventListener("close", () => {
14611461
// When the socket closes, logs have finished streaming!
1462-
onDone();
1462+
onDone && onDone();
14631463
});
14641464
return socket;
14651465
};
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as API from "api/api";
2+
3+
export const workspaceBuildByNumber = (
4+
username: string,
5+
workspaceName: string,
6+
buildNumber: number,
7+
) => {
8+
return {
9+
queryKey: [username, workspaceName, "workspaceBuild", buildNumber],
10+
queryFn: () =>
11+
API.getWorkspaceBuildByNumber(username, workspaceName, buildNumber),
12+
};
13+
};
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { watchBuildLogsByBuildId } from "api/api";
2+
import { ProvisionerJobLog } from "api/typesGenerated";
3+
import { displayError } from "components/GlobalSnackbar/utils";
4+
import { useState, useEffect } from "react";
5+
6+
// buildId is optional because sometimes the build is not loaded yet
7+
export const useWorkspaceBuildLogs = (buildId?: string) => {
8+
const [logs, setLogs] = useState<ProvisionerJobLog[]>();
9+
useEffect(() => {
10+
if (!buildId) {
11+
return;
12+
}
13+
14+
// Every time this hook is called reset the values
15+
setLogs(undefined);
16+
17+
const socket = watchBuildLogsByBuildId(buildId, {
18+
// Retrieve all the logs
19+
after: -1,
20+
onMessage: (log) => {
21+
setLogs((previousLogs) => {
22+
if (!previousLogs) {
23+
return [log];
24+
}
25+
return [...previousLogs, log];
26+
});
27+
},
28+
onError: () => {
29+
displayError("Error on getting the build logs");
30+
},
31+
});
32+
33+
return () => {
34+
socket.close();
35+
};
36+
}, [buildId]);
37+
38+
return logs;
39+
};

site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { useMachine } from "@xstate/react";
2-
import { FC, useEffect } from "react";
1+
import { FC } from "react";
32
import { Helmet } from "react-helmet-async";
43
import { useParams } from "react-router-dom";
5-
import { pageTitle } from "../../utils/page";
6-
import { workspaceBuildMachine } from "../../xServices/workspaceBuild/workspaceBuildXService";
4+
import { pageTitle } from "utils/page";
75
import { WorkspaceBuildPageView } from "./WorkspaceBuildPageView";
86
import { useQuery } from "@tanstack/react-query";
97
import { getWorkspaceBuilds } from "api/api";
108
import dayjs from "dayjs";
9+
import { workspaceBuildByNumber } from "api/queries/workspaceBuilds";
10+
import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs";
1111

1212
export const WorkspaceBuildPage: FC = () => {
1313
const params = useParams() as {
@@ -18,10 +18,11 @@ export const WorkspaceBuildPage: FC = () => {
1818
const workspaceName = params.workspace;
1919
const buildNumber = Number(params.buildNumber);
2020
const username = params.username.replace("@", "");
21-
const [buildState, send] = useMachine(workspaceBuildMachine, {
22-
context: { username, workspaceName, buildNumber, timeCursor: new Date() },
21+
const wsBuildQuery = useQuery({
22+
...workspaceBuildByNumber(username, workspaceName, buildNumber),
23+
keepPreviousData: true,
2324
});
24-
const { logs, build } = buildState.context;
25+
const build = wsBuildQuery.data;
2526
const { data: builds } = useQuery({
2627
queryKey: ["builds", username, build?.workspace_id],
2728
queryFn: () => {
@@ -32,10 +33,7 @@ export const WorkspaceBuildPage: FC = () => {
3233
},
3334
enabled: Boolean(build),
3435
});
35-
36-
useEffect(() => {
37-
send("RESET", { buildNumber, timeCursor: new Date() });
38-
}, [buildNumber, send]);
36+
const logs = useWorkspaceBuildLogs(build?.id);
3937

4038
return (
4139
<>

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

+3-22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useActor, useMachine } from "@xstate/react";
1+
import { useActor } from "@xstate/react";
22
import { useDashboard } from "components/Dashboard/DashboardProvider";
33
import dayjs from "dayjs";
44
import { useFeatureVisibility } from "hooks/useFeatureVisibility";
@@ -28,12 +28,12 @@ import {
2828
ConfirmDialog,
2929
ConfirmDialogProps,
3030
} from "components/Dialogs/ConfirmDialog/ConfirmDialog";
31-
import { workspaceBuildMachine } from "xServices/workspaceBuild/workspaceBuildXService";
3231
import * as TypesGen from "api/typesGenerated";
3332
import { WorkspaceBuildLogsSection } from "./WorkspaceBuildLogsSection";
3433
import { templateVersion, templateVersions } from "api/queries/templates";
3534
import { Alert } from "components/Alert/Alert";
3635
import { Stack } from "components/Stack/Stack";
36+
import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs";
3737

3838
interface WorkspaceReadyPageProps {
3939
workspaceState: StateFrom<typeof workspaceMachine>;
@@ -91,7 +91,7 @@ export const WorkspaceReadyPage = ({
9191
enabled: workspace.outdated,
9292
});
9393

94-
const buildLogs = useBuildLogs(workspace);
94+
const buildLogs = useWorkspaceBuildLogs(workspace.latest_build.id);
9595
const shouldDisplayBuildLogs =
9696
hasJobError(workspace) ||
9797
["canceling", "deleting", "pending", "starting", "stopping"].includes(
@@ -285,22 +285,3 @@ const WarningDialog: FC<
285285
> = (props) => {
286286
return <ConfirmDialog type="info" hideCancel={false} {...props} />;
287287
};
288-
289-
const useBuildLogs = (workspace: TypesGen.Workspace) => {
290-
const buildNumber = workspace.latest_build.build_number;
291-
const [buildState, buildSend] = useMachine(workspaceBuildMachine, {
292-
context: {
293-
buildNumber,
294-
username: workspace.owner_name,
295-
workspaceName: workspace.name,
296-
timeCursor: new Date(),
297-
},
298-
});
299-
const { logs } = buildState.context;
300-
301-
useEffect(() => {
302-
buildSend({ type: "RESET", buildNumber, timeCursor: new Date() });
303-
}, [buildNumber, buildSend]);
304-
305-
return logs;
306-
};

site/src/xServices/workspaceBuild/workspaceBuildXService.ts

-173
This file was deleted.

0 commit comments

Comments
 (0)