From a4d0c9c003cac9db35923fa50b15437553e6e88b Mon Sep 17 00:00:00 2001
From: shmck <shawn.j.mckay@gmail.com>
Date: Wed, 19 Aug 2020 21:25:31 -0700
Subject: [PATCH] move error messages to client

Signed-off-by: shmck <shawn.j.mckay@gmail.com>
---
 errors/FailedToConnectToGitRepo.md            |  7 -----
 errors/GitNotFound.md                         |  3 ---
 errors/GitProjectAlreadyExists.md             |  5 ----
 errors/GitRemoteAlreadyExists.md              |  5 ----
 errors/MissingTutorialDependency.md           |  3 ---
 errors/NoWorkspaceFound.md                    |  3 ---
 errors/UnknownError.md                        |  5 ----
 errors/UnmetExtensionVersion.md               |  3 ---
 errors/UnmetTutorialDependency.md             |  3 ---
 errors/WorkspaceNotEmpty.md                   |  5 ----
 src/actions/index.ts                          |  1 -
 src/actions/onErrorPage.ts                    | 26 -------------------
 src/commands.ts                               |  3 ---
 web-app/src/services/errors/en.json           | 12 +++++++++
 web-app/src/services/state/actions/context.ts | 21 +++++++++++++--
 15 files changed, 31 insertions(+), 74 deletions(-)
 delete mode 100644 errors/FailedToConnectToGitRepo.md
 delete mode 100644 errors/GitNotFound.md
 delete mode 100644 errors/GitProjectAlreadyExists.md
 delete mode 100644 errors/GitRemoteAlreadyExists.md
 delete mode 100644 errors/MissingTutorialDependency.md
 delete mode 100644 errors/NoWorkspaceFound.md
 delete mode 100644 errors/UnknownError.md
 delete mode 100644 errors/UnmetExtensionVersion.md
 delete mode 100644 errors/UnmetTutorialDependency.md
 delete mode 100644 errors/WorkspaceNotEmpty.md
 delete mode 100644 src/actions/onErrorPage.ts
 create mode 100644 web-app/src/services/errors/en.json

diff --git a/errors/FailedToConnectToGitRepo.md b/errors/FailedToConnectToGitRepo.md
deleted file mode 100644
index fef26ef2..00000000
--- a/errors/FailedToConnectToGitRepo.md
+++ /dev/null
@@ -1,7 +0,0 @@
-### Failed to Connect to Git Repo
-
-There are several possible causes:
-
-- you may not be connected to the internet or have an unstable connection.
-- you may not have access permission to the remote tutorial repo.
-- the remote tutorial repo may not exist at the provided location
diff --git a/errors/GitNotFound.md b/errors/GitNotFound.md
deleted file mode 100644
index a0b24e52..00000000
--- a/errors/GitNotFound.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Git Not Found
-
-Make sure you install Git. See the [Git docs](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) for help.
diff --git a/errors/GitProjectAlreadyExists.md b/errors/GitProjectAlreadyExists.md
deleted file mode 100644
index f06258d4..00000000
--- a/errors/GitProjectAlreadyExists.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### Git Remote Already Exists
-
-Have you started this tutorial before in this workspace? The Git remote already exists.
-
-Consider deleting your `.git` folder and restarting.
diff --git a/errors/GitRemoteAlreadyExists.md b/errors/GitRemoteAlreadyExists.md
deleted file mode 100644
index f2e31560..00000000
--- a/errors/GitRemoteAlreadyExists.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### Git Project Already Exists
-
-CodeRoad requires an empty Git project.
-
-Open a new workspace to start a tutorial.
diff --git a/errors/MissingTutorialDependency.md b/errors/MissingTutorialDependency.md
deleted file mode 100644
index 7e989371..00000000
--- a/errors/MissingTutorialDependency.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Missing Tutorial Dependency
-
-The tutorial cannot run because it a dependency is not yet installed. Install the dependency and click "Check Again".
diff --git a/errors/NoWorkspaceFound.md b/errors/NoWorkspaceFound.md
deleted file mode 100644
index 547e6bbf..00000000
--- a/errors/NoWorkspaceFound.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Open a Workspace Folder
-
-CodeRoad requires a workspace folder to run. Open a new workspace and re-launch CodeRoad.
diff --git a/errors/UnknownError.md b/errors/UnknownError.md
deleted file mode 100644
index d64fe8d4..00000000
--- a/errors/UnknownError.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### Unknown Error
-
-Sorry! An unknown error occurred.
-
-Please help out by posting an issue at github.com/coderoad/coderoad-vscode/issues/new/choose!
diff --git a/errors/UnmetExtensionVersion.md b/errors/UnmetExtensionVersion.md
deleted file mode 100644
index 688d4d42..00000000
--- a/errors/UnmetExtensionVersion.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Unmet Tutorial Dependency
-
-This tutorial requires a different version of CodeRoad.
diff --git a/errors/UnmetTutorialDependency.md b/errors/UnmetTutorialDependency.md
deleted file mode 100644
index 9803ae4d..00000000
--- a/errors/UnmetTutorialDependency.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Unmet Tutorial Dependency
-
-Tutorial cannot reun because a dependency version doesn't match. Install the correct dependency and click "Check Again".
diff --git a/errors/WorkspaceNotEmpty.md b/errors/WorkspaceNotEmpty.md
deleted file mode 100644
index f6d7f2f5..00000000
--- a/errors/WorkspaceNotEmpty.md
+++ /dev/null
@@ -1,5 +0,0 @@
-### Select An Empty VSCode Workspace
-
-Start a project in an empty folder.
-
-Once selected, the extension will close and need to be re-started.
diff --git a/src/actions/index.ts b/src/actions/index.ts
index add7a608..4b86feda 100644
--- a/src/actions/index.ts
+++ b/src/actions/index.ts
@@ -3,6 +3,5 @@ export { default as onTutorialConfigNew } from './onTutorialConfigNew'
 export { default as onTutorialConfigContinue } from './onTutorialConfigContinue'
 export { default as onValidateSetup } from './onValidateSetup'
 export { default as onRunReset } from './onRunReset'
-export { default as onErrorPage } from './onErrorPage'
 export { runTest } from './onTest'
 export { onOpenLogs } from './onOpenLogs'
diff --git a/src/actions/onErrorPage.ts b/src/actions/onErrorPage.ts
deleted file mode 100644
index 8b241f7a..00000000
--- a/src/actions/onErrorPage.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import * as T from 'typings'
-import { readFile } from '../services/node'
-import logger from '../services/logger'
-
-const onErrorPage = async (action: T.Action): Promise<void> => {
-  // Error middleware
-  if (action?.payload?.error?.type) {
-    // load error markdown message
-    const error = action.payload.error
-    const errorMarkdown = await readFile(__dirname, '..', '..', 'errors', `${action.payload.error.type}.md`).catch(
-      () => {
-        // onError(new Error(`Error Markdown file not found for ${action.type}`))
-      },
-    )
-
-    // log error to console for safe keeping
-    logger(`ERROR:\n ${errorMarkdown}`)
-
-    if (errorMarkdown) {
-      // add a clearer error message for the user
-      error.message = `${errorMarkdown}\n\n${error.message}`
-    }
-  }
-}
-
-export default onErrorPage
diff --git a/src/commands.ts b/src/commands.ts
index bffc21d8..c7f4fc4d 100644
--- a/src/commands.ts
+++ b/src/commands.ts
@@ -28,9 +28,6 @@ let sendToClient = (action: T.Action): void => {
 // This makes it easier to pass the send
 // function throughout the codebase
 export const send = (action: T.Action): void => {
-  // load error page if error action is triggered
-  actions.onErrorPage(action)
-
   logger(`EXT TO CLIENT: "${typeof action === 'string' ? action : action.type}"`)
 
   if (action) sendToClient(action)
diff --git a/web-app/src/services/errors/en.json b/web-app/src/services/errors/en.json
new file mode 100644
index 00000000..17336818
--- /dev/null
+++ b/web-app/src/services/errors/en.json
@@ -0,0 +1,12 @@
+{
+  "FailedToConnectToGitRepo": "### Failed to Connect to Git Repo\n\nThere are several possible causes:\n\n- you may not be connected to the internet or have an unstable connection.\n- you may not have access permission to the remote tutorial repo.\n- the remote tutorial repo may not exist at the provided location",
+  "GitNotFound": "### Git Not Found\n\nMake sure you have Git installed.\n\nSee the [Git docs](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) for help.",
+  "GitProjectAlreadyExists": "### Git Remote Already Exists\n\nHave you started this tutorial before in this workspace? The Git remote already exists.\n\nConsider deleting your `.git` folder and restarting.",
+  "GitRemoteAlreadyExists": "### Git Project Already Exists\n\nCodeRoad requires an empty Git project.\n\nOpen a new workspace to start a tutorial.",
+  "MissingTutorialDependency": "### Missing Tutorial Dependency\n\nThe tutorial cannot run because it a dependency is not yet installed. Install the dependency and click \"Check Again\".",
+  "NoWorkspaceFound": "### Open a Workspace Folder\n\nCodeRoad requires a workspace folder to run. Open a new workspace and re-launch CodeRoad.",
+  "UnknownError": "### Unknown Error\n\nSorry! An unknown error occurred.\n\nPlease help out by posting an issue at github.com/coderoad/coderoad-vscode/issues/new/choose!",
+  "UnmetExtensionVersion": "### Unmet Extension Version\n\nVSCode extension version is below requirements. Update VSCode to use CodeRoad.",
+  "UnmetTutorialDependency": "### Unmet Tutorial Dependency\n\nTutorial cannot run because a dependency version doesn't match. Install the correct dependency and click \"Check Again\".",
+  "WorkspaceNotEmpty": "### Select An Empty VSCode Workspace\n\nStart a project in an empty folder.\n\nOnce selected, the extension will close and need to be re-started."
+}
diff --git a/web-app/src/services/state/actions/context.ts b/web-app/src/services/state/actions/context.ts
index 99da6d3f..cbdf8f4a 100644
--- a/web-app/src/services/state/actions/context.ts
+++ b/web-app/src/services/state/actions/context.ts
@@ -1,10 +1,12 @@
 import * as T from 'typings'
 import * as TT from 'typings/tutorial'
+import * as E from 'typings/error'
 import { assign, send } from 'xstate'
 import * as selectors from '../../selectors'
 import getStepNext from './utils/stepNext'
 import getNext from './utils/getNext'
 import logger from 'services/logger'
+import errors from '../../errors/en.json'
 
 export const setStart = assign({
   env: (context: T.MachineContext, event: T.MachineEvent) => {
@@ -73,8 +75,23 @@ export const reset = assign({
 
 export const setError = assign({
   error: (context: T.MachineContext, event: T.MachineEvent): any => {
-    const message: string | null = event.payload.error
-    return message
+    const error: string | null | E.ErrorMessage = event.payload.error
+    if (error) {
+      if (typeof error === 'string') {
+        console.log(`ERROR: ${error}`)
+        return error
+      } else if (error.type) {
+        const errorMessage = errors[error.type]
+        const content = errorMessage || ''
+        const message = `${content}\n\n${error.message || ''}`
+        console.log(`ERROR: ${message}`)
+        return {
+          ...error,
+          message,
+        }
+      }
+    }
+    return null
   },
 })