diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/routes/(app)/[username]/(profile)/+layout.svelte | 2 | ||||
| -rw-r--r-- | src/routes/(app)/accepted/[text]/+page.server.ts | 4 | ||||
| -rw-r--r-- | src/routes/(app)/accepted/[text]/+page.svelte | 40 | ||||
| -rw-r--r-- | src/routes/(app)/accepted/[text]/raw/+server.ts | 16 | ||||
| -rw-r--r-- | src/routes/(app)/accepted/create/+page.svelte | 64 |
5 files changed, 125 insertions, 1 deletions
diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte index 68b87ce2..52efb22c 100644 --- a/src/routes/(app)/[username]/(profile)/+layout.svelte +++ b/src/routes/(app)/[username]/(profile)/+layout.svelte @@ -237,7 +237,7 @@ ></iconify-icon></button > <a - href={`/qr/${encodeURIComponent( + href={`/accepted/${encodeURIComponent( `lightning:${lnurl}`, )}`} class="my-auto" diff --git a/src/routes/(app)/accepted/[text]/+page.server.ts b/src/routes/(app)/accepted/[text]/+page.server.ts new file mode 100644 index 00000000..210c3c45 --- /dev/null +++ b/src/routes/(app)/accepted/[text]/+page.server.ts @@ -0,0 +1,4 @@ +export async function load({ params }) { + const { text } = params; + return { text }; +} diff --git a/src/routes/(app)/accepted/[text]/+page.svelte b/src/routes/(app)/accepted/[text]/+page.svelte new file mode 100644 index 00000000..07d05310 --- /dev/null +++ b/src/routes/(app)/accepted/[text]/+page.svelte @@ -0,0 +1,40 @@ +<script> + import Icon from "$comp/Icon.svelte"; + import Qr from "$comp/Qr.svelte"; + import { back, copy } from "$lib/utils"; + let { data } = $props(); + let { text } = $derived(data); + let { username } = $derived(data.user); + let url = `https://coinos.io/p/${username}`; +</script> + +<!-- <div class="container px-4 max-w-4xl mx-auto space-y-5"> --> +<!-- <Qr {text} /> --> +<!-- --> +<!-- <button --> +<!-- type="button" --> +<!-- class="btn break-all !h-auto flex-nowrap p-4 font-normal leading-normal" --> +<!-- onclick={() => copy(text)} --> +<!-- > --> +<!-- <iconify-icon noobserver icon="ph:copy-bold" width="32"></iconify-icon> --> +<!-- <div class="my-auto">{text}</div> --> +<!-- </button> --> +<!-- </div> --> +<!-- --> + +<div class="border-8 border-black p-8 w-[710px] mx-auto mt-20 space-y-5"> + <div class="flex gap-2 mx-auto justify-center"> + <img src="/images/bitcoin.png" class="w-16 h-16 my-auto" /> + <h3 class="text-4xl font-bold text-center my-auto">Bitcoin Accepted</h3> + </div> + <Qr {text} /> + <div class="text-center text-5xl font-bold">coinos.io/{username}</div> + <div class="flex w-full justify-center gap-4 mt-10"> + <img + src="/images/logo.png" + class="ml-auto my-auto" + style="width: 180px" + /> + </div> +</div> + diff --git a/src/routes/(app)/accepted/[text]/raw/+server.ts b/src/routes/(app)/accepted/[text]/raw/+server.ts new file mode 100644 index 00000000..a24d3a3c --- /dev/null +++ b/src/routes/(app)/accepted/[text]/raw/+server.ts @@ -0,0 +1,16 @@ +import Qr from "qrcode-base64"; + +export async function GET({ params }) { + const { text } = params; + + const dataUri = Qr.drawImg(text, { size: 600 }); + const base64Data = dataUri.split(",")[1]; + const binaryData = Buffer.from(base64Data, "base64"); + + return new Response(binaryData, { + headers: { + "Content-Type": "image/gif", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); +} diff --git a/src/routes/(app)/accepted/create/+page.svelte b/src/routes/(app)/accepted/create/+page.svelte new file mode 100644 index 00000000..74316ba9 --- /dev/null +++ b/src/routes/(app)/accepted/create/+page.svelte @@ -0,0 +1,64 @@ +<script> + import { run, preventDefault } from 'svelte/legacy'; + + import { goto } from "$app/navigation"; + import { browser } from "$app/environment"; + import { t } from "$lib/translations"; + import Icon from "$comp/Icon.svelte"; + let el = $state(), text = $state(), pasted = $state(); + + let keypress = (e) => + e.key === "Enter" ? e.preventDefault() || el.click() : (pasted = false); + + let paste = async () => { + text = await navigator.clipboard.readText(); + pasted = true; + }; + + let submit = () => goto(`/qr/${encodeURIComponent(text)}`); + + run(() => { + if (browser && pasted && text) el.click() && (pasted = false); + }); +</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"> + Create QR + </h1> + + <form onsubmit={preventDefault(submit)} class="space-y-2 text-xl"> + <div class="mb-2"> + <textarea + use:focus + name="text" + placeholder="Enter some text or a URL to put in a QR" + onkeypress={keypress} + class="w-full p-4 border rounded-xl h-32 text-xl" + bind:value={text} + onpaste={() => (pasted = true)} + autocapitalize="none" +></textarea> + </div> + + <div class="flex gap-2"> + <button + type="button" + class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full bg-primary justify-center gap-2" + onclick={paste} + > + <Icon icon="paste" style="w-8 my-auto" /> + <div class="my-auto">{$t("user.send.paste")}</div> + </button> + + <button + bind:this={el} + type="submit" + class="flex bg-black text-white border rounded-2xl px-6 py-5 w-full font-bold gap-2 justify-center" + > + <Icon icon="send" style="w-8 my-auto invert" /> + <div class="my-auto">{$t("user.dashboard.go")}</div> + </button> + </div> + </form> +</div> |
