aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-12-18 13:42:22 -0800
committerAdam Soltys <[email protected]>2024-12-18 13:42:40 -0800
commit5c37f87a58ef5d84a183cb042758a25a4b9cc40d (patch)
tree2b143684692dbff3b9c9a885f18aa08968635e44 /src
parentefc288bc73f5a966467a6cf08a10966caff04f57 (diff)
downloadcoinos-ui-5c37f87a58ef5d84a183cb042758a25a4b9cc40d.tar.gz
coinos-ui-5c37f87a58ef5d84a183cb042758a25a4b9cc40d.zip
printer page
Diffstat (limited to 'src')
-rw-r--r--src/components/InvoiceTypes.svelte19
-rw-r--r--src/lib/utils.ts1
-rw-r--r--src/routes/(app)/printer/+page.server.ts18
-rw-r--r--src/routes/(app)/printer/+page.svelte100
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.server.ts8
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.svelte15
6 files changed, 149 insertions, 12 deletions
diff --git a/src/components/InvoiceTypes.svelte b/src/components/InvoiceTypes.svelte
index 872dd1ed..47a29e62 100644
--- a/src/components/InvoiceTypes.svelte
+++ b/src/components/InvoiceTypes.svelte
@@ -26,6 +26,25 @@
<button
class="btn flex-nowrap"
+ class:bg-base-300={type === types.bolt12}
+ class:text-secondary={type === types.bolt12}
+ onclick={() => setType(types.bolt12)}
+ >
+ <div
+ class="bg-black rounded-full w-8 h-8 items-center justify-center flex"
+ >
+ <div class="m-auto">
+ <iconify-icon
+ icon="ph:lightning-fill"
+ class="text-yellow-300 text-2xl"
+ ></iconify-icon>
+ </div>
+ </div>
+ <div class="my-auto text-lg">Bolt 12</div>
+ </button>
+
+ <button
+ class="btn flex-nowrap"
class:bg-base-300={type === types.ecash}
class:text-secondary={type === types.ecash}
onclick={() => setType(types.ecash)}
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index 2e3fd658..b21ce176 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -366,6 +366,7 @@ export const types = {
fund: "fund",
ecash: "ecash",
reconcile: "reconcile",
+ bolt12: "bolt12",
};
export const ease = (t: number): number =>
diff --git a/src/routes/(app)/printer/+page.server.ts b/src/routes/(app)/printer/+page.server.ts
new file mode 100644
index 00000000..e9553f33
--- /dev/null
+++ b/src/routes/(app)/printer/+page.server.ts
@@ -0,0 +1,18 @@
+import { fd } from "$lib/utils";
+import { hex } from "@scure/base";
+
+export const actions = {
+ default: async ({ fetch, request }) => {
+ const body = await fd(request);
+ const res = await fetch("/api/printer", {
+ method: "POST",
+ body: JSON.stringify(body),
+ headers: {
+ "content-type": "application/json",
+ accept: "application/octet-stream",
+ },
+ });
+
+ return { data: hex.encode(new Uint8Array(await res.arrayBuffer())) };
+ },
+};
diff --git a/src/routes/(app)/printer/+page.svelte b/src/routes/(app)/printer/+page.svelte
new file mode 100644
index 00000000..c1e6ee82
--- /dev/null
+++ b/src/routes/(app)/printer/+page.svelte
@@ -0,0 +1,100 @@
+<script>
+ import { enhance } from "$app/forms";
+ import { ESPLoader, Transport } from "esptool-js";
+ import { hex } from "@scure/base";
+
+ function bs(uint8Array) {
+ let binaryString = "";
+ const chunkSize = 0x8000; // 32,768 bytes (safe limit)
+
+ for (let i = 0; i < uint8Array.length; i += chunkSize) {
+ const chunk = uint8Array.subarray(i, i + chunkSize);
+ binaryString += String.fromCharCode(...chunk);
+ }
+
+ return binaryString;
+ }
+
+ let { form } = $props();
+
+ const address = 0x3d0000;
+ const baudrate = 921600;
+
+ let file = $state();
+ let ssid = $state();
+ let key = $state();
+ let username = $state();
+ let password = $state();
+ let esploader = $state();
+ let data = $derived(form ? hex.decode(form.data) : undefined);
+
+ let chip, transport;
+ // let data = $state();
+ let connect = async () => {
+ try {
+ let device = await navigator.serial.requestPort({});
+ transport = new Transport(device, true);
+
+ esploader = new ESPLoader({
+ transport,
+ baudrate,
+ });
+
+ chip = await esploader.main();
+ } catch (e) {
+ console.log(e);
+ }
+ };
+
+ let progress = $state();
+ let flash = async () => {
+ let fileArray = [{ data: bs(data), address }];
+
+ const flashOptions = {
+ fileArray,
+ flashSize: "keep",
+ eraseAll: false,
+ compress: true,
+ reportProgress: (fileIndex, written, total) => {
+ progress = parseInt((written / total) * 100);
+ },
+ };
+
+ await esploader.writeFlash(flashOptions);
+ };
+</script>
+
+<div class="container px-4 max-w-lg mx-auto space-y-5 mt-20">
+ <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">
+ Printer
+ </h1>
+
+ {#if esploader}
+ {#if data}
+ {#if progress}
+ <div class="text-center text-2xl">Done!</div>
+ {:else}
+ <div>Generated config file (<b>{data.length * 2} bytes</b>)</div>
+ <button class="btn" onclick={flash}>Flash</button>
+ {/if}
+ {:else}
+ <form method="POST" use:enhance class="space-y-2">
+ <input name="ssid" bind:value={ssid} placeholder="wifi ssid" />
+ <input name="key" bind:value={key} placeholder="wifi pass" />
+ <input
+ name="username"
+ bind:value={username}
+ placeholder="coinos username"
+ />
+ <input
+ name="password"
+ bind:value={password}
+ placeholder="coinos password"
+ />
+ <button type="submit" class="btn">Generate Config</button>
+ </form>
+ {/if}
+ {:else}
+ <button class="btn" onclick={connect}>Connect</button>
+ {/if}
+</div>
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.server.ts b/src/routes/(app)/send/lightning/[payreq]/+page.server.ts
index d340dbe3..90844786 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.server.ts
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.server.ts
@@ -4,11 +4,13 @@ import { fail, redirect } from "@sveltejs/kit";
export async function load({ cookies, params, parent }) {
const { user } = await parent();
- if (params.payreq.startsWith("lno")) return params;
+ let data = { ...params };
const rates = await getRates();
- const data = await post("/parse", params, auth(cookies));
+ if (!params.payreq.startsWith("lno")) {
+ data = await post("/parse", params, auth(cookies));
+ }
+
data.rate = rates[user.currency];
- data.payreq = params.payreq;
return data;
}
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
index c83af8e5..a35286b2 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.svelte
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
@@ -6,18 +6,15 @@
import Numpad from "$comp/Numpad.svelte";
import Spinner from "$comp/Spinner.svelte";
import { page } from "$app/stores";
- import { back, toFiat, f, s, focus } from "$lib/utils";
+ import { loc, back, toFiat, f, s, focus } from "$lib/utils";
import { rate, pin } from "$lib/store";
let { data, form } = $props();
- let {
- alias,
- payreq,
- ourfee,
- user: { currency },
- } = $derived({ ...data, ...form });
+ let { alias, payreq, ourfee, user } = $derived({ ...data, ...form });
let a = $state();
+ let { currency } = $derived(user);
+ let locale = loc(user);
$effect(() => ($rate ||= data.rate));
$effect(() => form && (loading = false));
@@ -46,7 +43,7 @@
{$t("payments.send")}
</h1>
- <Amount {amount} rate={$rate} {currency} />
+ <Amount {amount} rate={$rate} {currency} {locale} />
</div>
<div class="text-xl">
@@ -129,7 +126,7 @@
<input type="hidden" value={a} name="amount" />
<input name="rate" value={$rate} type="hidden" />
- <Numpad bind:amount={a} {currency} bind:rate={$rate} submit={next} />
+ <Numpad bind:amount={a} {currency} {locale} bind:rate={$rate} submit={next} />
<button type="submit" class="btn" bind:this={next}
>{$t("payments.next")}</button
>