Skip to content

Commit 2da7d99

Browse files
committed
feat: connect to dynamic parameters websocket
1 parent b2c662a commit 2da7d99

File tree

3 files changed

+64
-6
lines changed

3 files changed

+64
-6
lines changed

site/src/api/api.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1009,6 +1009,13 @@ class ApiMethods {
10091009
return response.data;
10101010
};
10111011

1012+
templateVersionDynamicParameters = (versionId: string): WebSocket => {
1013+
const socket = createWebSocket(
1014+
`/api/v2/templateversions/${versionId}/dynamic-parameters`,
1015+
);
1016+
return socket;
1017+
};
1018+
10121019
/**
10131020
* @param organization Can be the organization's ID or name
10141021
*/

site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx

+56-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import type { AutofillBuildParameter } from "utils/richParameters";
3232
import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental";
3333
export const createWorkspaceModes = ["form", "auto", "duplicate"] as const;
3434
export type CreateWorkspaceMode = (typeof createWorkspaceModes)[number];
35+
import { API } from "api/api";
3536
import {
3637
type CreateWorkspacePermissions,
3738
createWorkspaceChecks,
@@ -47,8 +48,8 @@ const CreateWorkspacePageExperimental: FC = () => {
4748

4849
const [currentResponse, setCurrentResponse] =
4950
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);
5253

5354
const customVersionId = searchParams.get("version") ?? undefined;
5455
const defaultName = searchParams.get("name");
@@ -80,6 +81,59 @@ const CreateWorkspacePageExperimental: FC = () => {
8081
const realizedVersionId =
8182
customVersionId ?? templateQuery.data?.active_version_id;
8283

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+
83137
const organizationId = templateQuery.data?.organization_id;
84138

85139
const {
@@ -210,7 +264,6 @@ const CreateWorkspacePageExperimental: FC = () => {
210264
parameters={sortedParams}
211265
presets={templateVersionPresetsQuery.data ?? []}
212266
creatingWorkspace={createWorkspaceMutation.isLoading}
213-
setWSResponseId={setWSResponseId}
214267
sendMessage={sendMessage}
215268
onCancel={() => {
216269
navigate(-1);

site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx

+1-3
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ export interface CreateWorkspacePageViewExperimentalProps {
6767
owner: TypesGen.User,
6868
) => void;
6969
resetMutation: () => void;
70-
sendMessage: (message: DynamicParametersRequest) => void;
71-
setWSResponseId: (value: React.SetStateAction<number>) => void;
70+
sendMessage: (message: Record<string, string>) => void;
7271
startPollingExternalAuth: () => void;
7372
}
7473

@@ -95,7 +94,6 @@ export const CreateWorkspacePageViewExperimental: FC<
9594
onCancel,
9695
resetMutation,
9796
sendMessage,
98-
setWSResponseId,
9997
startPollingExternalAuth,
10098
}) => {
10199
const [owner, setOwner] = useState(defaultOwner);

0 commit comments

Comments
 (0)