From aa863043860fdc605f5d47eb4c94595f41a39bd3 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 11:01:51 -0700 Subject: [PATCH 1/9] clean up logs Signed-off-by: shmck --- src/channel/index.ts | 4 ++-- src/services/logger/index.ts | 16 +++++++++++----- web-app/src/components/ErrorBoundary/index.tsx | 4 ++-- web-app/src/components/Router/index.tsx | 4 ++-- web-app/src/services/logger/index.ts | 10 ++++++++-- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/channel/index.ts b/src/channel/index.ts index 133df3eb..972cb1da 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -329,7 +329,7 @@ class Channel implements Channel { case 'TEST_PASS': const tutorial = this.context.tutorial.get() if (!tutorial) { - throw new Error('Error with current tutorial') + throw new Error('ERROR: Tutorial not found in test run') } // update local storage stepProgress const progress = this.context.progress.setStepComplete(tutorial, action.payload.stepId) @@ -340,7 +340,7 @@ class Channel implements Channel { // send message const sentToClient = await this.postMessage(action) if (!sentToClient) { - throw new Error(`Message post failure: ${JSON.stringify(action)}`) + throw new Error(`ERROR: Message post failure: ${JSON.stringify(action)}`) } } } diff --git a/src/services/logger/index.ts b/src/services/logger/index.ts index 9f7ecdfc..9b2945e8 100644 --- a/src/services/logger/index.ts +++ b/src/services/logger/index.ts @@ -1,13 +1,19 @@ import { LOG } from '../../environment' -const logger = (message: string | string[]) => { +export type Log = string | object + +const logger = (...messages: Log[]): void => { if (!LOG) { return } - if (Array.isArray(message)) { - message.forEach(console.log) - } else { - console.log(message) + // Inside vscode, you console.log does not allow more than 1 param + // to get around it, we can log with multiple log statements + for (const message of messages) { + if (typeof message === 'object') { + console.log(JSON.stringify(message)) + } else { + console.log(message) + } } } diff --git a/web-app/src/components/ErrorBoundary/index.tsx b/web-app/src/components/ErrorBoundary/index.tsx index 9815f176..a01cf894 100644 --- a/web-app/src/components/ErrorBoundary/index.tsx +++ b/web-app/src/components/ErrorBoundary/index.tsx @@ -10,8 +10,8 @@ class ErrorBoundary extends React.Component { // Display fallback UI this.setState({ errorMessage: error.message }) // You can also log the error to an error reporting service - logger('ERROR in component:', JSON.stringify(error)) - logger('ERROR info:', JSON.stringify(info)) + logger('ERROR in component:', error) + logger('ERROR info:', info) } public render() { diff --git a/web-app/src/components/Router/index.tsx b/web-app/src/components/Router/index.tsx index 56be6dad..e571e215 100644 --- a/web-app/src/components/Router/index.tsx +++ b/web-app/src/components/Router/index.tsx @@ -59,14 +59,14 @@ const useRouter = (): Output => { } else if (Array.isArray(path)) { pathMatch = path.some((p) => state.matches(p)) } else { - throw new Error(`Invalid route path ${JSON.stringify(path)}`) + throw new Error(`ERROR: Invalid route path: ${JSON.stringify(path)}`) } if (pathMatch) { // @ts-ignore return child.props.children } } - const message = `No Route matches for ${JSON.stringify(state)}` + const message = `ERROR: No Route matches for ${JSON.stringify(state)}` onError(new Error(message)) console.warn(message) return null diff --git a/web-app/src/services/logger/index.ts b/web-app/src/services/logger/index.ts index a85e6e5a..9b2945e8 100644 --- a/web-app/src/services/logger/index.ts +++ b/web-app/src/services/logger/index.ts @@ -1,13 +1,19 @@ import { LOG } from '../../environment' -const logger = (...messages: string[]) => { +export type Log = string | object + +const logger = (...messages: Log[]): void => { if (!LOG) { return } // Inside vscode, you console.log does not allow more than 1 param // to get around it, we can log with multiple log statements for (const message of messages) { - console.log(message) + if (typeof message === 'object') { + console.log(JSON.stringify(message)) + } else { + console.log(message) + } } } From 9168e37c2e815a7f558f86252d9dcda89d7b2dec Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 11:18:09 -0700 Subject: [PATCH 2/9] fix continue init load Signed-off-by: shmck --- src/channel/index.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/channel/index.ts b/src/channel/index.ts index 972cb1da..8261ebc4 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -75,13 +75,13 @@ class Channel implements Channel { // continue from tutorial from local storage const tutorial: TT.Tutorial | null = this.context.tutorial.get() - // new tutorial - if (!tutorial || !tutorial.id) { + if (!tutorial || !tutorial.config) { + // new tutorial this.send({ type: 'START_NEW_TUTORIAL', payload: { env } }) return } - // set tutorial + // set tutorials const { position, progress } = await this.context.setTutorial(this.workspaceState, tutorial) if (progress.complete) { From 125945131e640cb14c5d9eb81b1474232df9bbef Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 11:18:25 -0700 Subject: [PATCH 3/9] refactor tutorial pages Signed-off-by: shmck --- web-app/src/Routes.tsx | 6 +++--- web-app/src/components/Error/index.tsx | 7 ------- .../Tutorial/{CompletedPage.tsx => Completed/index.tsx} | 2 +- .../src/containers/Tutorial/{LevelPage => Level}/Step.tsx | 0 .../Tutorial/{LevelPage/Level.tsx => Level/index.tsx} | 2 ++ web-app/src/containers/Tutorial/{LevelPage => }/index.tsx | 7 ++++--- web-app/stories/Completed.stories.tsx | 2 +- web-app/stories/Level.stories.tsx | 2 +- web-app/stories/Step.stories.tsx | 2 +- 9 files changed, 13 insertions(+), 17 deletions(-) rename web-app/src/containers/Tutorial/{CompletedPage.tsx => Completed/index.tsx} (96%) rename web-app/src/containers/Tutorial/{LevelPage => Level}/Step.tsx (100%) rename web-app/src/containers/Tutorial/{LevelPage/Level.tsx => Level/index.tsx} (98%) rename web-app/src/containers/Tutorial/{LevelPage => }/index.tsx (89%) diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index bc934878..6d89cd6d 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -5,8 +5,8 @@ import ErrorView from './components/Error' import LoadingPage from './containers/Loading' import StartPage from './containers/Start' import SelectTutorialPage from './containers/SelectTutorial' -import CompletedPage from './containers/Tutorial/CompletedPage' -import LevelSummaryPage from './containers/Tutorial/LevelPage' +import CompletedPage from './containers/Tutorial/Completed' +import TutorialPage from './containers/Tutorial' const Routes = () => { const { context, send, Router, Route } = useRouter() @@ -44,7 +44,7 @@ const Routes = () => { - + {/* Completed */} diff --git a/web-app/src/components/Error/index.tsx b/web-app/src/components/Error/index.tsx index 1c6fabea..1defad20 100644 --- a/web-app/src/components/Error/index.tsx +++ b/web-app/src/components/Error/index.tsx @@ -37,13 +37,6 @@ interface Props { } const ErrorMarkdown = ({ error, send }: Props) => { - React.useEffect(() => { - if (error) { - // log error - console.log(`ERROR in markdown: ${error.message}`) - } - }, [error]) - if (!error) { return null } diff --git a/web-app/src/containers/Tutorial/CompletedPage.tsx b/web-app/src/containers/Tutorial/Completed/index.tsx similarity index 96% rename from web-app/src/containers/Tutorial/CompletedPage.tsx rename to web-app/src/containers/Tutorial/Completed/index.tsx index 0e61aa5c..cf598891 100644 --- a/web-app/src/containers/Tutorial/CompletedPage.tsx +++ b/web-app/src/containers/Tutorial/Completed/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import * as T from 'typings' import { css, jsx } from '@emotion/core' -import Button from '../../components/Button' +import Button from '../../../components/Button' const styles = { page: { diff --git a/web-app/src/containers/Tutorial/LevelPage/Step.tsx b/web-app/src/containers/Tutorial/Level/Step.tsx similarity index 100% rename from web-app/src/containers/Tutorial/LevelPage/Step.tsx rename to web-app/src/containers/Tutorial/Level/Step.tsx diff --git a/web-app/src/containers/Tutorial/LevelPage/Level.tsx b/web-app/src/containers/Tutorial/Level/index.tsx similarity index 98% rename from web-app/src/containers/Tutorial/LevelPage/Level.tsx rename to web-app/src/containers/Tutorial/Level/index.tsx index bf782377..f076ee9e 100644 --- a/web-app/src/containers/Tutorial/LevelPage/Level.tsx +++ b/web-app/src/containers/Tutorial/Level/index.tsx @@ -91,6 +91,8 @@ const Level = ({ level, onContinue, onLoadSolution, processes, testStatus }: Pro currentStep = level.steps.length } + console.log(`currentStep: ${currentStep}`) + const pageBottomRef = React.useRef(null) const scrollToBottom = () => { diff --git a/web-app/src/containers/Tutorial/LevelPage/index.tsx b/web-app/src/containers/Tutorial/index.tsx similarity index 89% rename from web-app/src/containers/Tutorial/LevelPage/index.tsx rename to web-app/src/containers/Tutorial/index.tsx index 6881d880..98b6d46d 100644 --- a/web-app/src/containers/Tutorial/LevelPage/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import * as T from 'typings' import * as TT from 'typings/tutorial' -import * as selectors from '../../../services/selectors' +import * as selectors from '../../services/selectors' import Level from './Level' interface PageProps { @@ -9,13 +9,14 @@ interface PageProps { send(action: T.Action): void } -const LevelSummaryPageContainer = (props: PageProps) => { +const TutorialPage = (props: PageProps) => { const { position, progress, processes, testStatus } = props.context const tutorial = selectors.currentTutorial(props.context) const levelData: TT.Level = selectors.currentLevel(props.context) const onContinue = (): void => { + console.log('onContinue triggered') props.send({ type: 'LEVEL_NEXT', payload: { @@ -59,4 +60,4 @@ const LevelSummaryPageContainer = (props: PageProps) => { ) } -export default LevelSummaryPageContainer +export default TutorialPage diff --git a/web-app/stories/Completed.stories.tsx b/web-app/stories/Completed.stories.tsx index e8bd0c75..6172717a 100644 --- a/web-app/stories/Completed.stories.tsx +++ b/web-app/stories/Completed.stories.tsx @@ -1,7 +1,7 @@ import { action } from '@storybook/addon-actions' import { storiesOf } from '@storybook/react' import React from 'react' -import CompletedPage from '../src/containers/Tutorial/CompletedPage' +import CompletedPage from '../src/containers/Tutorial/Completed' import SideBarDecorator from './utils/SideBarDecorator' storiesOf('Completed', module) diff --git a/web-app/stories/Level.stories.tsx b/web-app/stories/Level.stories.tsx index 12d39dbb..7c838c7b 100644 --- a/web-app/stories/Level.stories.tsx +++ b/web-app/stories/Level.stories.tsx @@ -4,7 +4,7 @@ import { storiesOf } from '@storybook/react' import React from 'react' import * as T from '../../typings' import * as TT from '../../typings/tutorial' -import Level from '../src/containers/Tutorial/LevelPage/Level' +import Level from '../src/containers/Tutorial/Level' import SideBarDecorator from './utils/SideBarDecorator' type ModifiedLevel = TT.Level & { diff --git a/web-app/stories/Step.stories.tsx b/web-app/stories/Step.stories.tsx index d6abc5e2..d2f5eb43 100644 --- a/web-app/stories/Step.stories.tsx +++ b/web-app/stories/Step.stories.tsx @@ -2,7 +2,7 @@ import { action } from '@storybook/addon-actions' import { select, text, withKnobs } from '@storybook/addon-knobs' import { storiesOf } from '@storybook/react' import React from 'react' -import Step from '../src/containers/Tutorial/LevelPage/Step' +import Step from '../src/containers/Tutorial/Level/Step' import SideBarDecorator from './utils/SideBarDecorator' const stepText = From 64409c9e99a7b70e1c22acb6dbcd37e2fb1aa980 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 11:32:23 -0700 Subject: [PATCH 4/9] fix log due to env being prod Signed-off-by: shmck --- src/environment.ts | 3 +-- web-app/src/environment.ts | 3 +-- web-app/src/services/logger/index.ts | 9 ++++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/environment.ts b/src/environment.ts index ec7d9b1c..a7355273 100644 --- a/src/environment.ts +++ b/src/environment.ts @@ -14,8 +14,7 @@ export type Env = 'test' | 'local' | 'development' | 'production' export const NODE_ENV: Env = process.env.NODE_ENV || 'production' // toggle logging in development -export const LOG: boolean = - (process.env.REACT_APP_LOG || '').toLowerCase() === 'true' && process.env.NODE_ENV !== 'production' +export const LOG: boolean = (process.env.REACT_APP_LOG || '').toLowerCase() === 'true' // error logging tool export const SENTRY_DSN: string | null = process.env.SENTRY_DSN || null diff --git a/web-app/src/environment.ts b/web-app/src/environment.ts index e5e18633..d997cb9c 100644 --- a/web-app/src/environment.ts +++ b/web-app/src/environment.ts @@ -9,7 +9,6 @@ for (const required of requiredKeys) { export const DEBUG: boolean = (process.env.REACT_APP_DEBUG || '').toLowerCase() === 'true' export const VERSION: string = process.env.VERSION || 'unknown' export const NODE_ENV: string = process.env.NODE_ENV || 'development' -export const LOG: boolean = - (process.env.REACT_APP_LOG || '').toLowerCase() === 'true' && process.env.NODE_ENV !== 'production' +export const LOG: boolean = (process.env.REACT_APP_LOG || '').toLowerCase() === 'true' export const TUTORIAL_LIST_URL: string = process.env.REACT_APP_TUTORIAL_LIST_URL || '' export const SENTRY_DSN: string | null = process.env.REACT_APP_SENTRY_DSN || null diff --git a/web-app/src/services/logger/index.ts b/web-app/src/services/logger/index.ts index 9b2945e8..3ea3f8ee 100644 --- a/web-app/src/services/logger/index.ts +++ b/web-app/src/services/logger/index.ts @@ -1,4 +1,4 @@ -import { LOG } from '../../environment' +import { LOG, VERSION, NODE_ENV } from '../../environment' export type Log = string | object @@ -17,4 +17,11 @@ const logger = (...messages: Log[]): void => { } } +logger(` +ENV +--- +VERSION: ${VERSION} +NODE_ENV: ${NODE_ENV} +`) + export default logger From b8ff86b14299ab4e637f7aba3e1c05850720b68d Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 11:43:10 -0700 Subject: [PATCH 5/9] cleanup routes Signed-off-by: shmck --- typings/index.d.ts | 4 ++-- web-app/src/Routes.tsx | 5 +---- web-app/src/containers/Tutorial/index.tsx | 1 - web-app/src/services/state/machine.ts | 8 ++++---- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/typings/index.d.ts b/typings/index.d.ts index 8d07d8a5..78c3d501 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -65,11 +65,11 @@ export interface MachineStateSchema { Setup: { states: { Startup: {} - Start: {} ValidateSetup: {} + Start: {} SelectTutorial: {} SetupNewTutorial: {} - StartNewTutorial: {} + StartTutorial: {} } } Tutorial: { diff --git a/web-app/src/Routes.tsx b/web-app/src/Routes.tsx index 6d89cd6d..5f54658c 100644 --- a/web-app/src/Routes.tsx +++ b/web-app/src/Routes.tsx @@ -30,13 +30,10 @@ const Routes = () => { - - - - + {/* Tutorial */} diff --git a/web-app/src/containers/Tutorial/index.tsx b/web-app/src/containers/Tutorial/index.tsx index 98b6d46d..0e2094e8 100644 --- a/web-app/src/containers/Tutorial/index.tsx +++ b/web-app/src/containers/Tutorial/index.tsx @@ -16,7 +16,6 @@ const TutorialPage = (props: PageProps) => { const levelData: TT.Level = selectors.currentLevel(props.context) const onContinue = (): void => { - console.log('onContinue triggered') props.send({ type: 'LEVEL_NEXT', payload: { diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index 643a0aba..89f677f6 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -81,7 +81,7 @@ export const createMachine = (options: any) => { on: { NEW_TUTORIAL: 'ValidateSetup', CONTINUE_TUTORIAL: { - target: '#tutorial-level', + target: 'StartTutorial', actions: ['continueConfig'], }, CONTINUE_FAILED: { @@ -107,11 +107,11 @@ export const createMachine = (options: any) => { actions: ['setError'], }, TRY_AGAIN: 'SetupNewTutorial', - TUTORIAL_CONFIGURED: 'StartNewTutorial', + TUTORIAL_CONFIGURED: 'StartTutorial', }, }, - StartNewTutorial: { - onEntry: ['startNewTutorial'], + StartTutorial: { + onEntry: ['StartTutorial'], after: { 0: '#tutorial', }, From 738fb7a9790df0beccdd228d4ca3d21d74772a1f Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 20:44:32 -0700 Subject: [PATCH 6/9] continue progress Signed-off-by: shmck --- src/channel/index.ts | 4 ++-- src/editor/commands.ts | 8 ++++---- src/services/testRunner/index.ts | 2 +- web-app/src/services/logger/index.ts | 2 +- web-app/src/services/state/actions/context.ts | 2 +- web-app/src/services/state/actions/editor.ts | 10 ++++++++-- web-app/src/services/state/machine.ts | 2 +- 7 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/channel/index.ts b/src/channel/index.ts index 8261ebc4..bf835f7b 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -223,7 +223,7 @@ class Channel implements Channel { alreadyConfigured: true, }) // update the current stepId on startup - vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload) + vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload.stepId) return } catch (e) { const error = { @@ -292,7 +292,7 @@ class Channel implements Channel { case 'SOLUTION_ACTIONS': await solutionActions({ actions: action.payload, send: this.send }) // run test following solution to update position - vscode.commands.executeCommand(COMMANDS.RUN_TEST, action.payload) + vscode.commands.executeCommand(COMMANDS.RUN_TEST, action.payload.stepId) return default: diff --git a/src/editor/commands.ts b/src/editor/commands.ts index 50f57ee7..83bf2dff 100644 --- a/src/editor/commands.ts +++ b/src/editor/commands.ts @@ -20,7 +20,7 @@ interface CreateCommandProps { export const createCommands = ({ extensionPath, workspaceState }: CreateCommandProps) => { // React panel webview let webview: any - let currentStepId = '' + let currentStepId: string | null = '' let testRunner: any return { @@ -73,13 +73,13 @@ export const createCommands = ({ extensionPath, workspaceState }: CreateCommandP }, }) }, - [COMMANDS.SET_CURRENT_STEP]: ({ stepId }: Payload) => { + [COMMANDS.SET_CURRENT_STEP]: (stepId: string | null) => { // set from last setup stepAction currentStepId = stepId }, - [COMMANDS.RUN_TEST]: (current: Payload | undefined, onSuccess: () => void) => { + [COMMANDS.RUN_TEST]: (stepId: string | null | undefined, onSuccess: () => void) => { // use stepId from client, or last set stepId - const payload: Payload = { stepId: current && current.stepId.length ? current.stepId : currentStepId } + const payload: Payload = { stepId: stepId ?? null } testRunner(payload, onSuccess) }, } diff --git a/src/services/testRunner/index.ts b/src/services/testRunner/index.ts index 16c097c8..c9c12cf2 100644 --- a/src/services/testRunner/index.ts +++ b/src/services/testRunner/index.ts @@ -8,7 +8,7 @@ import { clearOutput, displayOutput } from './output' import { formatFailOutput } from './formatOutput' export interface Payload { - stepId: string + stepId: string | null } interface Callbacks { diff --git a/web-app/src/services/logger/index.ts b/web-app/src/services/logger/index.ts index 3ea3f8ee..b9975c5f 100644 --- a/web-app/src/services/logger/index.ts +++ b/web-app/src/services/logger/index.ts @@ -1,6 +1,6 @@ import { LOG, VERSION, NODE_ENV } from '../../environment' -export type Log = string | object +export type Log = string | object | null const logger = (...messages: Log[]): void => { if (!LOG) { diff --git a/web-app/src/services/state/actions/context.ts b/web-app/src/services/state/actions/context.ts index 8dd3f083..fb7b5349 100644 --- a/web-app/src/services/state/actions/context.ts +++ b/web-app/src/services/state/actions/context.ts @@ -230,7 +230,7 @@ const contextActions: ActionFunctionMap = { error: (): any => null, }), // @ts-ignore - checkEmptySteps: send((context: T.MachineContext) => { + checkLevelCompleted: send((context: T.MachineContext) => { // no step id indicates no steps to complete return { type: context.position.stepId === null ? 'START_COMPLETED_LEVEL' : 'START_LEVEL', diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index e8352bd5..badf883b 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -1,6 +1,7 @@ import * as CR from 'typings' import * as TT from 'typings/tutorial' import * as selectors from '../../selectors' +import logger from 'services/logger' export default (editorSend: any) => ({ startup(): void { @@ -28,23 +29,28 @@ export default (editorSend: any) => ({ }, loadLevel(context: CR.MachineContext): void { const level: TT.Level = selectors.currentLevel(context) + logger('loadStep', level) if (level.setup) { // load step actions editorSend({ type: 'SETUP_ACTIONS', - payload: level.setup, + payload: { + actions: level.setup, + stepId: level.steps.length ? level.steps[0].id : null, + }, }) } }, loadStep(context: CR.MachineContext): void { const step: TT.Step | null = selectors.currentStep(context) + logger('loadStep', step) if (step && step.setup) { // load step actions editorSend({ type: 'SETUP_ACTIONS', payload: { + actions: step.setup, stepId: step.id, - ...step.setup, }, }) } diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index 89f677f6..339af4a3 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -157,7 +157,7 @@ export const createMachine = (options: any) => { initial: 'Load', states: { Load: { - onEntry: ['loadLevel', 'loadStep', 'checkEmptySteps'], + onEntry: ['loadLevel', 'checkLevelCompleted'], on: { START_LEVEL: 'Normal', START_COMPLETED_LEVEL: 'LevelComplete', From a23f9978f3c83d4c61700722607fbcf818da5d62 Mon Sep 17 00:00:00 2001 From: shmck Date: Sun, 12 Apr 2020 21:45:21 -0700 Subject: [PATCH 7/9] cleanup Signed-off-by: shmck --- src/channel/index.ts | 9 ++++----- src/services/logger/index.ts | 2 +- web-app/src/containers/Tutorial/Level/index.tsx | 2 -- web-app/src/services/state/actions/context.ts | 3 +++ web-app/src/services/state/machine.ts | 5 ++++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/channel/index.ts b/src/channel/index.ts index bf835f7b..887e4b2a 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -91,8 +91,6 @@ class Channel implements Channel { } // communicate to client the tutorial & stepProgress state this.send({ type: 'LOAD_STORED_TUTORIAL', payload: { env, tutorial, progress, position } }) - - return } catch (e) { const error = { type: 'UnknownError', @@ -100,6 +98,7 @@ class Channel implements Channel { } this.send({ type: 'EDITOR_STARTUP_FAILED', payload: { error } }) } + return // clear tutorial local storage case 'TUTORIAL_CLEAR': @@ -203,7 +202,6 @@ class Channel implements Channel { // report back to the webview that setup is complete this.send({ type: 'TUTORIAL_CONFIGURED' }) - return } catch (e) { const error = { type: 'UnknownError', @@ -211,6 +209,7 @@ class Channel implements Channel { } this.send({ type: 'TUTORIAL_CONFIGURE_FAIL', payload: { error } }) } + return case 'EDITOR_TUTORIAL_CONTINUE_CONFIG': try { const tutorialContinue: TT.Tutorial | null = this.context.tutorial.get() @@ -224,7 +223,6 @@ class Channel implements Channel { }) // update the current stepId on startup vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload.stepId) - return } catch (e) { const error = { type: 'UnknownError', @@ -232,6 +230,7 @@ class Channel implements Channel { } this.send({ type: 'CONTINUE_FAILED', payload: { error } }) } + return case 'EDITOR_VALIDATE_SETUP': try { // check workspace is selected @@ -272,7 +271,6 @@ class Channel implements Channel { return } this.send({ type: 'SETUP_VALIDATED' }) - return } catch (e) { const error = { type: 'UknownError', @@ -280,6 +278,7 @@ class Channel implements Channel { } this.send({ type: 'VALIDATE_SETUP_FAILED', payload: { error } }) } + return case 'EDITOR_REQUEST_WORKSPACE': openWorkspace() return diff --git a/src/services/logger/index.ts b/src/services/logger/index.ts index 9b2945e8..ea79bcdf 100644 --- a/src/services/logger/index.ts +++ b/src/services/logger/index.ts @@ -1,6 +1,6 @@ import { LOG } from '../../environment' -export type Log = string | object +export type Log = string | object | null const logger = (...messages: Log[]): void => { if (!LOG) { diff --git a/web-app/src/containers/Tutorial/Level/index.tsx b/web-app/src/containers/Tutorial/Level/index.tsx index f076ee9e..bf782377 100644 --- a/web-app/src/containers/Tutorial/Level/index.tsx +++ b/web-app/src/containers/Tutorial/Level/index.tsx @@ -91,8 +91,6 @@ const Level = ({ level, onContinue, onLoadSolution, processes, testStatus }: Pro currentStep = level.steps.length } - console.log(`currentStep: ${currentStep}`) - const pageBottomRef = React.useRef(null) const scrollToBottom = () => { diff --git a/web-app/src/services/state/actions/context.ts b/web-app/src/services/state/actions/context.ts index fb7b5349..597fa585 100644 --- a/web-app/src/services/state/actions/context.ts +++ b/web-app/src/services/state/actions/context.ts @@ -3,6 +3,7 @@ import * as TT from 'typings/tutorial' import { assign, send, ActionFunctionMap } from 'xstate' import * as selectors from '../../selectors' import onError from '../../../services/sentry/onError' +import logger from 'services/logger' const contextActions: ActionFunctionMap = { // @ts-ignore @@ -100,6 +101,8 @@ const contextActions: ActionFunctionMap = { progress.levels[levelId] = true + logger('PROGRESS', progress) + return progress }, }), diff --git a/web-app/src/services/state/machine.ts b/web-app/src/services/state/machine.ts index 339af4a3..768227a4 100644 --- a/web-app/src/services/state/machine.ts +++ b/web-app/src/services/state/machine.ts @@ -160,7 +160,10 @@ export const createMachine = (options: any) => { onEntry: ['loadLevel', 'checkLevelCompleted'], on: { START_LEVEL: 'Normal', - START_COMPLETED_LEVEL: 'LevelComplete', + START_COMPLETED_LEVEL: { + target: 'LevelComplete', + actions: ['updateLevelProgress'], + }, }, }, Normal: { From a7f15271be73c5421ffe5f4b2bad9d33976d44e3 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 18 Apr 2020 09:49:27 -0700 Subject: [PATCH 8/9] continue progress Signed-off-by: shmck --- src/actions/setupActions.ts | 8 -------- src/channel/index.ts | 13 ++++++++----- web-app/src/services/state/actions/editor.ts | 15 +++++++++++++-- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/actions/setupActions.ts b/src/actions/setupActions.ts index 9b9a2a0a..df7e9ee3 100644 --- a/src/actions/setupActions.ts +++ b/src/actions/setupActions.ts @@ -6,12 +6,6 @@ import openFiles from './utils/openFiles' import runCommands from './utils/runCommands' import onError from '../services/sentry/onError' -async function wait(ms: number) { - return new Promise((resolve) => { - setTimeout(resolve, ms) - }) -} - interface SetupActions { actions: TT.StepActions send: (action: T.Action) => void // send messages to client @@ -35,8 +29,6 @@ export const setupActions = async ({ actions, send, path }: SetupActions): Promi // 3. start file watchers loadWatchers(watchers || []) - await wait(1000) - // 4. run command await runCommands({ commands: commands || [], send, path }).catch(onError) } diff --git a/src/channel/index.ts b/src/channel/index.ts index 887e4b2a..ad2b9006 100644 --- a/src/channel/index.ts +++ b/src/channel/index.ts @@ -284,12 +284,12 @@ class Channel implements Channel { return // load step actions (git commits, commands, open files) case 'SETUP_ACTIONS': - await vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload) - setupActions({ actions: action.payload, send: this.send }) + await vscode.commands.executeCommand(COMMANDS.SET_CURRENT_STEP, action.payload.stepId) + setupActions({ actions: action.payload.actions, send: this.send }) return // load solution step actions (git commits, commands, open files) case 'SOLUTION_ACTIONS': - await solutionActions({ actions: action.payload, send: this.send }) + await solutionActions({ actions: action.payload.actions, send: this.send }) // run test following solution to update position vscode.commands.executeCommand(COMMANDS.RUN_TEST, action.payload.stepId) return @@ -326,13 +326,16 @@ class Channel implements Channel { switch (actionType) { case 'TEST_PASS': + logger(`TEST PASS ${action.payload.stepId}`) const tutorial = this.context.tutorial.get() if (!tutorial) { throw new Error('ERROR: Tutorial not found in test run') } // update local storage stepProgress - const progress = this.context.progress.setStepComplete(tutorial, action.payload.stepId) - this.context.position.setPositionFromProgress(tutorial, progress) + if (action.payload.stepId) { + const progress = this.context.progress.setStepComplete(tutorial, action.payload.stepId) + this.context.position.setPositionFromProgress(tutorial, progress) + } saveCommit() } diff --git a/web-app/src/services/state/actions/editor.ts b/web-app/src/services/state/actions/editor.ts index badf883b..e75d7310 100644 --- a/web-app/src/services/state/actions/editor.ts +++ b/web-app/src/services/state/actions/editor.ts @@ -29,14 +29,25 @@ export default (editorSend: any) => ({ }, loadLevel(context: CR.MachineContext): void { const level: TT.Level = selectors.currentLevel(context) - logger('loadStep', level) + logger('loadLevel', level) if (level.setup) { // load step actions editorSend({ type: 'SETUP_ACTIONS', payload: { actions: level.setup, - stepId: level.steps.length ? level.steps[0].id : null, + }, + }) + } + // ensure level step is loaded before first step + const firstStep = selectors.currentStep(context) + logger('loadFirstStep', firstStep) + if (firstStep) { + editorSend({ + type: 'SETUP_ACTIONS', + payload: { + actions: firstStep.setup, + stepId: firstStep.id, }, }) } From b4af8937c224015a7b1dcaf94fa6193ebddeb490 Mon Sep 17 00:00:00 2001 From: shmck Date: Sat, 18 Apr 2020 10:01:54 -0700 Subject: [PATCH 9/9] fix broken steps Signed-off-by: shmck --- src/editor/commands.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/editor/commands.ts b/src/editor/commands.ts index 83bf2dff..f01e3929 100644 --- a/src/editor/commands.ts +++ b/src/editor/commands.ts @@ -79,7 +79,7 @@ export const createCommands = ({ extensionPath, workspaceState }: CreateCommandP }, [COMMANDS.RUN_TEST]: (stepId: string | null | undefined, onSuccess: () => void) => { // use stepId from client, or last set stepId - const payload: Payload = { stepId: stepId ?? null } + const payload: Payload = { stepId: stepId || currentStepId } testRunner(payload, onSuccess) }, }