Skip to content

Commit c93fe8d

Browse files
chore(site): remove template version machine (#10315)
1 parent fe05fd1 commit c93fe8d

File tree

13 files changed

+143
-307
lines changed

13 files changed

+143
-307
lines changed

site/src/api/queries/templateVersions.ts

-15
This file was deleted.

site/src/api/queries/templates.ts

+26
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ export const templateVersion = (versionId: string) => {
5050
};
5151
};
5252

53+
export const templateVersionByName = (
54+
orgId: string,
55+
templateName: string,
56+
versionName: string,
57+
) => {
58+
return {
59+
queryKey: ["templateVersion", orgId, templateName, versionName],
60+
queryFn: () =>
61+
API.getTemplateVersionByName(orgId, templateName, versionName),
62+
};
63+
};
64+
5365
export const templateVersions = (templateId: string) => {
5466
return {
5567
queryKey: ["templateVersions", templateId],
@@ -127,6 +139,20 @@ const createTemplateFn = async (options: {
127139
});
128140
};
129141

142+
export const templateVersionLogs = (versionId: string) => {
143+
return {
144+
queryKey: ["templateVersion", versionId, "logs"],
145+
queryFn: () => API.getTemplateVersionLogs(versionId),
146+
};
147+
};
148+
149+
export const richParameters = (versionId: string) => {
150+
return {
151+
queryKey: ["templateVersion", versionId, "richParameters"],
152+
queryFn: () => API.getTemplateVersionRichParameters(versionId),
153+
};
154+
};
155+
130156
const waitBuildToBeFinished = async (version: TemplateVersion) => {
131157
let data: TemplateVersion;
132158
let jobStatus: ProvisionerJobStatus;
+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { TemplateVersion } from "api/typesGenerated";
2+
import { useTab } from "hooks/useTab";
3+
import { useEffect } from "react";
4+
import { useQuery } from "react-query";
5+
import {
6+
TemplateVersionFiles,
7+
getTemplateVersionFiles,
8+
} from "utils/templateVersion";
9+
import * as API from "api/api";
10+
11+
export const useFileTab = (templateFiles: TemplateVersionFiles | undefined) => {
12+
// Tabs The default tab is the tab that has main.tf but until we loads the
13+
// files and check if main.tf exists we don't know which tab is the default
14+
// one so we just use empty string
15+
const tab = useTab("file", "");
16+
const isLoaded = tab.value !== "";
17+
useEffect(() => {
18+
if (templateFiles && !isLoaded) {
19+
const terraformFileIndex = Object.keys(templateFiles).indexOf("main.tf");
20+
// If main.tf exists use the index if not just use the first tab
21+
tab.set(terraformFileIndex !== -1 ? terraformFileIndex.toString() : "0");
22+
}
23+
}, [isLoaded, tab, templateFiles]);
24+
25+
return {
26+
...tab,
27+
isLoaded,
28+
};
29+
};
30+
31+
export const useTemplateFiles = (
32+
templateName: string,
33+
version: TemplateVersion | undefined,
34+
) => {
35+
return useQuery({
36+
queryKey: ["templateFiles", templateName, version],
37+
queryFn: () => {
38+
if (!version) {
39+
return;
40+
}
41+
return getTemplateFilesWithDiff(templateName, version);
42+
},
43+
enabled: version !== undefined,
44+
});
45+
};
46+
47+
const getTemplateFilesWithDiff = async (
48+
templateName: string,
49+
version: TemplateVersion,
50+
) => {
51+
const previousVersion = await API.getPreviousTemplateVersionByName(
52+
version.organization_id!,
53+
templateName,
54+
version.name,
55+
);
56+
const loadFilesPromises: ReturnType<typeof getTemplateVersionFiles>[] = [];
57+
loadFilesPromises.push(getTemplateVersionFiles(version.job.file_id));
58+
if (previousVersion) {
59+
loadFilesPromises.push(
60+
getTemplateVersionFiles(previousVersion.job.file_id),
61+
);
62+
}
63+
const [currentFiles, previousFiles] = await Promise.all(loadFilesPromises);
64+
return {
65+
currentFiles,
66+
previousFiles,
67+
};
68+
};

site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useQuery, useMutation } from "react-query";
2-
import { templateVersionLogs } from "api/queries/templateVersions";
32
import {
3+
templateVersionLogs,
44
templateByName,
55
templateVersion,
66
templateVersionVariables,

site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useQuery, useMutation } from "react-query";
2-
import { templateVersionLogs } from "api/queries/templateVersions";
32
import {
3+
templateVersionLogs,
44
JobError,
55
createTemplate,
66
templateExamples,

site/src/pages/CreateTemplatePage/UploadTemplateView.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useQuery, useMutation } from "react-query";
2-
import { templateVersionLogs } from "api/queries/templateVersions";
32
import {
3+
templateVersionLogs,
44
JobError,
55
createTemplate,
66
templateVersionVariables,

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import { useMutation, useQuery, useQueryClient } from "react-query";
2222
import {
2323
templateByName,
2424
templateVersionExternalAuth,
25+
richParameters,
2526
} from "api/queries/templates";
2627
import { autoCreateWorkspace, createWorkspace } from "api/queries/workspaces";
2728
import { checkAuthorization } from "api/queries/authCheck";
2829
import { CreateWSPermissions, createWorkspaceChecks } from "./permissions";
29-
import { richParameters } from "api/queries/templateVersions";
3030
import { paramsUsedToCreateWorkspace } from "utils/workspace";
3131
import { useEffectEvent } from "hooks/hookPolyfills";
3232

site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx

+2-65
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,14 @@
1-
import { useQuery } from "react-query";
2-
import { getPreviousTemplateVersionByName } from "api/api";
3-
import { TemplateVersion } from "api/typesGenerated";
41
import { Loader } from "components/Loader/Loader";
52
import { TemplateFiles } from "components/TemplateFiles/TemplateFiles";
63
import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout";
7-
import { useOrganizationId } from "hooks/useOrganizationId";
8-
import { useTab } from "hooks/useTab";
9-
import { FC, useEffect } from "react";
4+
import { FC } from "react";
105
import { Helmet } from "react-helmet-async";
11-
import {
12-
getTemplateVersionFiles,
13-
TemplateVersionFiles,
14-
} from "utils/templateVersion";
156
import { getTemplatePageTitle } from "../utils";
16-
17-
const fetchTemplateFiles = async (
18-
organizationId: string,
19-
templateName: string,
20-
activeVersion: TemplateVersion,
21-
) => {
22-
const previousVersion = await getPreviousTemplateVersionByName(
23-
organizationId,
24-
templateName,
25-
activeVersion.name,
26-
);
27-
const loadFilesPromises: ReturnType<typeof getTemplateVersionFiles>[] = [];
28-
loadFilesPromises.push(getTemplateVersionFiles(activeVersion));
29-
if (previousVersion) {
30-
loadFilesPromises.push(getTemplateVersionFiles(previousVersion));
31-
}
32-
const [currentFiles, previousFiles] = await Promise.all(loadFilesPromises);
33-
return {
34-
currentFiles,
35-
previousFiles,
36-
};
37-
};
38-
39-
const useTemplateFiles = (
40-
organizationId: string,
41-
templateName: string,
42-
activeVersion: TemplateVersion,
43-
) =>
44-
useQuery({
45-
queryKey: ["templateFiles", templateName],
46-
queryFn: () =>
47-
fetchTemplateFiles(organizationId, templateName, activeVersion),
48-
});
49-
50-
const useFileTab = (templateFiles: TemplateVersionFiles | undefined) => {
51-
// Tabs The default tab is the tab that has main.tf but until we loads the
52-
// files and check if main.tf exists we don't know which tab is the default
53-
// one so we just use empty string
54-
const tab = useTab("file", "");
55-
const isLoaded = tab.value !== "";
56-
useEffect(() => {
57-
if (templateFiles && !isLoaded) {
58-
const terraformFileIndex = Object.keys(templateFiles).indexOf("main.tf");
59-
// If main.tf exists use the index if not just use the first tab
60-
tab.set(terraformFileIndex !== -1 ? terraformFileIndex.toString() : "0");
61-
}
62-
}, [isLoaded, tab, templateFiles]);
63-
64-
return {
65-
...tab,
66-
isLoaded,
67-
};
68-
};
7+
import { useFileTab, useTemplateFiles } from "components/TemplateFiles/hooks";
698

709
const TemplateFilesPage: FC = () => {
7110
const { template, activeVersion } = useTemplateLayoutContext();
72-
const orgId = useOrganizationId();
7311
const { data: templateFiles } = useTemplateFiles(
74-
orgId,
7512
template.name,
7613
activeVersion,
7714
);

site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx

+16-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { useMachine } from "@xstate/react";
21
import { usePermissions } from "hooks/usePermissions";
32
import { useOrganizationId } from "hooks/useOrganizationId";
4-
import { useTab } from "hooks/useTab";
53
import { type FC, useMemo } from "react";
64
import { Helmet } from "react-helmet-async";
75
import { useParams } from "react-router-dom";
86
import { pageTitle } from "utils/page";
9-
import { templateVersionMachine } from "xServices/templateVersion/templateVersionXService";
107
import TemplateVersionPageView from "./TemplateVersionPageView";
8+
import { useQuery } from "react-query";
9+
import { templateVersionByName } from "api/queries/templates";
10+
import { useFileTab, useTemplateFiles } from "components/TemplateFiles/hooks";
1111

1212
type Params = {
1313
version: string;
@@ -18,13 +18,16 @@ export const TemplateVersionPage: FC = () => {
1818
const { version: versionName, template: templateName } =
1919
useParams() as Params;
2020
const orgId = useOrganizationId();
21-
const [state] = useMachine(templateVersionMachine, {
22-
context: { templateName, versionName, orgId },
23-
});
24-
const tab = useTab("file", "0");
21+
const templateVersionQuery = useQuery(
22+
templateVersionByName(orgId, templateName, versionName),
23+
);
24+
const { data: templateFiles, error: templateFilesError } = useTemplateFiles(
25+
templateName,
26+
templateVersionQuery.data,
27+
);
28+
const tab = useFileTab(templateFiles?.currentFiles);
2529
const permissions = usePermissions();
26-
27-
const versionId = state.context.currentVersion?.id;
30+
const versionId = templateVersionQuery.data?.id;
2831
const createWorkspaceUrl = useMemo(() => {
2932
const params = new URLSearchParams();
3033
if (versionId) {
@@ -41,7 +44,10 @@ export const TemplateVersionPage: FC = () => {
4144
</Helmet>
4245

4346
<TemplateVersionPageView
44-
context={state.context}
47+
error={templateVersionQuery.error || templateFilesError}
48+
currentVersion={templateVersionQuery.data}
49+
currentFiles={templateFiles?.currentFiles}
50+
previousFiles={templateFiles?.previousFiles}
4551
versionName={versionName}
4652
templateName={templateName}
4753
tab={tab}

site/src/pages/TemplateVersionPage/TemplateVersionPageView.stories.tsx

+14-20
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { action } from "@storybook/addon-actions";
22
import { UseTabResult } from "hooks/useTab";
33
import {
44
mockApiError,
5-
MockOrganization,
65
MockTemplate,
76
MockTemplateVersion,
87
} from "testHelpers/entities";
@@ -32,18 +31,15 @@ const defaultArgs: TemplateVersionPageViewProps = {
3231
tab,
3332
templateName: MockTemplate.name,
3433
versionName: MockTemplateVersion.name,
35-
context: {
36-
templateName: MockTemplate.name,
37-
orgId: MockOrganization.id,
38-
versionName: MockTemplateVersion.name,
39-
currentVersion: MockTemplateVersion,
40-
currentFiles: {
41-
"README.md": readmeContent,
42-
"main.tf": `{}`,
43-
"some.tpl": `{{.Name}}`,
44-
"some.sh": `echo "Hello world"`,
45-
},
34+
currentVersion: MockTemplateVersion,
35+
currentFiles: {
36+
"README.md": readmeContent,
37+
"main.tf": `{}`,
38+
"some.tpl": `{{.Name}}`,
39+
"some.sh": `echo "Hello world"`,
4640
},
41+
previousFiles: undefined,
42+
error: undefined,
4743
};
4844

4945
const meta: Meta<typeof TemplateVersionPageView> = {
@@ -59,13 +55,11 @@ export const Default: Story = {};
5955

6056
export const Error: Story = {
6157
args: {
62-
context: {
63-
...defaultArgs.context,
64-
currentVersion: undefined,
65-
currentFiles: undefined,
66-
error: mockApiError({
67-
message: "Error on loading the template version",
68-
}),
69-
},
58+
...defaultArgs,
59+
currentVersion: undefined,
60+
currentFiles: undefined,
61+
error: mockApiError({
62+
message: "Error on loading the template version",
63+
}),
7064
},
7165
};

site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx

+10-8
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,31 @@ import { UseTabResult } from "hooks/useTab";
1616
import { type FC } from "react";
1717
import { Link as RouterLink } from "react-router-dom";
1818
import { createDayString } from "utils/createDayString";
19-
import { TemplateVersionMachineContext } from "xServices/templateVersion/templateVersionXService";
2019
import { ErrorAlert } from "components/Alert/ErrorAlert";
20+
import { TemplateVersion } from "api/typesGenerated";
21+
import { TemplateVersionFiles } from "utils/templateVersion";
2122

2223
export interface TemplateVersionPageViewProps {
23-
/**
24-
* Used to display the version name before loading the version in the API
25-
*/
2624
versionName: string;
2725
templateName: string;
2826
tab: UseTabResult;
29-
context: TemplateVersionMachineContext;
3027
createWorkspaceUrl?: string;
28+
error: unknown;
29+
currentVersion: TemplateVersion | undefined;
30+
currentFiles: TemplateVersionFiles | undefined;
31+
previousFiles: TemplateVersionFiles | undefined;
3132
}
3233

3334
export const TemplateVersionPageView: FC<TemplateVersionPageViewProps> = ({
34-
context,
3535
tab,
3636
versionName,
3737
templateName,
3838
createWorkspaceUrl,
39+
currentVersion,
40+
currentFiles,
41+
previousFiles,
42+
error,
3943
}) => {
40-
const { currentFiles, error, currentVersion, previousFiles } = context;
41-
4244
return (
4345
<Margins>
4446
<PageHeader

0 commit comments

Comments
 (0)