From a8b041d78d83597196eb8fc468f53096f5f1e91d Mon Sep 17 00:00:00 2001 From: heyzec <61238538+heyzec@users.noreply.github.com> Date: Sat, 28 Jun 2025 01:24:31 +0800 Subject: [PATCH 1/3] feat: changes for OAuth flow --- src/extension.ts | 14 ++++++++++++++ src/utils/messageHandler.tsx | 3 +++ src/utils/messages.ts | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 4873bd3..1b0f2a9 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -51,6 +51,20 @@ export function activate(context: vscode.ExtensionContext) { "*.js": "source", }); } + + vscode.window.registerUriHandler({ + handleUri(uri: vscode.Uri) { + const searchParams = new URLSearchParams(uri.query); + // The following two params are available when logging in via OAuth providers + const code = searchParams.get("code"); + const clientRequestId = searchParams.get("client-request-id"); + + vscode.commands.executeCommand( + "source-academy.show-panel", + `/login/vscode_callback?code=${code}&client-request-id=${clientRequestId}`, + ); + }, + }); } // This method is called when your extension is deactivated diff --git a/src/utils/messageHandler.tsx b/src/utils/messageHandler.tsx index ca696cb..3dd25a9 100644 --- a/src/utils/messageHandler.tsx +++ b/src/utils/messageHandler.tsx @@ -173,6 +173,9 @@ export class MessageHandler { this.panel?.reveal(vscode.ViewColumn.Two); } break; + case MessageTypeNames.LoginWithBrowser: + const { route } = message; + vscode.env.openExternal(vscode.Uri.parse(route)); } console.log(`${Date.now()} Finish handleMessage: ${message.type}`); } diff --git a/src/utils/messages.ts b/src/utils/messages.ts index 0ce9367..eb6f912 100644 --- a/src/utils/messages.ts +++ b/src/utils/messages.ts @@ -89,6 +89,9 @@ const Messages = createMessages({ questionId, choice, }), + LoginWithBrowser: (route: string) => ({ + route, + }), }); export default Messages; From 982783252876f87351be0d383be2d702c6eb7b7b Mon Sep 17 00:00:00 2001 From: heyzec <61238538+heyzec@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:35:25 +0800 Subject: [PATCH 2/3] fix: reuse existing panel --- src/commands/showPanel.tsx | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/commands/showPanel.tsx b/src/commands/showPanel.tsx index 77997bf..02e9311 100644 --- a/src/commands/showPanel.tsx +++ b/src/commands/showPanel.tsx @@ -22,24 +22,24 @@ export async function showPanel( language = LANGUAGES.SOURCE_1; } - // Get a reference to the active editor (before the focus is switched to our newly created webview) - // firstEditor = vscode.window.activeTextEditor!; - - messageHandler.panel = vscode.window.createWebviewPanel( - "source-academy-panel", - "Source Academy", - vscode.ViewColumn.Beside, - { - enableScripts: true, // Enable scripts in the webview - retainContextWhenHidden: true, - }, - ); + // Don't recreate the panel it already exists. There will only be one panel at anytime. + if (!messageHandler.panel) { + messageHandler.panel = vscode.window.createWebviewPanel( + "source-academy-panel", + "Source Academy", + vscode.ViewColumn.Beside, + { + enableScripts: true, // Enable scripts in w the webview + retainContextWhenHidden: true, + }, + ); - messageHandler.panel.webview.onDidReceiveMessage( - (message: MessageType) => messageHandler.handleMessage(context, message), - undefined, - context.subscriptions, - ); + messageHandler.panel.webview.onDidReceiveMessage( + (message: MessageType) => messageHandler.handleMessage(context, message), + undefined, + context.subscriptions, + ); + } const iframeUrl = new URL(route ?? "/playground", config.frontendBaseUrl) .href; From 40a5b03121a0dfad3ba5b484c9989ab38b9c1bd0 Mon Sep 17 00:00:00 2001 From: heyzec <61238538+heyzec@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:44:40 +0800 Subject: [PATCH 3/3] docs: update README for auth dialogs --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1a32808..b0e8d2d 100644 --- a/README.md +++ b/README.md @@ -41,11 +41,16 @@ After installing the extension, 1. Click on the newly-added Source Academy icon on the left sidebar. 2. Launch the Source Academy panel. - + -Alternatively, use the `Source Academy: Show the Source Academy Panel` command. + Alternatively, use the `Source Academy: Show the Source Academy Panel` command. -Once the panel loads, you'll be prompted to log in. Afterwards, begin coding by opening any assessment. +3. Choose a login method and authenticate in your browser. + + - When prompted, click **Open** to proceed to the external website. + - After login, click **Open** again to allow the extension to open the URI. Optionally, check `Do not ask me again for this extension`. + +4. You may now begin coding by opening any assessment. ### Changing the frontend