diff --git a/src/channel/index.ts b/src/channel/index.ts index 34f5d3da..4a88cb23 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -144,12 +144,12 @@ class Channel implements Channel { const actionType: string = typeof action === 'string' ? action : action.type switch (actionType) { case 'TEST_PASS': - // update local storage stepProgress - const progress = this.context.progress.setStepComplete(action.payload.stepId) const tutorial = this.context.tutorial.get() if (!tutorial) { throw new Error('Error with current tutorial') } + // update local storage stepProgress + const progress = this.context.progress.setStepComplete(tutorial.version.data, action.payload.stepId) this.context.position.setPositionFromProgress(tutorial, progress) saveCommit() } diff --git a/src/channel/state/Position.ts b/src/channel/state/Position.ts index 520c60ed..dcf049f0 100644 --- a/src/channel/state/Position.ts +++ b/src/channel/state/Position.ts @@ -33,17 +33,16 @@ class Position { throw new Error('Error setting position from progress') } + // get level const { levels } = tutorial.version.data - const lastLevelIndex: number | undefined = levels.findIndex((l: G.Level) => !progress.levels[l.id]) - if (lastLevelIndex >= levels.length) { throw new Error('Error setting progress level') } - const currentLevel: G.Level = levels[lastLevelIndex] + // get step + const currentLevel: G.Level = levels[lastLevelIndex] const { steps } = currentLevel - const lastStepIndex: number | undefined = steps.findIndex((s: G.Step) => !progress.steps[s.id]) if (lastStepIndex >= steps.length) { throw new Error('Error setting progress step') diff --git a/src/channel/state/Progress.ts b/src/channel/state/Progress.ts index f1c0f26c..bd99c505 100644 --- a/src/channel/state/Progress.ts +++ b/src/channel/state/Progress.ts @@ -39,11 +39,25 @@ class Progress { public reset = () => { this.set(defaultValue) } - public setStepComplete = (stepId: string): CR.Progress => { + public setStepComplete = (tutorialData: G.TutorialData, stepId: string): CR.Progress => { const next = this.value + // mark step complete next.steps[stepId] = true - // TODO validate if progress is complete for a level or tutorial + const currentLevel = tutorialData.levels.find(l => l.steps.find(s => s.id === stepId)) + if (!currentLevel) { + throw new Error(`setStepComplete level not found for stepId ${stepId}`) + } + + if (currentLevel.steps[currentLevel.steps.length - 1]) { + // final step for level is complete + next.levels[currentLevel.id] = true + + if (tutorialData.levels[tutorialData.levels.length - 1].id === currentLevel.id) { + //final level complete so tutorial is complete + next.complete = true + } + } return this.set(next) } diff --git a/src/editor/commands.ts b/src/editor/commands.ts index ad1911e3..22a08340 100644 --- a/src/editor/commands.ts +++ b/src/editor/commands.ts @@ -1,6 +1,5 @@ import * as T from 'typings' import * as vscode from 'vscode' -import notify from '../services/notify' import createTestRunner, { Payload } from '../services/testRunner' import createWebView from '../webview' @@ -27,9 +26,6 @@ export const createCommands = ({ extensionPath, workspaceState, workspaceRoot }: return { // initialize [COMMANDS.START]: async () => { - // TODO replace with a prompt to open a workspace - // await isEmptyWorkspace() - let webviewState: 'INITIALIZING' | 'RESTARTING' if (!webview) { webviewState = 'INITIALIZING'