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