about summary refs log tree commit diff
path: root/assets
diff options
context:
space:
mode:
Diffstat (limited to 'assets')
-rw-r--r--assets/package.json1
-rw-r--r--assets/src/App.svelte14
-rw-r--r--assets/src/components/DataPicker.svelte14
-rw-r--r--assets/src/components/IncomingRequests.svelte20
-rw-r--r--assets/src/components/Share.svelte20
-rw-r--r--assets/src/entries/request.ts11
-rw-r--r--assets/src/entries/share.ts12
-rw-r--r--assets/src/globals.d.ts1
-rw-r--r--assets/src/network/socket.ts33
-rw-r--r--assets/src/stores/data.ts21
-rw-r--r--assets/src/stores/requests.ts12
-rw-r--r--assets/yarn.lock5
12 files changed, 133 insertions, 31 deletions
diff --git a/assets/package.json b/assets/package.json
index 656f02c..fc96ba7 100644
--- a/assets/package.json
+++ b/assets/package.json
@@ -12,6 +12,7 @@
     "@rollup/plugin-node-resolve": "^11.0.0",
     "@rollup/plugin-typescript": "^8.0.0",
     "@tsconfig/svelte": "^1.0.0",
+    "@types/phoenix": "^1.5.1",
     "rollup": "^2.3.4",
     "rollup-plugin-copy": "^3.4.0",
     "rollup-plugin-css-only": "^3.1.0",
diff --git a/assets/src/App.svelte b/assets/src/App.svelte
deleted file mode 100644
index 27c0c68..0000000
--- a/assets/src/App.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-<script lang="ts">
-    export let name: string;
-</script>
-
-<main>
-    <h1>Hello from {name}!</h1>
-    <h2>Your token is {window.token}.</h2>
-</main>
-
-<style>
-    h1 {
-        font-size: 4em;
-    }
-</style>
diff --git a/assets/src/components/DataPicker.svelte b/assets/src/components/DataPicker.svelte
new file mode 100644
index 0000000..433018d
--- /dev/null
+++ b/assets/src/components/DataPicker.svelte
@@ -0,0 +1,14 @@
+<script lang="ts">
+    import data from "../stores/data";
+
+    let value = "";
+
+    const submit = () => {
+        data.set(value);
+    };
+</script>
+
+<form on:submit|preventDefault={submit}>
+    <input type="text" bind:value />
+    <input type="submit" value="Submit" />
+</form>
diff --git a/assets/src/components/IncomingRequests.svelte b/assets/src/components/IncomingRequests.svelte
new file mode 100644
index 0000000..1db50af
--- /dev/null
+++ b/assets/src/components/IncomingRequests.svelte
@@ -0,0 +1,20 @@
+<script lang="ts">
+    import { getToken, joinShareChannel } from "../network/socket";
+    import requests from "../stores/requests";
+
+    const startConnection = async () => {
+        const token = await getToken();
+        joinShareChannel(token);
+        return token;
+    };
+</script>
+
+{#await startConnection()}
+    <h3>Fetching token...</h3>
+{:then token}
+    <h3>Your token is <b>{token}</b>.</h3>
+
+    {#each $requests as request}
+        <p>{JSON.stringify(request)}</p>
+    {/each}
+{/await}
diff --git a/assets/src/components/Share.svelte b/assets/src/components/Share.svelte
new file mode 100644
index 0000000..5ea55b2
--- /dev/null
+++ b/assets/src/components/Share.svelte
@@ -0,0 +1,20 @@
+<script lang="ts">
+    import data from "../stores/data";
+    import DataPicker from "./DataPicker.svelte";
+    import IncomingRequests from "./IncomingRequests.svelte";
+</script>
+
+<main>
+    <h1>Sharing</h1>
+    {#if !$data.locked}
+        <DataPicker />
+    {:else}
+        <IncomingRequests />
+    {/if}
+</main>
+
+<style>
+    h1 {
+        font-size: 4em;
+    }
+</style>
diff --git a/assets/src/entries/request.ts b/assets/src/entries/request.ts
index 2461768..0d064a2 100644
--- a/assets/src/entries/request.ts
+++ b/assets/src/entries/request.ts
@@ -1,10 +1,3 @@
-import App from '../App.svelte';
+// Request
 
-const app = new App({
-	target: document.getElementById("app"),
-	props: {
-		name: 'request'
-	}
-});
-
-export default app;
\ No newline at end of file
+export {};
diff --git a/assets/src/entries/share.ts b/assets/src/entries/share.ts
index 7527a53..d0279f1 100644
--- a/assets/src/entries/share.ts
+++ b/assets/src/entries/share.ts
@@ -1,10 +1,8 @@
-import App from '../App.svelte';
+import Share from "../components/Share.svelte";
 
-const app = new App({
-	target: document.getElementById("app"),
-	props: {
-		name: 'share'
-	}
+const app = new Share({
+    target: document.getElementById("app"),
+    props: {},
 });
 
-export default app;
\ No newline at end of file
+export default app;
diff --git a/assets/src/globals.d.ts b/assets/src/globals.d.ts
deleted file mode 100644
index 996ffe5..0000000
--- a/assets/src/globals.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare var token: string;
\ No newline at end of file
diff --git a/assets/src/network/socket.ts b/assets/src/network/socket.ts
new file mode 100644
index 0000000..c056b41
--- /dev/null
+++ b/assets/src/network/socket.ts
@@ -0,0 +1,33 @@
+import { Socket } from "phoenix";
+import requests from "../stores/requests";
+
+let socket = new Socket("/socket", {});
+socket.connect();
+
+export const getToken: () => Promise<string> = () => {
+    let tokenChannel = socket.channel("token", {});
+    return new Promise((resolve, reject) => {
+        tokenChannel
+            .join()
+            .receive("ok", () => {
+                tokenChannel
+                    .push("get_token", {}, 5000)
+                    .receive("ok", ({ token }) => resolve(token))
+                    .receive("error", err => reject(err))
+                    .receive("timeout", err => reject(err));
+            })
+            .receive("error", err => reject(err));
+    });
+};
+
+export const joinShareChannel = token => {
+    let shareChannel = socket.channel(`share:${token}`);
+
+    shareChannel.on("request", requests.addRequest);
+
+    shareChannel
+        .join()
+        .receive("error", err =>
+            console.log("failed joining share channel:" + err)
+        );
+};
diff --git a/assets/src/stores/data.ts b/assets/src/stores/data.ts
new file mode 100644
index 0000000..d59183c
--- /dev/null
+++ b/assets/src/stores/data.ts
@@ -0,0 +1,21 @@
+import { writable } from "svelte/store";
+
+const createDataStore = () => {
+    const { subscribe, update } = writable({ locked: false, data: null });
+
+    return {
+        subscribe,
+        set: data => {
+            update(state => {
+                if (!state.locked) {
+                    return { locked: true, data };
+                } else {
+                    console.error("Tried setting data after locking.");
+                    return state;
+                }
+            });
+        },
+    };
+};
+
+export default createDataStore();
diff --git a/assets/src/stores/requests.ts b/assets/src/stores/requests.ts
new file mode 100644
index 0000000..e80eb2b
--- /dev/null
+++ b/assets/src/stores/requests.ts
@@ -0,0 +1,12 @@
+import { writable } from "svelte/store";
+
+const createRequestStore = () => {
+    const { subscribe, update } = writable([]);
+
+    return {
+        subscribe,
+        addRequest: request => update(state => [request, ...state]),
+    };
+};
+
+export default createRequestStore();
diff --git a/assets/yarn.lock b/assets/yarn.lock
index e373b5e..9e66b6b 100644
--- a/assets/yarn.lock
+++ b/assets/yarn.lock
@@ -134,6 +134,11 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67"
   integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==
 
+"@types/phoenix@^1.5.1":
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/@types/phoenix/-/phoenix-1.5.1.tgz#1cee8eda69ca5b2eff48f0fe1833d9716a17fec2"
+  integrity sha512-VPVQAOffPXztCAoLKTjSM+NqhD1gWow3XHF01gdLPeIWEQakoFjg5uGokq8BnX7KM00PWN1XnX5d4FMSxlVv3w==
+
 "@types/pug@^2.0.4":
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/@types/pug/-/pug-2.0.4.tgz#8772fcd0418e3cd2cc171555d73007415051f4b2"