From 19d819c8da2dce7f9cb803a7902772b465f79d6d Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 22 Sep 2019 21:58:54 -0700 Subject: [PATCH 1/3] ensure clearing of old progress on new --- src/channel/context.ts | 5 +++++ src/channel/index.ts | 2 +- src/channel/state/Position.ts | 15 ++++++++++----- src/channel/state/Progress.ts | 8 ++++++-- src/channel/state/Tutorial.ts | 10 ++++++---- src/editor/ReactWebView.ts | 3 +-- web-app/src/services/state/actions/editor.ts | 2 +- web-app/src/services/state/machine.ts | 2 +- 8 files changed, 31 insertions(+), 16 deletions(-) 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..4260f237 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -64,7 +64,7 @@ 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': 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..ed4ca228 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -75,7 +75,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..f9070214 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 Date: Sun, 22 Sep 2019 22:21:03 -0700 Subject: [PATCH 2/3] setup editor config on continue --- src/actions/tutorialConfig.ts | 16 ++++++++++++---- src/channel/index.ts | 14 +++++++++++++- web-app/src/services/state/actions/editor.ts | 7 +++++++ web-app/src/services/state/machine.ts | 6 +++++- 4 files changed, 37 insertions(+), 6 deletions(-) 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/index.ts b/src/channel/index.ts index 4260f237..66a35599 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -70,7 +70,19 @@ class Channel implements Channel { 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/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index ed4ca228..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 diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index f9070214..1d673c75 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -50,7 +50,10 @@ export const machine = Machine Date: Sun, 22 Sep 2019 22:23:10 -0700 Subject: [PATCH 3/3] sync progress on stage/tutorial complete --- web-app/src/services/state/machine.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index 1d673c75..937aea1e 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -159,6 +159,7 @@ export const machine = Machine