Skip to content

Commit 112bc95

Browse files
committed
refactor: clean up logic for CreateWorkspacePage to support multiple modes
1 parent 9e4f999 commit 112bc95

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import { CreateWSPermissions, createWorkspaceChecks } from "./permissions";
3030
import { paramsUsedToCreateWorkspace } from "utils/workspace";
3131
import { useEffectEvent } from "hooks/hookPolyfills";
3232

33-
type CreateWorkspaceMode = "form" | "auto";
33+
export const createWorkspaceModes = ["form", "auto", "duplicate"] as const;
34+
export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number];
3435

3536
export type ExternalAuthPollingState = "idle" | "polling" | "abandoned";
3637

@@ -41,10 +42,9 @@ const CreateWorkspacePage: FC = () => {
4142
const navigate = useNavigate();
4243
const [searchParams, setSearchParams] = useSearchParams();
4344
const defaultBuildParameters = getDefaultBuildParameters(searchParams);
44-
const mode = (searchParams.get("mode") ?? "form") as CreateWorkspaceMode;
45+
const mode = getWorkspaceMode(searchParams);
4546
const customVersionId = searchParams.get("version") ?? undefined;
46-
const defaultName =
47-
mode === "auto" ? generateUniqueName() : searchParams.get("name") ?? "";
47+
const defaultName = getDefaultName(mode, searchParams);
4848

4949
const queryClient = useQueryClient();
5050
const autoCreateWorkspaceMutation = useMutation(
@@ -220,18 +220,13 @@ const getDefaultBuildParameters = (
220220
return buildValues;
221221
};
222222

223-
export const orderedTemplateParameters = (
224-
templateParameters?: TemplateVersionParameter[],
225-
): TemplateVersionParameter[] => {
226-
if (!templateParameters) {
227-
return [];
228-
}
229-
230-
const immutables = templateParameters.filter(
231-
(parameter) => !parameter.mutable,
232-
);
233-
const mutables = templateParameters.filter((parameter) => parameter.mutable);
234-
return [...immutables, ...mutables];
223+
export const orderTemplateParameters = (
224+
templateParameters?: readonly TemplateVersionParameter[],
225+
) => {
226+
return {
227+
mutable: templateParameters?.filter((p) => p.mutable) ?? [],
228+
immutable: templateParameters?.filter((p) => !p.mutable) ?? [],
229+
} as const;
235230
};
236231

237232
const generateUniqueName = () => {
@@ -245,3 +240,25 @@ const generateUniqueName = () => {
245240
};
246241

247242
export default CreateWorkspacePage;
243+
244+
function getWorkspaceMode(params: URLSearchParams): CreateWorkspaceMode {
245+
const paramMode = params.get("mode");
246+
if (createWorkspaceModes.includes(paramMode as CreateWorkspaceMode)) {
247+
return paramMode as CreateWorkspaceMode;
248+
}
249+
250+
return "form";
251+
}
252+
253+
function getDefaultName(mode: CreateWorkspaceMode, params: URLSearchParams) {
254+
if (mode === "auto") {
255+
return generateUniqueName();
256+
}
257+
258+
const paramsName = params.get("name");
259+
if (mode === "duplicate" && paramsName) {
260+
return `${paramsName}-copy`;
261+
}
262+
263+
return paramsName ?? "";
264+
}

0 commit comments

Comments
 (0)