1
1
import { useMachine } from "@xstate/react" ;
2
- import {
3
- TemplateVersionParameter ,
4
- WorkspaceBuildParameter ,
5
- } from "api/typesGenerated" ;
2
+ import { WorkspaceBuildParameter } from "api/typesGenerated" ;
6
3
import { useMe } from "hooks/useMe" ;
7
4
import { useOrganizationId } from "hooks/useOrganizationId" ;
8
- import { type FC , useCallback , useState , useEffect } from "react" ;
5
+ import { type FC , useState , useEffect } from "react" ;
9
6
import { Helmet } from "react-helmet-async" ;
10
7
import { useNavigate , useParams , useSearchParams } from "react-router-dom" ;
11
8
import { pageTitle } from "utils/page" ;
@@ -30,10 +27,11 @@ export type ExternalAuthPollingState = "idle" | "polling" | "abandoned";
30
27
31
28
const CreateWorkspacePage : FC = ( ) => {
32
29
const organizationId = useOrganizationId ( ) ;
30
+ const [ searchParams ] = useSearchParams ( ) ;
33
31
const { template : templateName } = useParams ( ) as { template : string } ;
34
32
const me = useMe ( ) ;
35
33
const navigate = useNavigate ( ) ;
36
- const [ searchParams ] = useSearchParams ( ) ;
34
+
37
35
const defaultBuildParameters = getDefaultBuildParameters ( searchParams ) ;
38
36
const mode = ( searchParams . get ( "mode" ) ?? "form" ) as CreateWorkspaceMode ;
39
37
const [ createWorkspaceState , send ] = useMachine ( createWorkspaceMachine , {
@@ -52,19 +50,13 @@ const CreateWorkspacePage: FC = () => {
52
50
} ,
53
51
} ,
54
52
} ) ;
53
+
55
54
const { template, parameters, permissions, defaultName, versionId } =
56
55
createWorkspaceState . context ;
57
- const title = createWorkspaceState . matches ( "autoCreating" )
58
- ? "Creating workspace..."
59
- : "Create workspace" ;
60
56
61
57
const [ externalAuthPollingState , setExternalAuthPollingState ] =
62
58
useState < ExternalAuthPollingState > ( "idle" ) ;
63
59
64
- const startPollingExternalAuth = useCallback ( ( ) => {
65
- setExternalAuthPollingState ( "polling" ) ;
66
- } , [ ] ) ;
67
-
68
60
const { data : externalAuth , error } = useQuery (
69
61
versionId
70
62
? {
@@ -75,40 +67,47 @@ const CreateWorkspacePage: FC = () => {
75
67
: { enabled : false } ,
76
68
) ;
77
69
78
- const allSignedIn = externalAuth ?. every ( ( it ) => it . authenticated ) ;
79
-
80
70
useEffect ( ( ) => {
81
- if ( allSignedIn ) {
82
- setExternalAuthPollingState ( "idle" ) ;
83
- return ;
84
- }
85
-
86
71
if ( externalAuthPollingState !== "polling" ) {
87
72
return ;
88
73
}
89
74
90
- // Poll for a maximum of one minute
91
- const quitPolling = setTimeout (
75
+ const pollingTimeoutId = window . setTimeout (
92
76
( ) => setExternalAuthPollingState ( "abandoned" ) ,
93
77
60_000 ,
94
78
) ;
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
+ }
99
89
100
90
return (
101
91
< >
102
92
< Helmet >
103
- < title > { pageTitle ( title ) } </ title >
93
+ < title >
94
+ { pageTitle (
95
+ createWorkspaceState . matches ( "autoCreating" )
96
+ ? "Creating workspace..."
97
+ : "Create workspace" ,
98
+ ) }
99
+ </ title >
104
100
</ Helmet >
101
+
105
102
{ Boolean (
106
103
createWorkspaceState . matches ( "loadingFormData" ) ||
107
104
createWorkspaceState . matches ( "autoCreating" ) ,
108
105
) && < Loader /> }
106
+
109
107
{ createWorkspaceState . matches ( "loadError" ) && (
110
108
< ErrorAlert error = { error } />
111
109
) }
110
+
112
111
{ createWorkspaceState . matches ( "idle" ) && (
113
112
< CreateWorkspacePageView
114
113
defaultName = { defaultName }
@@ -119,13 +118,13 @@ const CreateWorkspacePage: FC = () => {
119
118
versionId = { versionId }
120
119
externalAuth = { externalAuth ?? [ ] }
121
120
externalAuthPollingState = { externalAuthPollingState }
122
- startPollingExternalAuth = { startPollingExternalAuth }
123
121
permissions = { permissions as CreateWSPermissions }
124
122
parameters = { parameters ! }
125
123
creatingWorkspace = { createWorkspaceState . matches ( "creatingWorkspace" ) }
126
- onCancel = { ( ) => {
127
- navigate ( - 1 ) ;
124
+ startPollingExternalAuth = { ( ) => {
125
+ setExternalAuthPollingState ( "polling" ) ;
128
126
} }
127
+ onCancel = { ( ) => navigate ( - 1 ) }
129
128
onSubmit = { ( request , owner ) => {
130
129
send ( {
131
130
type : "CREATE_WORKSPACE" ,
@@ -144,29 +143,13 @@ export default CreateWorkspacePage;
144
143
const getDefaultBuildParameters = (
145
144
urlSearchParams : URLSearchParams ,
146
145
) : WorkspaceBuildParameter [ ] => {
147
- const buildValues : WorkspaceBuildParameter [ ] = [ ] ;
148
- Array . from ( urlSearchParams . keys ( ) )
146
+ return Array . from ( urlSearchParams . keys ( ) )
149
147
. filter ( ( key ) => key . startsWith ( "param." ) )
150
- . forEach ( ( key ) => {
148
+ . map ( ( key ) => {
151
149
const name = key . replace ( "param." , "" ) ;
152
150
const value = urlSearchParams . get ( key ) ?? "" ;
153
- buildValues . push ( { name, value } ) ;
151
+ return { name, value } ;
154
152
} ) ;
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 ] ;
170
153
} ;
171
154
172
155
const generateUniqueName = ( ) => {
0 commit comments