From a421e1a8f455b93928cc2606004498be436004a6 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Fri, 23 May 2025 20:32:11 +0000 Subject: [PATCH] fix: send websocket request when owner changes --- site/src/api/api.ts | 3 +- .../CreateWorkspacePageExperimental.tsx | 63 +++++++++---------- .../CreateWorkspacePageViewExperimental.tsx | 14 +++-- .../WorkspaceParametersPageExperimental.tsx | 21 ++----- 4 files changed, 47 insertions(+), 54 deletions(-) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 9e579c3706de6..81931c003c99d 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -1000,7 +1000,6 @@ class ApiMethods { }; templateVersionDynamicParameters = ( - userId: string, versionId: string, { onMessage, @@ -1013,7 +1012,7 @@ class ApiMethods { }, ): WebSocket => { const socket = createWebSocket( - `/api/v2/users/${userId}/templateversions/${versionId}/parameters`, + `/api/v2/templateversions/${versionId}/dynamic-parameters`, ); socket.addEventListener("message", (event) => diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx index fbb35c61ee047..0a5ccb93d083a 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx @@ -90,16 +90,19 @@ const CreateWorkspacePageExperimental: FC = () => { const autofillParameters = getAutofillParameters(searchParams); - const sendMessage = useCallback((formValues: Record) => { - const request: DynamicParametersRequest = { - id: wsResponseId.current + 1, - inputs: formValues, - }; - if (ws.current && ws.current.readyState === WebSocket.OPEN) { - ws.current.send(JSON.stringify(request)); - wsResponseId.current = wsResponseId.current + 1; - } - }, []); + const sendMessage = useEffectEvent( + (formValues: Record, ownerId?: string) => { + const request: DynamicParametersRequest = { + id: wsResponseId.current + 1, + owner_id: ownerId ?? owner.id, + inputs: formValues, + }; + if (ws.current && ws.current.readyState === WebSocket.OPEN) { + ws.current.send(JSON.stringify(request)); + wsResponseId.current = wsResponseId.current + 1; + } + }, + ); // On page load, sends all initial parameter values to the websocket // (including defaults and autofilled from the url) @@ -147,35 +150,31 @@ const CreateWorkspacePageExperimental: FC = () => { useEffect(() => { if (!realizedVersionId) return; - const socket = API.templateVersionDynamicParameters( - owner.id, - realizedVersionId, - { - onMessage, - onError: (error) => { - if (ws.current === socket) { - setWsError(error); - } - }, - onClose: () => { - if (ws.current === socket) { - setWsError( - new DetailedError( - "Websocket connection for dynamic parameters unexpectedly closed.", - "Refresh the page to reset the form.", - ), - ); - } - }, + const socket = API.templateVersionDynamicParameters(realizedVersionId, { + onMessage, + onError: (error) => { + if (ws.current === socket) { + setWsError(error); + } }, - ); + onClose: () => { + if (ws.current === socket) { + setWsError( + new DetailedError( + "Websocket connection for dynamic parameters unexpectedly closed.", + "Refresh the page to reset the form.", + ), + ); + } + }, + }); ws.current = socket; return () => { socket.close(); }; - }, [owner.id, realizedVersionId, onMessage]); + }, [realizedVersionId, onMessage]); const organizationId = templateQuery.data?.organization_id; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index db629e813415e..4f990ef9de695 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -70,7 +70,7 @@ export interface CreateWorkspacePageViewExperimentalProps { owner: TypesGen.User, ) => void; resetMutation: () => void; - sendMessage: (message: Record) => void; + sendMessage: (message: Record, ownerId?: string) => void; startPollingExternalAuth: () => void; owner: TypesGen.User; setOwner: (user: TypesGen.User) => void; @@ -271,9 +271,10 @@ export const CreateWorkspacePageViewExperimental: FC< form.values.rich_parameter_values, ]); - // send the last user modified parameter and all touched parameters to the websocket + // include any modified parameters and all touched parameters to the websocket request const sendDynamicParamsRequest = ( parameters: Array<{ parameter: PreviewParameter; value: string }>, + ownerId?: string, ) => { const formInputs: Record = {}; const formParameters = form.values.rich_parameter_values ?? []; @@ -294,7 +295,12 @@ export const CreateWorkspacePageViewExperimental: FC< } } - sendMessage(formInputs); + sendMessage(formInputs, ownerId); + }; + + const handleOwnerChange = (user: TypesGen.User) => { + setOwner(user); + sendDynamicParamsRequest([], user.id); }; const handleChange = async ( @@ -449,7 +455,7 @@ export const CreateWorkspacePageViewExperimental: FC< { - setOwner(user ?? defaultOwner); + handleOwnerChange(user ?? defaultOwner); }} size="medium" /> diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx index 156298be26e13..55c4422fd7095 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx @@ -14,14 +14,7 @@ import { Link } from "components/Link/Link"; import { Loader } from "components/Loader/Loader"; import { useEffectEvent } from "hooks/hookPolyfills"; import type { FC } from "react"; -import { - useCallback, - useContext, - useEffect, - useMemo, - useRef, - useState, -} from "react"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; import { useNavigate } from "react-router-dom"; @@ -46,16 +39,17 @@ const WorkspaceParametersPageExperimental: FC = () => { const ws = useRef(null); const [wsError, setWsError] = useState(null); - const sendMessage = useCallback((formValues: Record) => { + const sendMessage = useEffectEvent((formValues: Record) => { const request: DynamicParametersRequest = { id: wsResponseId.current + 1, + owner_id: workspace.owner_id, inputs: formValues, }; if (ws.current && ws.current.readyState === WebSocket.OPEN) { ws.current.send(JSON.stringify(request)); wsResponseId.current = wsResponseId.current + 1; } - }, []); + }); const onMessage = useEffectEvent((response: DynamicParametersResponse) => { if (latestResponse && latestResponse?.id >= response.id) { @@ -69,7 +63,6 @@ const WorkspaceParametersPageExperimental: FC = () => { if (!workspace.latest_build.template_version_id) return; const socket = API.templateVersionDynamicParameters( - workspace.owner_id, workspace.latest_build.template_version_id, { onMessage, @@ -96,11 +89,7 @@ const WorkspaceParametersPageExperimental: FC = () => { return () => { socket.close(); }; - }, [ - workspace.owner_id, - workspace.latest_build.template_version_id, - onMessage, - ]); + }, [workspace.latest_build.template_version_id, onMessage]); const updateParameters = useMutation({ mutationFn: (buildParameters: WorkspaceBuildParameter[]) => pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy