Skip to content

Commit 4d63a47

Browse files
fix(site): fix infinity loading when template has no previous version (coder#12059)
1 parent 040ce40 commit 4d63a47

File tree

4 files changed

+72
-8
lines changed

4 files changed

+72
-8
lines changed

site/src/api/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ export const getPreviousTemplateVersionByName = async (
321321
organizationId: string,
322322
templateName: string,
323323
versionName: string,
324-
): Promise<GetPreviousTemplateVersionByNameResponse> => {
324+
) => {
325325
try {
326326
const response = await axios.get<TypesGen.TemplateVersion>(
327327
`/api/v2/organizations/${organizationId}/templates/${templateName}/versions/${versionName}/previous`,

site/src/api/queries/templates.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,12 +266,15 @@ export const previousTemplateVersion = (
266266
versionName,
267267
"previous",
268268
],
269-
queryFn: () =>
270-
API.getPreviousTemplateVersionByName(
269+
queryFn: async () => {
270+
const result = await API.getPreviousTemplateVersionByName(
271271
organizationId,
272272
templateName,
273273
versionName,
274-
),
274+
);
275+
276+
return result ?? null;
277+
},
275278
};
276279
};
277280

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { render, screen } from "@testing-library/react";
2+
import { AppProviders } from "App";
3+
import { RequireAuth } from "contexts/auth/RequireAuth";
4+
import { RouterProvider, createMemoryRouter } from "react-router-dom";
5+
import { TemplateLayout } from "../TemplateLayout";
6+
import TemplateFilesPage from "./TemplateFilesPage";
7+
import { MockTemplate } from "testHelpers/entities";
8+
import { server } from "testHelpers/server";
9+
import { rest } from "msw";
10+
11+
// Occasionally, Jest encounters HTML5 canvas errors. As the SyntaxHighlight is
12+
// not required for these tests, we can safely mock it.
13+
jest.mock("components/SyntaxHighlighter/SyntaxHighlighter", () => ({
14+
SyntaxHighlighter: () => <div data-testid="syntax-highlighter" />,
15+
}));
16+
17+
test("displays the template files even when there is no previous version", async () => {
18+
server.use(
19+
rest.get(
20+
"/api/v2/organizations/:orgId/templates/:template/versions/:version/previous",
21+
(req, res, ctx) => {
22+
return res(ctx.status(404));
23+
},
24+
),
25+
);
26+
27+
render(
28+
<AppProviders>
29+
<RouterProvider
30+
router={createMemoryRouter(
31+
[
32+
{
33+
element: <RequireAuth />,
34+
children: [
35+
{
36+
element: <TemplateLayout />,
37+
children: [
38+
{
39+
path: "/templates/:template/files",
40+
element: <TemplateFilesPage />,
41+
},
42+
],
43+
},
44+
],
45+
},
46+
],
47+
{
48+
initialEntries: [`/templates/${MockTemplate.name}/files`],
49+
},
50+
)}
51+
/>
52+
</AppProviders>,
53+
);
54+
55+
await screen.findByTestId("syntax-highlighter");
56+
});

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,26 @@ const TemplateFilesPage: FC = () => {
1414
const { data: currentFiles } = useQuery(
1515
templateFiles(activeVersion.job.file_id),
1616
);
17-
const { data: previousTemplate } = useQuery(
17+
const previousVersionQuery = useQuery(
1818
previousTemplateVersion(orgId, template.name, activeVersion.name),
1919
);
20+
const previousVersion = previousVersionQuery.data;
21+
const hasPreviousVersion =
22+
previousVersionQuery.isSuccess && previousVersion !== null;
2023
const { data: previousFiles } = useQuery({
21-
...templateFiles(previousTemplate?.job.file_id ?? ""),
22-
enabled: Boolean(previousTemplate),
24+
...templateFiles(previousVersion?.job.file_id ?? ""),
25+
enabled: hasPreviousVersion,
2326
});
27+
const shouldDisplayFiles =
28+
currentFiles && (!hasPreviousVersion || previousFiles);
2429

2530
return (
2631
<>
2732
<Helmet>
2833
<title>{getTemplatePageTitle("Source Code", template)}</title>
2934
</Helmet>
3035

31-
{previousFiles && currentFiles ? (
36+
{shouldDisplayFiles ? (
3237
<TemplateFiles
3338
currentFiles={currentFiles}
3439
baseFiles={previousFiles}

0 commit comments

Comments
 (0)