diff options
| author | Adam Soltys <[email protected]> | 2024-12-18 13:42:22 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2024-12-18 13:42:40 -0800 |
| commit | 5c37f87a58ef5d84a183cb042758a25a4b9cc40d (patch) | |
| tree | 2b143684692dbff3b9c9a885f18aa08968635e44 /src | |
| parent | efc288bc73f5a966467a6cf08a10966caff04f57 (diff) | |
| download | coinos-ui-5c37f87a58ef5d84a183cb042758a25a4b9cc40d.tar.gz coinos-ui-5c37f87a58ef5d84a183cb042758a25a4b9cc40d.zip | |
printer page
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/InvoiceTypes.svelte | 19 | ||||
| -rw-r--r-- | src/lib/utils.ts | 1 | ||||
| -rw-r--r-- | src/routes/(app)/printer/+page.server.ts | 18 | ||||
| -rw-r--r-- | src/routes/(app)/printer/+page.svelte | 100 | ||||
| -rw-r--r-- | src/routes/(app)/send/lightning/[payreq]/+page.server.ts | 8 | ||||
| -rw-r--r-- | src/routes/(app)/send/lightning/[payreq]/+page.svelte | 15 |
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 > |
