Skip to content

Commit 9b3adc1

Browse files
committed
Add mutations
1 parent 6ab628a commit 9b3adc1

File tree

2 files changed

+63
-9
lines changed

2 files changed

+63
-9
lines changed

site/src/api/api.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,30 @@ export const getWorkspaceAgentSharedPorts = async (
11721172
return response.data;
11731173
};
11741174

1175+
export const postWorkspaceAgentSharedPort = async (
1176+
workspaceID: string,
1177+
req: TypesGen.UpdateWorkspaceAgentPortShareRequest,
1178+
): Promise<TypesGen.WorkspaceAgentPortShares> => {
1179+
const response = await axios.post(
1180+
`/api/v2/workspaces/${workspaceID}/shared-port`,
1181+
req
1182+
);
1183+
return response.data;
1184+
};
1185+
1186+
export const deleteWorkspaceAgentSharedPort = async (
1187+
workspaceID: string,
1188+
req: TypesGen.DeleteWorkspaceAgentPortShareRequest,
1189+
): Promise<TypesGen.WorkspaceAgentPortShares> => {
1190+
const response = await axios.delete(
1191+
`/api/v2/workspaces/${workspaceID}/shared-port`,
1192+
{
1193+
data: req,
1194+
}
1195+
);
1196+
return response.data;
1197+
};
1198+
11751199
// getDeploymentSSHConfig is used by the VSCode-Extension.
11761200
export const getDeploymentSSHConfig =
11771201
async (): Promise<TypesGen.SSHConfigResponse> => {

site/src/modules/resources/PortForwardButton.tsx

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@ import CircularProgress from "@mui/material/CircularProgress";
44
import OpenInNewOutlined from "@mui/icons-material/OpenInNewOutlined";
55
import { type Interpolation, type Theme, useTheme } from "@emotion/react";
66
import type { FC } from "react";
7-
import { useQuery } from "react-query";
7+
import { useQuery, useMutation } from "react-query";
88
import { docs } from "utils/docs";
9-
import { getAgentListeningPorts, getWorkspaceAgentSharedPorts } from "api/api";
9+
import { deleteWorkspaceAgentSharedPort, getAgentListeningPorts, getWorkspaceAgentSharedPorts, postWorkspaceAgentSharedPort } from "api/api";
1010
import type {
11+
DeleteWorkspaceAgentPortShareRequest,
12+
UpdateWorkspaceAgentPortShareRequest,
1113
WorkspaceAgent,
1214
WorkspaceAgentListeningPort,
1315
WorkspaceAgentListeningPortsResponse,
1416
WorkspaceAgentPortShare,
17+
WorkspaceAgentPortShareLevel,
1518
WorkspaceAgentPortShares,
1619
} from "api/typesGenerated";
1720
import { portForwardURL } from "utils/portForward";
@@ -37,7 +40,6 @@ import LockIcon from "@mui/icons-material/Lock";
3740
import LockOpenIcon from "@mui/icons-material/LockOpen";
3841
import IconButton from "@mui/material/IconButton";
3942
import CloseIcon from "@mui/icons-material/Close";
40-
import Grid from "@mui/material/Grid";
4143

4244
export interface PortForwardButtonProps {
4345
host: string;
@@ -68,7 +70,7 @@ export const PortForwardButton: FC<PortForwardButtonProps> = (props) => {
6870
});
6971

7072
const sharedPortsQuery = useQuery({
71-
queryKey: ["sharedPorts", agent.id],
73+
queryKey: ["sharedPorts", workspaceID],
7274
queryFn: () => getWorkspaceAgentSharedPorts(workspaceID),
7375
enabled: !storybook && agent.status === "connected",
7476
});
@@ -123,13 +125,27 @@ interface PortForwardPopoverViewProps extends PortForwardButtonProps {
123125
export const PortForwardPopoverView: FC<PortForwardPopoverViewProps> = ({
124126
host,
125127
workspaceName,
128+
workspaceID,
126129
agent,
127130
username,
128131
listeningPorts,
129132
sharedPorts,
130133
}) => {
131134
const theme = useTheme();
132135

136+
137+
const createSharedPortMutation = useMutation({
138+
mutationFn: async (options: UpdateWorkspaceAgentPortShareRequest) => {
139+
await postWorkspaceAgentSharedPort(workspaceID, options);
140+
},
141+
});
142+
143+
const deleteSharedPortMutation = useMutation({
144+
mutationFn: async (options: DeleteWorkspaceAgentPortShareRequest) => {
145+
await deleteWorkspaceAgentSharedPort(workspaceID, options);
146+
},
147+
});
148+
133149
// we don't want to show listening ports if it's already a shared port
134150
const filteredListeningPorts = listeningPorts?.filter(
135151
(port) => {
@@ -258,7 +274,15 @@ export const PortForwardPopoverView: FC<PortForwardPopoverViewProps> = ({
258274
>
259275
<span css={styles.portNumber}>{port.port}</span>
260276
</Link>
261-
<Button size="small" variant="text">
277+
<Button size="small" variant="text" onClick={
278+
() => {
279+
createSharedPortMutation.mutate({
280+
agent_name: agent.name,
281+
port: port.port,
282+
share_level: "authenticated",
283+
});
284+
}
285+
}>
262286
Share
263287
</Button>
264288
</Stack>
@@ -328,7 +352,12 @@ export const PortForwardPopoverView: FC<PortForwardPopoverViewProps> = ({
328352
<MenuItem value="public">Public</MenuItem>
329353
</Select>
330354
</FormControl>
331-
<IconButton>
355+
<IconButton onClick={() => {
356+
deleteSharedPortMutation.mutate({
357+
agent_name: agent.name,
358+
port: share.port,
359+
});
360+
}}>
332361
<CloseIcon
333362
css={{
334363
width: 14,
@@ -352,11 +381,12 @@ export const PortForwardPopoverView: FC<PortForwardPopoverViewProps> = ({
352381
>
353382
<TextField label="Port" variant="outlined" size="small" />
354383
<FormControl size="small">
355-
<Select value="Authenticated">
356-
<MenuItem value="Authenticated">Authenticated</MenuItem>
357-
<MenuItem value="Public">Public</MenuItem>
384+
<Select value="authenticated">
385+
<MenuItem value="authenticated">Authenticated</MenuItem>
386+
<MenuItem value="public">Public</MenuItem>
358387
</Select>
359388
</FormControl>
389+
{/* How do I use the value from the select in the mutation? */}
360390
<Button variant="contained">Share Port</Button>
361391
</Stack>
362392
</div>

0 commit comments

Comments
 (0)