diff --git a/src/channel.ts b/src/channel.ts index 862e50f4..f13e3c06 100644 --- a/src/channel.ts +++ b/src/channel.ts @@ -55,12 +55,13 @@ class Channel implements Channel { openWorkspace() return // load step actions (git commits, commands, open files) - case 'SETUP_ACTIONS': + case 'EDITOR_LEVEL_ENTER': + case 'EDITOR_STEP_ENTER': await vscode.commands.executeCommand(COMMANDS.SET_CURRENT_POSITION, action.payload.position) hooks.onSetupEnter(action.payload.actions) return // load solution step actions (git commits, commands, open files) - case 'SOLUTION_ACTIONS': + case 'EDITOR_SOLUTION_ENTER': await vscode.commands.executeCommand(COMMANDS.SET_CURRENT_POSITION, action.payload.position) hooks.onSolutionEnter(action.payload.actions) return @@ -80,6 +81,15 @@ class Channel implements Channel { case 'EDITOR_RUN_RESET_POSITION': actions.onRunReset({ type: 'POSITION', position: action.payload.position }, this.context) return + case 'EDITOR_STEP_COMPLETE': + hooks.onStepComplete(action.payload) + return + case 'EDITOR_LEVEL_COMPLETE': + hooks.onLevelComplete(action.payload) + return + case 'EDITOR_TUTORIAL_COMPLETE': + hooks.onTutorialComplete(action.payload) + return default: logger(`No match for action type: ${actionType}`) return diff --git a/src/services/hooks/index.ts b/src/services/hooks/index.ts index cc6fc640..95f5b5de 100644 --- a/src/services/hooks/index.ts +++ b/src/services/hooks/index.ts @@ -1,3 +1,4 @@ +import * as T from 'typings' import * as TT from 'typings/tutorial' import * as git from '../git' import loadCommits from './utils/loadCommits' @@ -7,6 +8,7 @@ import runCommands from './utils/runCommands' import runVSCodeCommands from './utils/runVSCodeCommands' import { onError as telemetryOnError } from '../telemetry' import { onRunTest } from '../../actions/onTest' +import logger from '../logger' export const onInit = async (actions: TT.StepActions): Promise => { await loadCommits(actions?.commits) @@ -39,3 +41,15 @@ export const onSolutionEnter = async (actions: TT.StepActions): Promise => export const onError = async (error: Error): Promise => { telemetryOnError(error) } + +export const onStepComplete = async ({ levelId, stepId }: { levelId: string; stepId: string }): Promise => { + logger(`ON STEP COMPLETE: ${JSON.stringify({ levelId, stepId })}`) +} + +export const onLevelComplete = async ({ levelId }: { levelId: string }): Promise => { + logger(`ON LEVEL COMPLETE: ${JSON.stringify(levelId)}`) +} + +export const onTutorialComplete = async ({ tutorialId }: { tutorialId: string }): Promise => { + logger(`ON TUTORIAL COMPLETE: ${JSON.stringify(tutorialId)}`) +} diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index 7a035560..c57296e2 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -32,7 +32,7 @@ export default (editorSend: any) => ({ const step: TT.Step | null = selectors.currentStep(context) // load step actions editorSend({ - type: 'SETUP_ACTIONS', + type: 'EDITOR_LEVEL_ENTER', payload: { position: { stepId: step?.id || null, @@ -48,7 +48,7 @@ export default (editorSend: any) => ({ if (step && step.setup) { // load step actions editorSend({ - type: 'SETUP_ACTIONS', + type: 'EDITOR_STEP_ENTER', payload: { // set position here position: { @@ -76,7 +76,7 @@ export default (editorSend: any) => ({ // tell editor to load solution commit if (step && step.solution) { editorSend({ - type: 'SOLUTION_ACTIONS', + type: 'EDITOR_SOLUTION_ENTER', payload: { position: { stepId: step.id, @@ -133,4 +133,29 @@ export default (editorSend: any) => ({ }, }) }, + onStepComplete(context: T.MachineContext): void { + editorSend({ + type: 'EDITOR_STEP_COMPLETE', + payload: { + levelId: context.position.levelId, + stepId: context.position.levelId, + }, + }) + }, + onLevelComplete(context: T.MachineContext): void { + editorSend({ + type: 'EDITOR_LEVEL_COMPLETE', + payload: { + levelId: context.position.levelId, + }, + }) + }, + onTutorialComplete(context: T.MachineContext): void { + editorSend({ + type: 'EDITOR_TUTORIAL_COMPLETE', + payload: { + tutorialId: context.tutorial?.id, + }, + }) + }, }) diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index e97c1744..43e9077e 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -181,7 +181,7 @@ export const createMachine = (options: any) => { on: { TEST_PASS: { target: 'StepNext', - actions: ['testPass', 'updateStepPosition'], + actions: ['onStepComplete', 'testPass', 'updateStepPosition'], }, TEST_FAIL: { target: 'Normal', @@ -200,7 +200,10 @@ export const createMachine = (options: any) => { target: 'Normal', actions: ['loadStep', 'updateStepPosition'], }, - LEVEL_COMPLETE: 'LevelComplete', + LEVEL_COMPLETE: { + target: 'LevelComplete', + actions: ['onLevelComplete'], + }, }, }, LevelComplete: { @@ -223,14 +226,16 @@ export const createMachine = (options: any) => { target: 'Load', actions: ['updatePosition'], }, - COMPLETED: '#completed-tutorial', + COMPLETED: { + target: '#completed-tutorial', + actions: ['onTutorialComplete'], + }, }, }, }, }, Completed: { id: 'completed-tutorial', - onEntry: ['userTutorialComplete'], // unusued on: { SELECT_TUTORIAL: { target: '#select-new-tutorial',