From c40ae709ddc8e6dacfb5827fbdb0fe5dca65369c Mon Sep 17 00:00:00 2001
From: Jonas Zohren <jonas.zohren@adesso.de>
Date: Mon, 5 Apr 2021 17:47:28 +0200
Subject: [PATCH] WIP: Saving game State

---
 src/App.svelte                    |  5 ++--
 src/SavingComponent.svelte        | 50 +++++++++++++++----------------
 src/gameStateServerSyncService.ts | 23 ++++++++++++++
 src/utils.ts                      |  2 +-
 4 files changed, 51 insertions(+), 29 deletions(-)
 create mode 100644 src/gameStateServerSyncService.ts

diff --git a/src/App.svelte b/src/App.svelte
index f326889..6679a46 100644
--- a/src/App.svelte
+++ b/src/App.svelte
@@ -4,6 +4,7 @@
   import Debugger from "./Debugger.svelte";
   import type { Dialog } from "./types";
   import SavingComponent from "./SavingComponent.svelte";
+  import { hasContext } from "svelte";
 
   const gameStateServerBaseUrl = "http://localhost:4000/";
 
@@ -13,11 +14,11 @@
 
 <main>
   {#await dialogSetPromise then dialogSet}
+    <SavingComponent {gameStateServerBaseUrl} />
+    <br />
     <DialogSetComponent bind:currentDialog {...dialogSet} />
-
     <br />
     <Debugger {dialogSet} bind:currentDialog />
-    <SavingComponent {gameStateServerBaseUrl} />
   {:catch _error}
     <h3>Oh no :(</h3>
     <p>
diff --git a/src/SavingComponent.svelte b/src/SavingComponent.svelte
index 0af4a6d..fc144b8 100644
--- a/src/SavingComponent.svelte
+++ b/src/SavingComponent.svelte
@@ -1,42 +1,40 @@
 <script lang="ts">
   import { identity } from "svelte/internal";
   import { gameFactsStore } from "./gameFacts";
+  import { finishedSyncSetup, gameStateId } from "./gameStateServerSyncService";
 
   import { GameStateServerClient } from "./gameStateServerClient";
   import type { GameState } from "./types";
 
   export let gameStateServerBaseUrl: string;
   $: gameStateServerClient = new GameStateServerClient(gameStateServerBaseUrl);
-  let pretixOrderCode: string = "XXXYYY";
 
-  async function handleSaveGameState(): Promise<void> {
-    const gameState: GameState = {
-      gameFacts: $gameFactsStore,
-    };
-    gameStateServerClient.saveState(pretixOrderCode, gameState);
-  }
-
-  async function handleLoadGameState(): Promise<void> {
-    const newGameState = await gameStateServerClient.loadState(pretixOrderCode);
-    $gameFactsStore = newGameState.gameFacts;
+  async function handleSyncState(): Promise<void> {
+    $finishedSyncSetup = true;
   }
 </script>
 
-<div>
-  <input
-    type="text"
-    placeholder="Your Pretix order code"
-    maxlength="5"
-    minlength="5"
-    bind:value={pretixOrderCode}
-  />
-  <button style="width: 10rem;" on:click|preventDefault={handleSaveGameState}>
-    💾 Save game
-  </button>
-  <button style="width: 10rem;" on:click|preventDefault={handleLoadGameState}>
-    ▶️ Load game
-  </button>
-</div>
+{#if !$finishedSyncSetup}
+  <div>
+    <p>
+      Dein Spielstand wird aktuell noch nicht synchronisiert, d.h. wenn du den
+      Browser schließt, kann es sein, dass du von vorne anfängst. Zum Speichern
+      gib bitte deinen "Order Code" ein. Deinen Order Code findest du in den
+      E-Mails, die wir dir zur O-Phase gesendet haben.
+    </p>
+    <br />
+    <input
+      type="text"
+      placeholder="Bsp: A1B2C3"
+      maxlength="5"
+      minlength="5"
+      bind:value={$gameStateId}
+    />
+    <button style="width: 20rem;" on:click|preventDefault={handleSyncState}>
+      Spielstand synchronisieren
+    </button>
+  </div>
+{/if}
 
 <style>
   div {
diff --git a/src/gameStateServerSyncService.ts b/src/gameStateServerSyncService.ts
new file mode 100644
index 0000000..66940c3
--- /dev/null
+++ b/src/gameStateServerSyncService.ts
@@ -0,0 +1,23 @@
+import { gameFactsStore } from "./gameFacts";
+import { GameStateServerClient } from "./gameStateServerClient";
+import type { GameState } from "./types";
+
+import { writable } from "svelte/store";
+import type { Writable } from "svelte/store";
+export const finishedSyncSetup: Writable<boolean> = writable(false);
+export const gameStateId: Writable<string> = writable("");
+
+export class SyncService {
+  _client: GameStateServerClient;
+  _id: string;
+  constructor(stateServerBaseUrl: string, id: string) {
+    this._id = id;
+    this._client = new GameStateServerClient(stateServerBaseUrl);
+    gameFactsStore.subscribe(async (gameFacts: string[]) => {
+      const newGameState: GameState = {
+        gameFacts: gameFacts,
+      };
+      await this._client.saveState(this._id, newGameState);
+    });
+  }
+}
diff --git a/src/utils.ts b/src/utils.ts
index 1e9395b..67e6067 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -18,7 +18,7 @@ function isValidDialogSetName(input: unknown) {
   return !/[^a-zA-Z0-9\-\_]/i.test(input);
 }
 
-function getParamValue(paramName: string): string | null {
+export function getParamValue(paramName: string): string | null {
   return new URLSearchParams(window.location.search).get(paramName);
 }
 
-- 
GitLab