|
1 | 1 | import axios from "axios" |
2 | 2 | import { getAuthenticatedUser, getWorkspaces, updateWorkspaceVersion } from "coder/site/src/api/api" |
3 | | -import { Workspace, WorkspaceAgent } from "coder/site/src/api/typesGenerated" |
| 3 | +import { Workspace } from "coder/site/src/api/typesGenerated" |
4 | 4 | import * as vscode from "vscode" |
| 5 | +import { extractAgentsAndFolderPath } from "./api-helper" |
5 | 6 | import { Remote } from "./remote" |
6 | 7 | import { Storage } from "./storage" |
| 8 | +import { WorkspaceTreeItem } from "./workspacesProvider" |
7 | 9 |
|
8 | 10 | export class Commands { |
9 | 11 | public constructor(private readonly vscodeProposed: typeof vscode, private readonly storage: Storage) {} |
@@ -79,6 +81,9 @@ export class Commands { |
79 | 81 | throw new Error("Failed to get authenticated user") |
80 | 82 | } |
81 | 83 | await vscode.commands.executeCommand("setContext", "coder.authenticated", true) |
| 84 | + if (user.roles.find((role) => role.name === "owner")) { |
| 85 | + await vscode.commands.executeCommand("setContext", "coder.isOwner", true) |
| 86 | + } |
82 | 87 | vscode.window |
83 | 88 | .showInformationMessage( |
84 | 89 | `Welcome to Coder, ${user.username}!`, |
@@ -108,7 +113,37 @@ export class Commands { |
108 | 113 | }) |
109 | 114 | } |
110 | 115 |
|
111 | | - public async open(...args: string[]): Promise<void> { |
| 116 | + public async createWorkspace(): Promise<void> { |
| 117 | + const uri = this.storage.getURL() + "/templates" |
| 118 | + await vscode.commands.executeCommand("vscode.open", uri) |
| 119 | + } |
| 120 | + |
| 121 | + public async navigateToWorkspace(workspace: WorkspaceTreeItem) { |
| 122 | + if (workspace) { |
| 123 | + const uri = this.storage.getURL() + `/@${workspace.workspaceOwner}/${workspace.workspaceName}` |
| 124 | + await vscode.commands.executeCommand("vscode.open", uri) |
| 125 | + } else if (this.storage.workspace) { |
| 126 | + const uri = this.storage.getURL() + `/@${this.storage.workspace.owner_name}/${this.storage.workspace.name}` |
| 127 | + await vscode.commands.executeCommand("vscode.open", uri) |
| 128 | + } else { |
| 129 | + vscode.window.showInformationMessage("No workspace found.") |
| 130 | + } |
| 131 | + } |
| 132 | + |
| 133 | + public async navigateToWorkspaceSettings(workspace: WorkspaceTreeItem) { |
| 134 | + if (workspace) { |
| 135 | + const uri = this.storage.getURL() + `/@${workspace.workspaceOwner}/${workspace.workspaceName}/settings` |
| 136 | + await vscode.commands.executeCommand("vscode.open", uri) |
| 137 | + } else if (this.storage.workspace) { |
| 138 | + const uri = |
| 139 | + this.storage.getURL() + `/@${this.storage.workspace.owner_name}/${this.storage.workspace.name}/settings` |
| 140 | + await vscode.commands.executeCommand("vscode.open", uri) |
| 141 | + } else { |
| 142 | + vscode.window.showInformationMessage("No workspace found.") |
| 143 | + } |
| 144 | + } |
| 145 | + |
| 146 | + public async open(...args: unknown[]): Promise<void> { |
112 | 147 | let workspaceOwner: string |
113 | 148 | let workspaceName: string |
114 | 149 | let folderPath: string | undefined |
@@ -165,19 +200,19 @@ export class Commands { |
165 | 200 | workspaceOwner = workspace.owner_name |
166 | 201 | workspaceName = workspace.name |
167 | 202 |
|
168 | | - // TODO: multiple agent support |
169 | | - const agents = workspace.latest_build.resources.reduce((acc, resource) => { |
170 | | - return acc.concat(resource.agents || []) |
171 | | - }, [] as WorkspaceAgent[]) |
172 | | - |
173 | | - if (agents.length === 1) { |
174 | | - folderPath = agents[0].expanded_directory |
175 | | - } |
| 203 | + const [, folderPathExtracted] = extractAgentsAndFolderPath(workspace) |
| 204 | + folderPath = folderPathExtracted |
| 205 | + } else if (args.length === 2) { |
| 206 | + // opening a workspace from the sidebar |
| 207 | + const workspaceTreeItem = args[0] as WorkspaceTreeItem |
| 208 | + workspaceOwner = workspaceTreeItem.workspaceOwner |
| 209 | + workspaceName = workspaceTreeItem.workspaceName |
| 210 | + folderPath = workspaceTreeItem.workspaceFolderPath |
176 | 211 | } else { |
177 | | - workspaceOwner = args[0] |
178 | | - workspaceName = args[1] |
| 212 | + workspaceOwner = args[0] as string |
| 213 | + workspaceName = args[1] as string |
179 | 214 | // workspaceAgent is reserved for args[2], but multiple agents aren't supported yet. |
180 | | - folderPath = args[3] |
| 215 | + folderPath = args[3] as string | undefined |
181 | 216 | } |
182 | 217 |
|
183 | 218 | // A workspace can have multiple agents, but that's handled |
|
0 commit comments