@@ -30,7 +30,8 @@ import { CreateWSPermissions, createWorkspaceChecks } from "./permissions";
30
30
import { paramsUsedToCreateWorkspace } from "utils/workspace" ;
31
31
import { useEffectEvent } from "hooks/hookPolyfills" ;
32
32
33
- type CreateWorkspaceMode = "form" | "auto" ;
33
+ export const createWorkspaceModes = [ "form" , "auto" , "duplicate" ] as const ;
34
+ export type CreateWorkspaceMode = ( typeof createWorkspaceModes ) [ number ] ;
34
35
35
36
export type ExternalAuthPollingState = "idle" | "polling" | "abandoned" ;
36
37
@@ -41,10 +42,9 @@ const CreateWorkspacePage: FC = () => {
41
42
const navigate = useNavigate ( ) ;
42
43
const [ searchParams , setSearchParams ] = useSearchParams ( ) ;
43
44
const defaultBuildParameters = getDefaultBuildParameters ( searchParams ) ;
44
- const mode = ( searchParams . get ( "mode" ) ?? "form" ) as CreateWorkspaceMode ;
45
+ const mode = getWorkspaceMode ( searchParams ) ;
45
46
const customVersionId = searchParams . get ( "version" ) ?? undefined ;
46
- const defaultName =
47
- mode === "auto" ? generateUniqueName ( ) : searchParams . get ( "name" ) ?? "" ;
47
+ const defaultName = getDefaultName ( mode , searchParams ) ;
48
48
49
49
const queryClient = useQueryClient ( ) ;
50
50
const autoCreateWorkspaceMutation = useMutation (
@@ -220,18 +220,13 @@ const getDefaultBuildParameters = (
220
220
return buildValues ;
221
221
} ;
222
222
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 ;
235
230
} ;
236
231
237
232
const generateUniqueName = ( ) => {
@@ -245,3 +240,25 @@ const generateUniqueName = () => {
245
240
} ;
246
241
247
242
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