@@ -9,7 +9,6 @@ import { autoCreateWorkspace, createWorkspace } from "api/queries/workspaces";
9
9
import type {
10
10
DynamicParametersRequest ,
11
11
DynamicParametersResponse ,
12
- Template ,
13
12
Workspace ,
14
13
} from "api/typesGenerated" ;
15
14
import { Loader } from "components/Loader/Loader" ;
@@ -32,6 +31,7 @@ import type { AutofillBuildParameter } from "utils/richParameters";
32
31
import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental" ;
33
32
export const createWorkspaceModes = [ "form" , "auto" , "duplicate" ] as const ;
34
33
export type CreateWorkspaceMode = ( typeof createWorkspaceModes ) [ number ] ;
34
+ import { API } from "api/api" ;
35
35
import {
36
36
type CreateWorkspacePermissions ,
37
37
createWorkspaceChecks ,
@@ -47,8 +47,9 @@ const CreateWorkspacePageExperimental: FC = () => {
47
47
48
48
const [ currentResponse , setCurrentResponse ] =
49
49
useState < DynamicParametersResponse | null > ( null ) ;
50
- const [ wsResponseId , setWSResponseId ] = useState < number > ( 0 ) ;
51
- const sendMessage = ( message : DynamicParametersRequest ) => { } ;
50
+ const [ wsResponseId , setWSResponseId ] = useState < number > ( - 1 ) ;
51
+ const ws = useRef < WebSocket | null > ( null ) ;
52
+ const [ wsError , setWsError ] = useState < Error | null > ( null ) ;
52
53
53
54
const customVersionId = searchParams . get ( "version" ) ?? undefined ;
54
55
const defaultName = searchParams . get ( "name" ) ;
@@ -80,6 +81,49 @@ const CreateWorkspacePageExperimental: FC = () => {
80
81
const realizedVersionId =
81
82
customVersionId ?? templateQuery . data ?. active_version_id ;
82
83
84
+ const onMessage = useCallback ( ( response : DynamicParametersResponse ) => {
85
+ setCurrentResponse ( ( prev ) => {
86
+ if ( prev ?. id === response . id ) {
87
+ return prev ;
88
+ }
89
+ return response ;
90
+ } ) ;
91
+ } , [ ] ) ;
92
+
93
+ // Initialize the WebSocket connection when there is a valid template version ID
94
+ useEffect ( ( ) => {
95
+ if ( ! realizedVersionId ) {
96
+ return ;
97
+ }
98
+
99
+ const socket = API . templateVersionDynamicParameters ( realizedVersionId , {
100
+ onMessage,
101
+ onError : ( error ) => {
102
+ setWsError ( error ) ;
103
+ } ,
104
+ } ) ;
105
+
106
+ ws . current = socket ;
107
+
108
+ return ( ) => {
109
+ socket . close ( ) ;
110
+ } ;
111
+ } , [ realizedVersionId , onMessage ] ) ;
112
+
113
+ const sendMessage = useCallback ( ( formValues : Record < string , string > ) => {
114
+ setWSResponseId ( ( prevId ) => {
115
+ const request : DynamicParametersRequest = {
116
+ id : prevId + 1 ,
117
+ inputs : formValues ,
118
+ } ;
119
+ if ( ws . current && ws . current . readyState === WebSocket . OPEN ) {
120
+ ws . current . send ( JSON . stringify ( request ) ) ;
121
+ return prevId + 1 ;
122
+ }
123
+ return prevId ;
124
+ } ) ;
125
+ } , [ ] ) ;
126
+
83
127
const organizationId = templateQuery . data ?. organization_id ;
84
128
85
129
const {
@@ -90,7 +134,9 @@ const CreateWorkspacePageExperimental: FC = () => {
90
134
} = useExternalAuth ( realizedVersionId ) ;
91
135
92
136
const isLoadingFormData =
93
- templateQuery . isLoading || permissionsQuery . isLoading ;
137
+ ws . current ?. readyState !== WebSocket . OPEN ||
138
+ templateQuery . isLoading ||
139
+ permissionsQuery . isLoading ;
94
140
const loadFormDataError = templateQuery . error ?? permissionsQuery . error ;
95
141
96
142
const title = autoCreateWorkspaceMutation . isLoading
@@ -189,11 +235,12 @@ const CreateWorkspacePageExperimental: FC = () => {
189
235
< CreateWorkspacePageViewExperimental
190
236
mode = { mode }
191
237
defaultName = { defaultName }
192
- diagnostics = { currentResponse . diagnostics }
238
+ diagnostics = { currentResponse ? .diagnostics ?? [ ] }
193
239
disabledParams = { disabledParams }
194
240
defaultOwner = { me }
195
241
autofillParameters = { autofillParameters }
196
242
error = {
243
+ wsError ||
197
244
createWorkspaceMutation . error ||
198
245
autoCreateError ||
199
246
loadFormDataError ||
@@ -210,7 +257,6 @@ const CreateWorkspacePageExperimental: FC = () => {
210
257
parameters = { sortedParams }
211
258
presets = { templateVersionPresetsQuery . data ?? [ ] }
212
259
creatingWorkspace = { createWorkspaceMutation . isLoading }
213
- setWSResponseId = { setWSResponseId }
214
260
sendMessage = { sendMessage }
215
261
onCancel = { ( ) => {
216
262
navigate ( - 1 ) ;
0 commit comments