@@ -32,6 +32,7 @@ import type { AutofillBuildParameter } from "utils/richParameters";
32
32
import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental" ;
33
33
export const createWorkspaceModes = [ "form" , "auto" , "duplicate" ] as const ;
34
34
export type CreateWorkspaceMode = ( typeof createWorkspaceModes ) [ number ] ;
35
+ import { API } from "api/api" ;
35
36
import {
36
37
type CreateWorkspacePermissions ,
37
38
createWorkspaceChecks ,
@@ -47,8 +48,8 @@ const CreateWorkspacePageExperimental: FC = () => {
47
48
48
49
const [ currentResponse , setCurrentResponse ] =
49
50
useState < DynamicParametersResponse | null > ( null ) ;
50
- const [ wsResponseId , setWSResponseId ] = useState < number > ( 0 ) ;
51
- const sendMessage = ( message : DynamicParametersRequest ) => { } ;
51
+ const [ wsResponseId , setWSResponseId ] = useState < number > ( - 1 ) ;
52
+ const webSocket = useRef < WebSocket | null > ( null ) ;
52
53
53
54
const customVersionId = searchParams . get ( "version" ) ?? undefined ;
54
55
const defaultName = searchParams . get ( "name" ) ;
@@ -80,6 +81,59 @@ const CreateWorkspacePageExperimental: FC = () => {
80
81
const realizedVersionId =
81
82
customVersionId ?? templateQuery . data ?. active_version_id ;
82
83
84
+ // Initialize the WebSocket connection when there is a valid template version ID
85
+ useEffect ( ( ) => {
86
+ if ( ! realizedVersionId ) {
87
+ return ;
88
+ }
89
+
90
+ if ( webSocket . current ) {
91
+ webSocket . current . close ( ) ;
92
+ }
93
+
94
+ const socket = API . templateVersionDynamicParameters ( realizedVersionId ) ;
95
+
96
+ socket . addEventListener ( "message" , ( event ) => {
97
+ try {
98
+ const response = JSON . parse ( event . data ) as DynamicParametersResponse ;
99
+
100
+ if ( response && response . id >= wsResponseId ) {
101
+ setCurrentResponse ( ( prev ) => {
102
+ if ( prev ?. id === response . id ) {
103
+ return prev ;
104
+ }
105
+ return response ;
106
+ } ) ;
107
+ }
108
+ } catch ( error ) {
109
+ console . error ( "Failed to parse WebSocket message:" , error ) ;
110
+ }
111
+ } ) ;
112
+
113
+ webSocket . current = socket ;
114
+
115
+ return ( ) => {
116
+ if ( webSocket . current ) {
117
+ webSocket . current . close ( ) ;
118
+ }
119
+ } ;
120
+ } , [ realizedVersionId ] ) ;
121
+
122
+ const sendMessage =
123
+ ( formValues : Record < string , string > ) => {
124
+ setWSResponseId ( prevId => {
125
+ const request : DynamicParametersRequest = {
126
+ id : prevId + 1 ,
127
+ inputs : formValues ,
128
+ } ;
129
+ if ( webSocket . current && webSocket . current . readyState === WebSocket . OPEN ) {
130
+ webSocket . current . send ( JSON . stringify ( request ) ) ;
131
+ return prevId + 1 ;
132
+ }
133
+ return prevId ;
134
+ } )
135
+ } ;
136
+
83
137
const organizationId = templateQuery . data ?. organization_id ;
84
138
85
139
const {
@@ -210,7 +264,6 @@ const CreateWorkspacePageExperimental: FC = () => {
210
264
parameters = { sortedParams }
211
265
presets = { templateVersionPresetsQuery . data ?? [ ] }
212
266
creatingWorkspace = { createWorkspaceMutation . isLoading }
213
- setWSResponseId = { setWSResponseId }
214
267
sendMessage = { sendMessage }
215
268
onCancel = { ( ) => {
216
269
navigate ( - 1 ) ;
0 commit comments