diff --git a/src/actions/tutorialConfig.ts b/src/actions/tutorialConfig.ts index cf6ae5fd..4c38ca19 100644 --- a/src/actions/tutorialConfig.ts +++ b/src/actions/tutorialConfig.ts @@ -2,11 +2,19 @@ import * as G from 'typings/graphql' import * as vscode from 'vscode' import * as git from '../services/git' -const tutorialConfig = async (tutorial: G.Tutorial) => { +interface TutorialConfigParams { + tutorial: G.Tutorial, + alreadyConfigured?: boolean +} + +const tutorialConfig = async ({tutorial, alreadyConfigured}: TutorialConfigParams) => { + if (!alreadyConfigured) { + // setup git, add remote + await git.initIfNotExists() - // setup git, add remote - await git.initIfNotExists() - await git.setupRemote(tutorial.repo.uri) + // TODO: if remote not already set + await git.setupRemote(tutorial.repo.uri) + } // TODO: allow multiple coding languages in a tutorial const language = tutorial.codingLanguage.toLowerCase() diff --git a/src/channel/context.ts b/src/channel/context.ts index d08b56b4..b18f4a26 100644 --- a/src/channel/context.ts +++ b/src/channel/context.ts @@ -23,6 +23,11 @@ class Context { const position: CR.Position = this.position.setPositionFromProgress(tutorial, progress) return {progress, position} } + public reset = () => { + this.tutorial.reset() + this.progress.reset() + this.position.reset() + } } export default Context \ No newline at end of file diff --git a/src/channel/index.ts b/src/channel/index.ts index d47282f6..66a35599 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -64,13 +64,25 @@ class Channel implements Channel { // clear tutorial local storage case 'TUTORIAL_CLEAR': // clear current progress/position/tutorial - this.context = new Context(this.workspaceState) + this.context.reset() return // configure test runner, language, git case 'EDITOR_TUTORIAL_CONFIG': const tutorialData = action.payload.tutorial this.context.setTutorial(this.workspaceState, tutorialData) - tutorialConfig(tutorialData) + tutorialConfig({ + tutorial: tutorialData + }) + return + case 'EDITOR_TUTORIAL_CONTINUE_CONFIG': + const tutorialContinue: G.Tutorial | null = this.context.tutorial.get() + if (!tutorialContinue) { + throw new Error('Invalid tutorial to continue') + } + tutorialConfig({ + tutorial: tutorialContinue, + alreadyConfigured: true + }) return case 'EDITOR_SYNC_PROGRESS': // sync client progress on server diff --git a/src/channel/state/Position.ts b/src/channel/state/Position.ts index e6c89bb5..14ade795 100644 --- a/src/channel/state/Position.ts +++ b/src/channel/state/Position.ts @@ -1,15 +1,17 @@ import * as CR from 'typings' import * as G from 'typings/graphql' +const defaultValue: CR.Position = { + levelId: '', + stageId: '', + stepId: '', +} + // position class Position { private value: CR.Position constructor() { - this.value = { - levelId: '', - stageId: '', - stepId: '', - } + this.value = defaultValue } public get = () => { return this.value @@ -17,6 +19,9 @@ class Position { public set = (value: CR.Position) => { this.value = value } + public reset = () => { + this.value = defaultValue + } // calculate the current position based on the saved progress public setPositionFromProgress = (tutorial: G.Tutorial, progress: CR.Progress): CR.Position => { diff --git a/src/channel/state/Progress.ts b/src/channel/state/Progress.ts index 4d60df3c..ce457caa 100644 --- a/src/channel/state/Progress.ts +++ b/src/channel/state/Progress.ts @@ -32,11 +32,15 @@ class Progress { } public set = (value: CR.Progress) => { this.value = value - if (this.storage) { - this.storage.set(value) + if (!this.storage) { + throw new Error('Tutorial storage not found') } + this.storage.set(value) return this.value } + public reset = () => { + this.set(defaultValue) + } public setStepComplete = (stepId: string): CR.Progress => { const next = this.value next.steps[stepId] = true diff --git a/src/channel/state/Tutorial.ts b/src/channel/state/Tutorial.ts index a7e8f0e3..4d54ab97 100644 --- a/src/channel/state/Tutorial.ts +++ b/src/channel/state/Tutorial.ts @@ -19,11 +19,13 @@ class Tutorial { this.value = value }) } - public get = () => { - return this.value - } - public set = (value: G.Tutorial) => { + public get = () => this.value + public set = (value: G.Tutorial | null) => { this.value = value + this.storage.set(value) + } + public reset = () => { + this.set(null) } } diff --git a/src/editor/ReactWebView.ts b/src/editor/ReactWebView.ts index ef4dd50e..5af844a6 100644 --- a/src/editor/ReactWebView.ts +++ b/src/editor/ReactWebView.ts @@ -31,7 +31,6 @@ class ReactWebView { private channel: Channel public constructor({extensionPath, workspaceState}: ReactWebViewProps) { - console.log(`extPath ${extensionPath}`) this.extensionPath = extensionPath // Create and show a new webview panel @@ -73,7 +72,7 @@ class ReactWebView { this.channel = new Channel({ workspaceState, postMessage: (action: Action): Thenable => { - console.log(`postMessage ${JSON.stringify(action)}`) + // console.log(`postMessage ${JSON.stringify(action)}`) return this.panel.webview.postMessage(action) } }) diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index 8257dd7e..91f74585 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -11,6 +11,7 @@ export default { type: 'EDITOR_TUTORIAL_LOAD', }) }, + // TODO: syncProgress unused syncProgress(context: CR.MachineContext) { // sync progress in editor local storage for persistence channel.editorSend({ @@ -23,6 +24,7 @@ export default { initializeTutorial(context: CR.MachineContext, event: CR.MachineEvent) { // setup test runner and git const {tutorial} = event.data.payload + if (!tutorial) { throw new Error('Invalid tutorial for tutorial config') } @@ -32,6 +34,11 @@ export default { payload: {tutorial}, }) }, + continueConfig() { + channel.editorSend({ + type: 'EDITOR_TUTORIAL_CONTINUE_CONFIG', + }) + }, testStart(context: CR.MachineContext, event: CR.MachineEvent) { console.log('EDITOR: TEST_RUN') const {stepId} = event.payload @@ -75,7 +82,7 @@ export default { }) } }, - clearStorage() { + clearStorage(): void { channel.editorSend({type: 'TUTORIAL_CLEAR'}) } } \ No newline at end of file diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index b6f6a386..937aea1e 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -35,11 +35,11 @@ export const machine = Machine