From f2d3efb08e3242e2e43f57971ca4a2953dfb6485 Mon Sep 17 00:00:00 2001
From: jsteuer <jan.steuer.htw@gmail.com>
Date: Mon, 12 Aug 2019 12:40:29 +0200
Subject: [PATCH] add localstoraged based api for development

---
 src/index.ts |   72 ++++++++++++++++++++++++++++++++++++
 package.json |    3 +
 2 files changed, 74 insertions(+), 1 deletions(-)

diff --git a/package.json b/package.json
index b90adbd..acc5edb 100644
--- a/package.json
+++ b/package.json
@@ -3,6 +3,7 @@
   "version": "1.1.0",
   "description": "API zur MathCoach IDE",
   "types": "mathcoach-api.d.ts",
+  "main": "./src/index.ts",
   "directories": {
     "example": "examples"
   },
@@ -17,4 +18,4 @@
   },
   "author": "jsteuer",
   "license": ""
-}
+}
\ No newline at end of file
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..0513988
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,72 @@
+/// <reference path="../mathcoach-api.d.ts"/>
+
+namespace MathCoach {
+
+    export namespace Ide {
+        /**
+         * Offline MathCoach-API falls notwendig bereitstellen. Dabei wird das Dateisystem durch den
+         * LocalStorage des Browsers implementiert - einige Features der IDE (beispielsweise 
+         * der Navigator) sind nicht verfügbar und führen keine Aktionen durch. 
+         * 
+         * **Hinweis**: Wenn die echte MathCoach-API der IDE verfügbar ist, hat der Aufruf 
+         * dieser Funktion keinen Seiteneffekt.
+         * 
+         * @param contextFileExtension Datei-Erweiterung der Kontext-Datei
+         * 
+         */
+        export function enableOfflineUsageIfNecessary(contextFileExtension: string = "dummy.json"): boolean {
+
+            const fileIdentifier = (file: MathCoach.File) => `mock-file://${file.owner}@${file.part}/${file.path}`;
+            const traceMethod = (method: string, args?: any[]) => console.log(["[MC MOCK API]", " ", method, "(", (args ? args : [""]).join(","), ")"].join(""));
+
+            class MockAPI implements MathCoach.Api {
+
+                public ide: MathCoach.IdeApi = {
+                    async getContextFile(): Promise<MathCoach.File> {
+                        traceMethod("MC.ide.getContextFile");
+                        return {
+                            owner: "jdoe",
+                            path: `/file.${contextFileExtension}`,
+                            part: "vfs"
+                        }
+                    },
+                    async getUserName(): Promise<string> {
+                        traceMethod("MC.ide.getUserName");
+                        return "jdoe"
+                    },
+                    fs: {
+                        async readFile(file: MathCoach.File) {
+                            traceMethod("MC.ide.fs.readFile", [JSON.stringify(file)]);
+                            return localStorage.getItem(fileIdentifier(file)) || "";
+                        },
+                        async writeFile(file: MathCoach.File, text: string) {
+                            traceMethod("MC.ide.fs.writeFile", [JSON.stringify(file), JSON.stringify(`...${text.length} chars...`)]);
+                            return localStorage.setItem(fileIdentifier(file), text);
+                        }
+                    },
+                    navigator: {
+                        async navigateTo(link: string, forceOpen?: boolean) {
+                            traceMethod("MC.ide.navigator.navigateTo", [JSON.stringify(link), JSON.stringify(forceOpen ? true : false)]);
+                        },
+                        async navigateToExercise(file: MathCoach.File, forceOpen?: boolean) {
+                            traceMethod("MC.ide.navigator.navigateToExercise", [JSON.stringify(file), JSON.stringify(forceOpen ? true : false)]);
+                        }
+                    }
+                };
+                public async isReady(): Promise<boolean> {
+                    traceMethod("MC.isReady()");
+                    return true;
+                }
+            }
+            if (typeof MC === "undefined") {
+                console.warn("you are offline - offline api is used");
+                (window as any).MC = new MockAPI(); // fake the MathCoach-API
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+    }
+
+}

--
Gitblit v1.10.0-SNAPSHOT