From 2379829953c0f441d7ec1d66349a6aed3b9749fe Mon Sep 17 00:00:00 2001 From: Jonathan Carter Date: Sat, 29 May 2021 19:44:38 +0000 Subject: [PATCH] Adding URI handler --- CHANGELOG.md | 4 ++++ package.json | 2 +- src/extension.ts | 45 +++++++++++++++++++++++++++++++++++++++----- src/store/actions.ts | 5 +++-- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3374731..340346a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - Automatically set the "pattern" record mode when you create a new tour, and select `None` for the git ref - Added support for opening a `*.tour` file in the VS Code notebook editor (Insiders only) +## v0.0.54 + +- Added a URI handler, with support for launching a specific tour and step + ## v0.0.53 - Exposed a new `onDidStartTour` event and `startTourByUri` method to the extension API diff --git a/package.json b/package.json index df8568a..bf0b3b8 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "CodeTour", "description": "VS Code extension that allows you to record and playback guided tours of codebases, directly within the editor", "publisher": "vsls-contrib", - "version": "0.0.53", + "version": "0.0.54", "author": { "name": "Microsoft Corporation" }, diff --git a/src/extension.ts b/src/extension.ts index 5d52f33..61e25b6 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,13 +1,19 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +import { URLSearchParams } from "url"; import * as vscode from "vscode"; import { initializeApi } from "./api"; import { initializeGitApi } from "./git"; import { registerLiveShareModule } from "./liveShare"; import { registerPlayerModule } from "./player"; import { registerRecorderModule } from "./recorder"; -import { promptForTour, startDefaultTour } from "./store/actions"; +import { store } from "./store"; +import { + promptForTour, + startCodeTour, + startDefaultTour +} from "./store/actions"; import { discoverTours as _discoverTours } from "./store/provider"; /** @@ -21,16 +27,45 @@ function discoverTours(): Promise { } class URIHandler implements vscode.UriHandler { - private _didStartDefaultTour = false; - get didStartDefaultTour(): boolean { return this._didStartDefaultTour; } + get didStartDefaultTour(): boolean { + return this._didStartDefaultTour; + } async handleUri(uri: vscode.Uri): Promise { - if (uri.path === '/startDefaultTour') { + if (uri.path === "/startDefaultTour") { this._didStartDefaultTour = true; await discoverTours(); - startDefaultTour(); + + let tourPath: string | null | undefined, stepNumber; + if (uri.query) { + const origin = vscode.Uri.parse(uri.query); + if (origin.query) { + const params = new URLSearchParams(origin.query); + tourPath = params.get("tour"); + + const step = params.get("step"); + if (step) { + stepNumber = Number(step); + } + } + } + + if (tourPath) { + if (!tourPath.endsWith(".tour")) { + tourPath = `${tourPath}.tour`; + } + + const tour = store.tours.find(tour => + tour.id.endsWith(tourPath as string) + ); + if (tour) { + startCodeTour(tour, stepNumber); + } + } else { + startDefaultTour(undefined, undefined, stepNumber); + } } return; diff --git a/src/store/actions.ts b/src/store/actions.ts index d36a871..55e95a7 100644 --- a/src/store/actions.ts +++ b/src/store/actions.ts @@ -180,7 +180,8 @@ export async function promptForTour( export async function startDefaultTour( workspaceRoot: Uri = getWorkspaceKey(), - tours: CodeTour[] = store.tours + tours: CodeTour[] = store.tours, + step: number = 0 ): Promise { if (tours.length === 0) { return false; @@ -191,7 +192,7 @@ export async function startDefaultTour( tours.find(tour => tour.title.match(/^#?1\s+-/)); if (primaryTour) { - startCodeTour(primaryTour, 0, workspaceRoot, false, undefined, tours); + startCodeTour(primaryTour, step, workspaceRoot, false, undefined, tours); return true; } else { return selectTour(tours, workspaceRoot);