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 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; 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;