diff --git a/extension/bwcontest/src/BWPanel.ts b/extension/bwcontest/src/BWPanel.ts index cc88d86..5dcf8ee 100644 --- a/extension/bwcontest/src/BWPanel.ts +++ b/extension/bwcontest/src/BWPanel.ts @@ -28,7 +28,7 @@ export class BWPanel { // Otherwise, create a new panel. const panel = vscode.window.createWebviewPanel( BWPanel.viewType, - 'VSinder', + 'BWContest', column || vscode.ViewColumn.One, { // Enable javascript in the webview diff --git a/extension/bwcontest/src/SidebarProvider.ts b/extension/bwcontest/src/SidebarProvider.ts index a13f587..2cc9422 100644 --- a/extension/bwcontest/src/SidebarProvider.ts +++ b/extension/bwcontest/src/SidebarProvider.ts @@ -1,10 +1,14 @@ import * as vscode from 'vscode'; import { getNonce } from './getNonce'; +import { cloneAndOpenRepo } from './extension'; export class SidebarProvider implements vscode.WebviewViewProvider { _view?: vscode.WebviewView; + _context?: vscode.ExtensionContext; - constructor(private readonly _extensionUri: vscode.Uri) {} + constructor(private readonly _extensionUri: vscode.Uri, context: vscode.ExtensionContext) { + this._context = context; + } public resolveWebviewView(webviewView: vscode.WebviewView) { this._view = webviewView; @@ -20,6 +24,34 @@ export class SidebarProvider implements vscode.WebviewViewProvider { webviewView.webview.onDidReceiveMessage(async (data) => { switch (data.type) { + case 'onStartup': { + const token: string | undefined = this._context?.globalState.get('token'); + if (token) { + this._view?.webview.postMessage({ + type: 'onSession', + value: token + }); + } + break; + } + case 'onClone': { + if (!data.value || !data.value.contestId || !data.value.teamId) { + return; + } + await cloneAndOpenRepo(parseInt(data.value.contestId), parseInt(data.value.teamId)); + break; + } + case 'onLogin': { + if (!data.value) { + return; + } + this._context?.globalState.update('token', data.value); + break; + } + case 'onLogout': { + this._context?.globalState.update('token', null); + break; + } case 'onInfo': { if (!data.value) { return; @@ -38,7 +70,6 @@ export class SidebarProvider implements vscode.WebviewViewProvider { }); } - private _getHtmlForWebview(webview: vscode.Webview) { const styleResetUri = webview.asWebviewUri( vscode.Uri.joinPath(this._extensionUri, 'media', 'reset.css') diff --git a/extension/bwcontest/src/extension.ts b/extension/bwcontest/src/extension.ts index e466001..2e546f2 100644 --- a/extension/bwcontest/src/extension.ts +++ b/extension/bwcontest/src/extension.ts @@ -1,7 +1,5 @@ import * as vscode from 'vscode'; -import { BWPanel } from './BWPanel'; import { SidebarProvider } from './SidebarProvider'; -import { notDeepEqual } from 'assert'; import * as child_process from 'child_process'; import * as fs from 'fs-extra'; @@ -21,11 +19,30 @@ function closeAllWorkspaces() { } } -async function cloneAndOpenRepo(baseUrl: string, path: string, contestId: number, teamId: number) { - const repoUrl = `${baseUrl}/${contestId.toString()}/${teamId.toString()}.git`; +export async function cloneAndOpenRepo(contestId: number, teamId: number) { + const currentSettings = vscode.workspace.getConfiguration().get('BWContest'); + + if (!currentSettings || currentSettings.repoBaseUrl == '') { + vscode.window.showErrorMessage('BWContest: BWContest.repoBaseURL not set'); + return; + } + if (!currentSettings || currentSettings.repoClonePath == '') { + vscode.window.showErrorMessage('BWContest: BWContest.repoClonePath not set'); + return; + } + + const repoUrl = `${currentSettings.repoBaseUrl}/${contestId.toString()}/${teamId.toString()}.git`; const repoName = repoUrl.split('/').pop()?.replace('.git', '')!; - const clonedRepoPath = `${path}/${repoName}`; + + if (!fs.existsSync(`${currentSettings.repoClonePath}/BWContest`)) { + fs.mkdirSync(`${currentSettings.repoClonePath}/BWContest`); + } + if (!fs.existsSync(`${currentSettings.repoClonePath}/BWContest/${contestId.toString()}`)) { + fs.mkdirSync(`${currentSettings.repoClonePath}/BWContest/${contestId.toString()}`); + } + + const clonedRepoPath = `${currentSettings.repoClonePath}/BWContest/${contestId.toString()}/${repoName}`; if (fs.existsSync(clonedRepoPath)) { const confirm = await vscode.window.showWarningMessage( @@ -40,12 +57,16 @@ async function cloneAndOpenRepo(baseUrl: string, path: string, contestId: number fs.removeSync(clonedRepoPath); } - child_process.exec(`git clone ${repoUrl}`, { cwd: path }, (error, stdout, stderr) => { - if (error) { - vscode.window.showErrorMessage(`BWContest: Failed to clone repo: ${error.message}`); - return; + child_process.exec( + `git clone ${repoUrl}`, + { cwd: `${currentSettings.repoClonePath}/BWContest/${contestId.toString()}` }, + (error, stdout, stderr) => { + if (error) { + vscode.window.showErrorMessage(`BWContest: Failed to clone repo: ${error.message}`); + return; + } } - }); + ); const addedFolder = vscode.workspace.updateWorkspaceFolders( vscode.workspace.workspaceFolders?.length ?? 0, @@ -62,28 +83,12 @@ async function cloneAndOpenRepo(baseUrl: string, path: string, contestId: number } export function activate(context: vscode.ExtensionContext) { - const sidebarProvider = new SidebarProvider(context.extensionUri); + const sidebarProvider = new SidebarProvider(context.extensionUri, context); context.subscriptions.push( vscode.window.registerWebviewViewProvider('bwcontest-sidebar', sidebarProvider) ); - context.subscriptions.push( - vscode.commands.registerCommand('bwcontest.helloWorld', () => { - const currentSettings = vscode.workspace - .getConfiguration() - .get('BWContest'); - - if (!currentSettings || currentSettings.repoBaseUrl == '') { - vscode.window.showErrorMessage('BWContest: BWContest.repoBaseURL not set'); - return; - } - if (!currentSettings || currentSettings.repoClonePath == '') { - vscode.window.showErrorMessage('BWContest: BWContest.repoClonePath not set'); - return; - } - cloneAndOpenRepo(currentSettings.repoBaseUrl, currentSettings.repoClonePath, 102, 1); - }) - ); + context.subscriptions.push(vscode.commands.registerCommand('bwcontest.helloWorld', () => {})); context.subscriptions.push( vscode.commands.registerCommand('bwcontest.askQuestion', async () => { diff --git a/extension/bwcontest/webviews/components/Sidebar.svelte b/extension/bwcontest/webviews/components/Sidebar.svelte index 3e70996..6b10df5 100644 --- a/extension/bwcontest/webviews/components/Sidebar.svelte +++ b/extension/bwcontest/webviews/components/Sidebar.svelte @@ -1,49 +1,94 @@

Contest

@@ -58,4 +103,9 @@ async function onLogout() { {:else} + {#if teamData} +

TeamID: {teamData.teamId}

+

ContestID: {teamData.contestId}

+ + {/if} {/if} \ No newline at end of file