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