1
1
import { useMachine } from "@xstate/react"
2
- import { TemplateVersionParameter } from "api/typesGenerated"
2
+ import {
3
+ Template ,
4
+ TemplateVersionGitAuth ,
5
+ TemplateVersionParameter ,
6
+ WorkspaceBuildParameter ,
7
+ } from "api/typesGenerated"
3
8
import { useMe } from "hooks/useMe"
4
9
import { useOrganizationId } from "hooks/useOrganizationId"
5
10
import { FC } from "react"
6
11
import { Helmet } from "react-helmet-async"
7
12
import { useNavigate , useParams , useSearchParams } from "react-router-dom"
8
13
import { pageTitle } from "utils/page"
9
- import { createWorkspaceMachine } from "xServices/createWorkspace/createWorkspaceXService"
10
14
import {
11
- CreateWorkspaceErrors ,
12
- CreateWorkspacePageView ,
13
- } from "./CreateWorkspacePageView"
15
+ CreateWSPermissions ,
16
+ CreateWorkspaceMode ,
17
+ createWorkspaceMachine ,
18
+ } from "xServices/createWorkspace/createWorkspaceXService"
19
+ import { CreateWorkspacePageView } from "./CreateWorkspacePageView"
20
+ import { Loader } from "components/Loader/Loader"
21
+ import { ErrorAlert } from "components/Alert/ErrorAlert"
22
+ import {
23
+ uniqueNamesGenerator ,
24
+ animals ,
25
+ colors ,
26
+ NumberDictionary ,
27
+ } from "unique-names-generator"
14
28
15
29
const CreateWorkspacePage : FC = ( ) => {
16
30
const organizationId = useOrganizationId ( )
17
31
const { template : templateName } = useParams ( ) as { template : string }
18
- const navigate = useNavigate ( )
19
32
const me = useMe ( )
33
+ const navigate = useNavigate ( )
34
+ const [ searchParams ] = useSearchParams ( )
35
+ const defaultBuildParameters = getDefaultBuildParameters ( searchParams )
36
+ const mode = ( searchParams . get ( "mode" ) ?? "form" ) as CreateWorkspaceMode
20
37
const [ createWorkspaceState , send ] = useMachine ( createWorkspaceMachine , {
21
38
context : {
22
39
organizationId,
23
40
templateName,
24
- owner : me ,
41
+ mode,
42
+ defaultBuildParameters,
43
+ defaultName :
44
+ mode === "auto" ? generateUniqueName ( ) : searchParams . get ( "name" ) ?? "" ,
25
45
} ,
26
46
actions : {
27
47
onCreateWorkspace : ( _ , event ) => {
28
48
navigate ( `/@${ event . data . owner_name } /${ event . data . name } ` )
29
49
} ,
30
50
} ,
31
51
} )
32
- const {
33
- templates,
34
- templateParameters,
35
- templateGitAuth,
36
- selectedTemplate,
37
- getTemplateGitAuthError,
38
- getTemplatesError,
39
- createWorkspaceError,
40
- permissions,
41
- owner,
42
- } = createWorkspaceState . context
43
- const [ searchParams ] = useSearchParams ( )
44
- const defaultParameterValues = getDefaultParameterValues ( searchParams )
45
- const name = getName ( searchParams )
52
+ const { template, error, parameters, permissions, gitAuth, defaultName } =
53
+ createWorkspaceState . context
54
+ const title = createWorkspaceState . matches ( "autoCreating" )
55
+ ? "Creating workspace..."
56
+ : "Create Workspace"
46
57
47
58
return (
48
59
< >
49
60
< Helmet >
50
- < title > { pageTitle ( "Create Workspace" ) } </ title >
61
+ < title > { pageTitle ( title ) } </ title >
51
62
</ Helmet >
52
- < CreateWorkspacePageView
53
- name = { name }
54
- defaultParameterValues = { defaultParameterValues }
55
- loadingTemplates = { createWorkspaceState . matches ( "gettingTemplates" ) }
56
- creatingWorkspace = { createWorkspaceState . matches ( "creatingWorkspace" ) }
57
- hasTemplateErrors = { createWorkspaceState . matches ( "error" ) }
58
- templateName = { templateName }
59
- templates = { templates }
60
- selectedTemplate = { selectedTemplate }
61
- templateParameters = { orderedTemplateParameters ( templateParameters ) }
62
- templateGitAuth = { templateGitAuth }
63
- createWorkspaceErrors = { {
64
- [ CreateWorkspaceErrors . GET_TEMPLATES_ERROR ] : getTemplatesError ,
65
- [ CreateWorkspaceErrors . CREATE_WORKSPACE_ERROR ] : createWorkspaceError ,
66
- [ CreateWorkspaceErrors . GET_TEMPLATE_GITAUTH_ERROR ] :
67
- getTemplateGitAuthError ,
68
- } }
69
- canCreateForUser = { permissions ?. createWorkspaceForUser }
70
- owner = { owner }
71
- setOwner = { ( user ) => {
72
- send ( {
73
- type : "SELECT_OWNER" ,
74
- owner : user ,
75
- } )
76
- } }
77
- onCancel = { ( ) => {
78
- // Go back
79
- navigate ( - 1 )
80
- } }
81
- onSubmit = { ( request ) => {
82
- send ( {
83
- type : "CREATE_WORKSPACE" ,
84
- request,
85
- owner,
86
- } )
87
- } }
88
- />
63
+ { Boolean (
64
+ createWorkspaceState . matches ( "loadingFormData" ) ||
65
+ createWorkspaceState . matches ( "autoCreating" ) ,
66
+ ) && < Loader /> }
67
+ { createWorkspaceState . matches ( "loadError" ) && (
68
+ < ErrorAlert error = { error } />
69
+ ) }
70
+ { createWorkspaceState . matches ( "idle" ) && (
71
+ < CreateWorkspacePageView
72
+ defaultName = { defaultName }
73
+ defaultOwner = { me }
74
+ defaultBuildParameters = { defaultBuildParameters }
75
+ error = { error }
76
+ template = { template as Template }
77
+ gitAuth = { gitAuth as TemplateVersionGitAuth [ ] }
78
+ permissions = { permissions as CreateWSPermissions }
79
+ parameters = { parameters as TemplateVersionParameter [ ] }
80
+ creatingWorkspace = { createWorkspaceState . matches ( "creatingWorkspace" ) }
81
+ onCancel = { ( ) => {
82
+ navigate ( - 1 )
83
+ } }
84
+ onSubmit = { ( request , owner ) => {
85
+ send ( {
86
+ type : "CREATE_WORKSPACE" ,
87
+ request,
88
+ owner,
89
+ } )
90
+ } }
91
+ />
92
+ ) }
89
93
</ >
90
94
)
91
95
}
92
96
93
- const getName = ( urlSearchParams : URLSearchParams ) : string => {
94
- return urlSearchParams . get ( "name" ) ?? ""
95
- }
97
+ export default CreateWorkspacePage
96
98
97
- const getDefaultParameterValues = (
99
+ const getDefaultBuildParameters = (
98
100
urlSearchParams : URLSearchParams ,
99
- ) : Record < string , string > => {
100
- const paramValues : Record < string , string > = { }
101
+ ) : WorkspaceBuildParameter [ ] => {
102
+ const buildValues : WorkspaceBuildParameter [ ] = [ ]
101
103
Array . from ( urlSearchParams . keys ( ) )
102
104
. filter ( ( key ) => key . startsWith ( "param." ) )
103
105
. forEach ( ( key ) => {
104
- const paramName = key . replace ( "param." , "" )
105
- const paramValue = urlSearchParams . get ( key )
106
- paramValues [ paramName ] = paramValue ?? ""
106
+ const name = key . replace ( "param." , "" )
107
+ const value = urlSearchParams . get ( key ) ?? ""
108
+ buildValues . push ( { name , value } )
107
109
} )
108
- return paramValues
110
+ return buildValues
109
111
}
110
112
111
113
export const orderedTemplateParameters = (
@@ -122,4 +124,12 @@ export const orderedTemplateParameters = (
122
124
return [ ...immutables , ...mutables ]
123
125
}
124
126
125
- export default CreateWorkspacePage
127
+ const generateUniqueName = ( ) => {
128
+ const numberDictionary = NumberDictionary . generate ( { min : 0 , max : 99 } )
129
+ return uniqueNamesGenerator ( {
130
+ dictionaries : [ colors , animals , numberDictionary ] ,
131
+ separator : "-" ,
132
+ length : 3 ,
133
+ style : "lowerCase" ,
134
+ } )
135
+ }
0 commit comments