Skip to content

Commit d126314

Browse files
committed
refactor: clean up CreateWorkspacePage
1 parent 42fb6ca commit d126314

File tree

1 file changed

+32
-49
lines changed

1 file changed

+32
-49
lines changed

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import { useMachine } from "@xstate/react";
2-
import {
3-
TemplateVersionParameter,
4-
WorkspaceBuildParameter,
5-
} from "api/typesGenerated";
2+
import { WorkspaceBuildParameter } from "api/typesGenerated";
63
import { useMe } from "hooks/useMe";
74
import { useOrganizationId } from "hooks/useOrganizationId";
8-
import { type FC, useCallback, useState, useEffect } from "react";
5+
import { type FC, useState, useEffect } from "react";
96
import { Helmet } from "react-helmet-async";
107
import { useNavigate, useParams, useSearchParams } from "react-router-dom";
118
import { pageTitle } from "utils/page";
@@ -30,10 +27,11 @@ export type ExternalAuthPollingState = "idle" | "polling" | "abandoned";
3027

3128
const CreateWorkspacePage: FC = () => {
3229
const organizationId = useOrganizationId();
30+
const [searchParams] = useSearchParams();
3331
const { template: templateName } = useParams() as { template: string };
3432
const me = useMe();
3533
const navigate = useNavigate();
36-
const [searchParams] = useSearchParams();
34+
3735
const defaultBuildParameters = getDefaultBuildParameters(searchParams);
3836
const mode = (searchParams.get("mode") ?? "form") as CreateWorkspaceMode;
3937
const [createWorkspaceState, send] = useMachine(createWorkspaceMachine, {
@@ -52,19 +50,13 @@ const CreateWorkspacePage: FC = () => {
5250
},
5351
},
5452
});
53+
5554
const { template, parameters, permissions, defaultName, versionId } =
5655
createWorkspaceState.context;
57-
const title = createWorkspaceState.matches("autoCreating")
58-
? "Creating workspace..."
59-
: "Create workspace";
6056

6157
const [externalAuthPollingState, setExternalAuthPollingState] =
6258
useState<ExternalAuthPollingState>("idle");
6359

64-
const startPollingExternalAuth = useCallback(() => {
65-
setExternalAuthPollingState("polling");
66-
}, []);
67-
6860
const { data: externalAuth, error } = useQuery(
6961
versionId
7062
? {
@@ -75,40 +67,47 @@ const CreateWorkspacePage: FC = () => {
7567
: { enabled: false },
7668
);
7769

78-
const allSignedIn = externalAuth?.every((it) => it.authenticated);
79-
8070
useEffect(() => {
81-
if (allSignedIn) {
82-
setExternalAuthPollingState("idle");
83-
return;
84-
}
85-
8671
if (externalAuthPollingState !== "polling") {
8772
return;
8873
}
8974

90-
// Poll for a maximum of one minute
91-
const quitPolling = setTimeout(
75+
const pollingTimeoutId = window.setTimeout(
9276
() => setExternalAuthPollingState("abandoned"),
9377
60_000,
9478
);
95-
return () => {
96-
clearTimeout(quitPolling);
97-
};
98-
}, [externalAuthPollingState, allSignedIn]);
79+
80+
return () => window.clearTimeout(pollingTimeoutId);
81+
}, [externalAuthPollingState]);
82+
83+
if (externalAuthPollingState !== "idle") {
84+
const allSignedIn = externalAuth?.every((it) => it.authenticated) ?? false;
85+
if (allSignedIn) {
86+
setExternalAuthPollingState("idle");
87+
}
88+
}
9989

10090
return (
10191
<>
10292
<Helmet>
103-
<title>{pageTitle(title)}</title>
93+
<title>
94+
{pageTitle(
95+
createWorkspaceState.matches("autoCreating")
96+
? "Creating workspace..."
97+
: "Create workspace",
98+
)}
99+
</title>
104100
</Helmet>
101+
105102
{Boolean(
106103
createWorkspaceState.matches("loadingFormData") ||
107104
createWorkspaceState.matches("autoCreating"),
108105
) && <Loader />}
106+
109107
{createWorkspaceState.matches("loadError") && (
110108
<ErrorAlert error={error} />
111109
)}
110+
112111
{createWorkspaceState.matches("idle") && (
113112
<CreateWorkspacePageView
114113
defaultName={defaultName}
@@ -119,13 +118,13 @@ const CreateWorkspacePage: FC = () => {
119118
versionId={versionId}
120119
externalAuth={externalAuth ?? []}
121120
externalAuthPollingState={externalAuthPollingState}
122-
startPollingExternalAuth={startPollingExternalAuth}
123121
permissions={permissions as CreateWSPermissions}
124122
parameters={parameters!}
125123
creatingWorkspace={createWorkspaceState.matches("creatingWorkspace")}
126-
onCancel={() => {
127-
navigate(-1);
124+
startPollingExternalAuth={() => {
125+
setExternalAuthPollingState("polling");
128126
}}
127+
onCancel={() => navigate(-1)}
129128
onSubmit={(request, owner) => {
130129
send({
131130
type: "CREATE_WORKSPACE",
@@ -144,29 +143,13 @@ export default CreateWorkspacePage;
144143
const getDefaultBuildParameters = (
145144
urlSearchParams: URLSearchParams,
146145
): WorkspaceBuildParameter[] => {
147-
const buildValues: WorkspaceBuildParameter[] = [];
148-
Array.from(urlSearchParams.keys())
146+
return Array.from(urlSearchParams.keys())
149147
.filter((key) => key.startsWith("param."))
150-
.forEach((key) => {
148+
.map((key) => {
151149
const name = key.replace("param.", "");
152150
const value = urlSearchParams.get(key) ?? "";
153-
buildValues.push({ name, value });
151+
return { name, value };
154152
});
155-
return buildValues;
156-
};
157-
158-
export const orderedTemplateParameters = (
159-
templateParameters?: TemplateVersionParameter[],
160-
): TemplateVersionParameter[] => {
161-
if (!templateParameters) {
162-
return [];
163-
}
164-
165-
const immutables = templateParameters.filter(
166-
(parameter) => !parameter.mutable,
167-
);
168-
const mutables = templateParameters.filter((parameter) => parameter.mutable);
169-
return [...immutables, ...mutables];
170153
};
171154

172155
const generateUniqueName = () => {

0 commit comments

Comments
 (0)