|
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