7
7
} from "api/queries/templates" ;
8
8
import { autoCreateWorkspace , createWorkspace } from "api/queries/workspaces" ;
9
9
import type {
10
+ DynamicParametersRequest ,
10
11
DynamicParametersResponse ,
11
12
Template ,
12
13
Workspace ,
@@ -31,17 +32,13 @@ import type { AutofillBuildParameter } from "utils/richParameters";
31
32
import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental" ;
32
33
export const createWorkspaceModes = [ "form" , "auto" , "duplicate" ] as const ;
33
34
export type CreateWorkspaceMode = ( typeof createWorkspaceModes ) [ number ] ;
34
- import { useWebSocket } from "hooks/useWebsocket " ;
35
+ import { API } from "api/api " ;
35
36
import {
36
37
type CreateWorkspacePermissions ,
37
38
createWorkspaceChecks ,
38
39
} from "./permissions" ;
39
40
export type ExternalAuthPollingState = "idle" | "polling" | "abandoned" ;
40
41
41
- const serverAddress = "localhost:8100" ;
42
- const urlTestdata = "demo" ;
43
- const wsUrl = `ws://${ serverAddress } /ws/${ encodeURIComponent ( urlTestdata ) } ` ;
44
-
45
42
const CreateWorkspacePageExperimental : FC = ( ) => {
46
43
const { organization : organizationName = "default" , template : templateName } =
47
44
useParams ( ) as { organization ?: string ; template : string } ;
@@ -51,20 +48,8 @@ const CreateWorkspacePageExperimental: FC = () => {
51
48
52
49
const [ currentResponse , setCurrentResponse ] =
53
50
useState < DynamicParametersResponse | null > ( null ) ;
54
- const [ wsResponseId , setWSResponseId ] = useState < number > ( 0 ) ;
55
- const { message : webSocketResponse , sendMessage } =
56
- useWebSocket < DynamicParametersResponse > ( wsUrl , urlTestdata , "" , "" ) ;
57
-
58
- useEffect ( ( ) => {
59
- if ( webSocketResponse && webSocketResponse . id >= wsResponseId ) {
60
- setCurrentResponse ( ( prev ) => {
61
- if ( prev ?. id === webSocketResponse . id ) {
62
- return prev ;
63
- }
64
- return webSocketResponse ;
65
- } ) ;
66
- }
67
- } , [ webSocketResponse , wsResponseId ] ) ;
51
+ const [ wsResponseId , setWSResponseId ] = useState < number > ( - 1 ) ;
52
+ const webSocket = useRef < WebSocket | null > ( null ) ;
68
53
69
54
const customVersionId = searchParams . get ( "version" ) ?? undefined ;
70
55
const defaultName = searchParams . get ( "name" ) ;
@@ -96,6 +81,59 @@ const CreateWorkspacePageExperimental: FC = () => {
96
81
const realizedVersionId =
97
82
customVersionId ?? templateQuery . data ?. active_version_id ;
98
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
+
99
137
const organizationId = templateQuery . data ?. organization_id ;
100
138
101
139
const {
@@ -225,7 +263,6 @@ const CreateWorkspacePageExperimental: FC = () => {
225
263
parameters = { sortedParams }
226
264
presets = { templateVersionPresetsQuery . data ?? [ ] }
227
265
creatingWorkspace = { createWorkspaceMutation . isLoading }
228
- setWSResponseId = { setWSResponseId }
229
266
sendMessage = { sendMessage }
230
267
onCancel = { ( ) => {
231
268
navigate ( - 1 ) ;
0 commit comments