diff --git a/src/actions/tutorialConfig.ts b/src/actions/tutorialConfig.ts index 4c38ca19..9fd8bee4 100644 --- a/src/actions/tutorialConfig.ts +++ b/src/actions/tutorialConfig.ts @@ -5,15 +5,17 @@ import * as git from '../services/git' interface TutorialConfigParams { tutorial: G.Tutorial, alreadyConfigured?: boolean + onComplete?(): void } -const tutorialConfig = async ({tutorial, alreadyConfigured}: TutorialConfigParams) => { +const tutorialConfig = async ({tutorial, alreadyConfigured, onComplete}: TutorialConfigParams) => { if (!alreadyConfigured) { // setup git, add remote await git.initIfNotExists() // TODO: if remote not already set await git.setupRemote(tutorial.repo.uri) + if (onComplete) {onComplete()} } // TODO: allow multiple coding languages in a tutorial diff --git a/src/channel/index.ts b/src/channel/index.ts index e6e48598..5a066fae 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -74,7 +74,9 @@ class Channel implements Channel { const tutorialData = action.payload.tutorial this.context.setTutorial(this.workspaceState, tutorialData) tutorialConfig({ - tutorial: tutorialData + tutorial: tutorialData, + // must await async git setup or commit loading fails + onComplete: () => this.send({type: 'TUTORIAL_CONFIGURED'}) }) return case 'EDITOR_TUTORIAL_CONTINUE_CONFIG': diff --git a/web-app/src/services/channel/index.ts b/web-app/src/services/channel/index.ts index 1e21dae4..93b6c598 100644 --- a/web-app/src/services/channel/index.ts +++ b/web-app/src/services/channel/index.ts @@ -40,6 +40,9 @@ class Channel { case 'NEW_TUTORIAL': this.machineSend(action) return + case 'TUTORIAL_CONFIGURED': + this.machineSend(action) + return case 'CONTINUE_TUTORIAL': this.machineSend(action) return diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index 91f74585..0d0316dc 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -2,6 +2,8 @@ import * as G from 'typings/graphql' import * as CR from 'typings' import * as selectors from '../../selectors' import channel from '../../channel' +import client from '../../apollo' +import tutorialQuery from '../../apollo/queries/tutorial' export default { loadStoredTutorial() { @@ -23,16 +25,29 @@ 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') + if (!context.tutorial) { + throw new Error('Tutorial not available to load') } - console.log('EDITOR: TUTORIAL_CONFIG', tutorial) - channel.editorSend({ - type: 'EDITOR_TUTORIAL_CONFIG', - payload: {tutorial}, + + client.query({ + query: tutorialQuery, + variables: { + tutorialId: context.tutorial.id, + version: context.tutorial.version.version, + } + }).then((result) => { + if (!result || !result.data || !result.data.tutorial) { + return Promise.reject('No tutorial returned from tutorial config query') + } + + channel.editorSend({ + type: 'EDITOR_TUTORIAL_CONFIG', + payload: {tutorial: result.data.tutorial}, + }) }) + .catch((error: Error) => { + return Promise.reject(`Failed to load tutorial config ${error.message}`) + }) }, continueConfig() { channel.editorSend({ diff --git a/web-app/src/services/state/actions/invoke.ts b/web-app/src/services/state/actions/invoke.ts deleted file mode 100644 index 5f4d1713..00000000 --- a/web-app/src/services/state/actions/invoke.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as CR from 'typings' -import client from '../../apollo' -import tutorialQuery from '../../apollo/queries/tutorial' - -export const loadTutorial = async (context: CR.MachineContext) => { - - if (!context.tutorial) { - throw new Error('Tutorial not available to load') - } - - const result = await client.query({ - query: tutorialQuery, - variables: { - tutorialId: context.tutorial.id, - version: context.tutorial.version.version, - } - }) - .catch((error: Error) => { - return Promise.reject(`Failed to load tutorial config ${error.message}`) - }) - if (!result || !result.data) { - return Promise.reject('No tutorial returned from tutorial config query') - } - - const {data} = result - return { - type: 'TUTORIAL_LOADED', - payload: data - } -} \ 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 937aea1e..c2cf3131 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -1,7 +1,6 @@ import {Machine, MachineOptions} from 'xstate' import * as CR from 'typings' import actions from './actions' -import * as invoke from './actions/invoke' const options: MachineOptions = { // @ts-ignore @@ -65,15 +64,11 @@ export const machine = Machine