From 5f65772a8f7ae774891c2fd315f1f2a4d2518bfb Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 7 May 2025 08:59:58 -0700 Subject: black icon --- static/images/icon-black.svg | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 static/images/icon-black.svg (limited to 'static') diff --git a/static/images/icon-black.svg b/static/images/icon-black.svg new file mode 100644 index 00000000..7a4b894a --- /dev/null +++ b/static/images/icon-black.svg @@ -0,0 +1,27 @@ + + + + + + + + -- cgit v1.2.3 From 91ae976c9fd1b3a1ca2751482ffb4b7efb196f1d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 7 May 2025 09:01:20 -0700 Subject: black logo --- static/images/logo-black.svg | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 static/images/logo-black.svg (limited to 'static') diff --git a/static/images/logo-black.svg b/static/images/logo-black.svg new file mode 100644 index 00000000..aeb94302 --- /dev/null +++ b/static/images/logo-black.svg @@ -0,0 +1,8 @@ + + + + + + + + -- cgit v1.2.3 From 65641975fcf425cdf3f1ddf3991a2f2ab68562da Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 13 Jun 2025 20:51:55 -0700 Subject: warning --- static/images/warningicon.png | Bin 0 -> 97051 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/images/warningicon.png (limited to 'static') diff --git a/static/images/warningicon.png b/static/images/warningicon.png new file mode 100644 index 00000000..ecdf8027 Binary files /dev/null and b/static/images/warningicon.png differ -- cgit v1.2.3 From 7617102b14e5254c9675b7db34f12ff6906a0086 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 11 Jul 2025 10:51:59 -0700 Subject: qr update --- .../(app)/[username]/(profile)/+layout.svelte | 2 +- .../[username]/accepted/[text]/+page.server.ts | 7 +++ .../(app)/[username]/accepted/[text]/+page.svelte | 51 ++++++++++++++++ .../[username]/accepted/[text]/raw/+server.ts | 16 ++++++ .../(app)/[username]/accepted/create/+page.svelte | 64 +++++++++++++++++++++ src/routes/(app)/accepted/[text]/+page.server.ts | 4 -- src/routes/(app)/accepted/[text]/+page.svelte | 27 --------- src/routes/(app)/accepted/[text]/raw/+server.ts | 16 ------ src/routes/(app)/accepted/create/+page.svelte | 64 --------------------- static/images/tap.png | Bin 0 -> 5462 bytes 10 files changed, 139 insertions(+), 112 deletions(-) create mode 100644 src/routes/(app)/[username]/accepted/[text]/+page.server.ts create mode 100644 src/routes/(app)/[username]/accepted/[text]/+page.svelte create mode 100644 src/routes/(app)/[username]/accepted/[text]/raw/+server.ts create mode 100644 src/routes/(app)/[username]/accepted/create/+page.svelte delete mode 100644 src/routes/(app)/accepted/[text]/+page.server.ts delete mode 100644 src/routes/(app)/accepted/[text]/+page.svelte delete mode 100644 src/routes/(app)/accepted/[text]/raw/+server.ts delete mode 100644 src/routes/(app)/accepted/create/+page.svelte create mode 100644 static/images/tap.png (limited to 'static') diff --git a/src/routes/(app)/[username]/(profile)/+layout.svelte b/src/routes/(app)/[username]/(profile)/+layout.svelte index 2b31d41d..b384344e 100644 --- a/src/routes/(app)/[username]/(profile)/+layout.svelte +++ b/src/routes/(app)/[username]/(profile)/+layout.svelte @@ -241,7 +241,7 @@ > + import Icon from "$comp/Icon.svelte"; + import Qr from "$comp/Qr.svelte"; + import { back, copy } from "$lib/utils"; + let { data } = $props(); + let { nfc, text } = $derived(data); + let { username } = $derived(data.subject); + let url = `https://coinos.io/p/${username}`; + + +
+
+
+ +

Bitcoin Accepted Here

+
+ +
coinos.io/{username}
+ {#if nfc} +
+
+
+ + +
Coinos
+
+
+
+
+ +
Other
+ +
+
+
+ {/if} +
+
diff --git a/src/routes/(app)/[username]/accepted/[text]/raw/+server.ts b/src/routes/(app)/[username]/accepted/[text]/raw/+server.ts new file mode 100644 index 00000000..a24d3a3c --- /dev/null +++ b/src/routes/(app)/[username]/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)/[username]/accepted/create/+page.svelte b/src/routes/(app)/[username]/accepted/create/+page.svelte new file mode 100644 index 00000000..74316ba9 --- /dev/null +++ b/src/routes/(app)/[username]/accepted/create/+page.svelte @@ -0,0 +1,64 @@ + + +
+

+ Create QR +

+ +
+
+ +
+ +
+ + + +
+
+
diff --git a/src/routes/(app)/accepted/[text]/+page.server.ts b/src/routes/(app)/accepted/[text]/+page.server.ts deleted file mode 100644 index 210c3c45..00000000 --- a/src/routes/(app)/accepted/[text]/+page.server.ts +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 07bf5a1d..00000000 --- a/src/routes/(app)/accepted/[text]/+page.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - -
-
-
- -

Bitcoin Accepted

-
- -
coinos.io/{username}
-
- -
-
-
diff --git a/src/routes/(app)/accepted/[text]/raw/+server.ts b/src/routes/(app)/accepted/[text]/raw/+server.ts deleted file mode 100644 index a24d3a3c..00000000 --- a/src/routes/(app)/accepted/[text]/raw/+server.ts +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 74316ba9..00000000 --- a/src/routes/(app)/accepted/create/+page.svelte +++ /dev/null @@ -1,64 +0,0 @@ - - -
-

- Create QR -

- -
-
- -
- -
- - - -
-
-
diff --git a/static/images/tap.png b/static/images/tap.png new file mode 100644 index 00000000..ae59d00d Binary files /dev/null and b/static/images/tap.png differ -- cgit v1.2.3 From 7bc5a831b9dbb3cbaa78c6bf8f83980587809e3c Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 12 Jul 2025 11:09:28 -0700 Subject: auto withdrawal confirm --- src/locales/en.json | 8 +-- src/routes/(app)/[username]/(profile)/+page.svelte | 17 ++++++- .../(app)/[username]/accepted/[text]/+page.svelte | 55 ++++++++++----------- src/routes/(app)/settings/account/+page.svelte | 4 +- static/images/lntap.png | Bin 0 -> 377663 bytes static/images/tap.png | Bin 5462 -> 375651 bytes 6 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 static/images/lntap.png (limited to 'static') diff --git a/src/locales/en.json b/src/locales/en.json index 6045b00d..72c3cd41 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -296,6 +296,8 @@ "placeholder": "Enter an address, invoice or username" }, "settings": { + "confirmAutoWithdrawal": "Confirm auto withdrawal settings", + "confirmAutoWithdrawalDesc": "Your auto withdrawals have been disabled. Please double check your destination address before re-enabling them or remove the address to dismiss this message.", "tip": "Default tip", "tipDesc": "Default tip percentage when auto-paying trusted users", "nostr": "Nostr", @@ -308,15 +310,15 @@ "memoPromptPlaceholder": "e.g. Please enter your name for the order", "rememberFor": "Remember for", "import": "Import secret key", - "destination": "Autowithdrawal address", + "destination": "Auto withdrawal address", "destinationDesc": "The address that withdrawals will be sent to", "destinationPlaceholder": "Enter a Bitcoin, Liquid or Lightning address", "reserve": "Reserve amount", "reserveDesc": "The amount to be left in your account after the withdrawal is complete", "shopify": "Shopify", - "threshold": "Autowithdrawal threshold", + "threshold": "Auto withdrawal threshold", "thresholdDesc": "When your balance exceeds this amount, a withdrawal will be triggered", - "autoWithdraw": "Autowithdrawal", + "autoWithdraw": "Auto withdrawal", "autoWithdrawDescription": "Enable withdrawals to an external address when your balance reaches a given threshold", "notifications": "Email notifications", "pushNotifications": "Push notifications", diff --git a/src/routes/(app)/[username]/(profile)/+page.svelte b/src/routes/(app)/[username]/(profile)/+page.svelte index 31320197..c60c468a 100644 --- a/src/routes/(app)/[username]/(profile)/+page.svelte +++ b/src/routes/(app)/[username]/(profile)/+page.svelte @@ -32,12 +32,27 @@
+ {#if user?.destination && !user?.autowithdraw} + + {/if} {#if user?.fresh}

{$t("user.settings.welcome")}

{$t("user.settings.yourUsername")} {user?.username} - {#if $password} + {#if $password} {$t("user.settings.yourPassword")} {$password}{/if}
diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte index cfd9961f..d96e48e2 100644 --- a/src/routes/(app)/[username]/accepted/[text]/+page.svelte +++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte @@ -5,45 +5,44 @@ let { data } = $props(); let { nfc, text } = $derived(data); let { username } = $derived(data.subject); - let url = `https://coinos.io/p/${username}`; + let url = `https://coinos.io/p/${username.toLowerCase()}`;
-

Bitcoin Accepted Here

+

+ Bitcoin Accepted Here +

-
coinos.io/{username}
+
+ coinos.io/{username.toLowerCase()} +
{#if nfc}
-
-
- - -
Coinos
-
+
+ + +
-
-
- -
Other
- -
+
+ + + + + + +
{/if} diff --git a/src/routes/(app)/settings/account/+page.svelte b/src/routes/(app)/settings/account/+page.svelte index 481c8de7..d8b61170 100644 --- a/src/routes/(app)/settings/account/+page.svelte +++ b/src/routes/(app)/settings/account/+page.svelte @@ -204,7 +204,7 @@

-{#if user.autowithdraw} +
-{/if} +
{#if editingThreshold}
Date: Sun, 13 Jul 2025 23:05:57 -0700 Subject: tap qr --- bun.lockb | Bin 290051 -> 291945 bytes package.json | 4 ++- src/components/Qr.svelte | 12 ++++---- .../(app)/[username]/accepted/[text]/+page.svelte | 15 +++++----- src/routes/(app)/qr/[text]/[icon]/+server.ts | 33 +++++++++++++++++++++ src/routes/(app)/qr/[text]/raw/+server.ts | 1 + static/images/bitcoin-logo.png | Bin 0 -> 99084 bytes static/images/nfc.png | Bin 0 -> 118238 bytes static/images/tap.png | Bin 375651 -> 110037 bytes 9 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 src/routes/(app)/qr/[text]/[icon]/+server.ts create mode 100644 static/images/bitcoin-logo.png create mode 100644 static/images/nfc.png (limited to 'static') diff --git a/bun.lockb b/bun.lockb index 2a601932..92720150 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index a2241d3c..dfe2b380 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,8 @@ }, "type": "module", "dependencies": { - "cordova-plugin-android-notch": "^1.0.3" + "canvas": "^3.1.2", + "cordova-plugin-android-notch": "^1.0.3", + "qrcode": "^1.5.4" } } diff --git a/src/components/Qr.svelte b/src/components/Qr.svelte index 5f159442..da4ceb00 100644 --- a/src/components/Qr.svelte +++ b/src/components/Qr.svelte @@ -1,7 +1,11 @@
screenfull.toggle(qr)} onkeydown={() => screenfull.toggle(qr)} > - QR Code + QR Code
diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte index d96e48e2..1984cf81 100644 --- a/src/routes/(app)/[username]/accepted/[text]/+page.svelte +++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte @@ -9,15 +9,16 @@
-
+
- -

- Bitcoin Accepted Here -

+ + + + +
- -
+ +
coinos.io/{username.toLowerCase()}
{#if nfc} diff --git a/src/routes/(app)/qr/[text]/[icon]/+server.ts b/src/routes/(app)/qr/[text]/[icon]/+server.ts new file mode 100644 index 00000000..c2825877 --- /dev/null +++ b/src/routes/(app)/qr/[text]/[icon]/+server.ts @@ -0,0 +1,33 @@ +import { createCanvas, loadImage } from "canvas"; +import QRCode from "qrcode"; + +export async function GET({ params }) { + const { icon, text } = params; + const size = 600; + + const canvas = createCanvas(size, size); + await QRCode.toCanvas(canvas, text, { + errorCorrectionLevel: "H", + width: size, + }); + + const ctx = canvas.getContext("2d"); + + const logo = await loadImage(`static/images/${icon}`); + const logoSize = size * 0.3; + ctx.drawImage( + logo, + (size - logoSize) / 2, + (size - logoSize) / 2, + logoSize, + logoSize, + ); + + const buffer = canvas.toBuffer("image/png"); + return new Response(buffer, { + headers: { + "Content-Type": "image/png", + "Cache-Control": "public, max-age=31536000, immutable", + }, + }); +} diff --git a/src/routes/(app)/qr/[text]/raw/+server.ts b/src/routes/(app)/qr/[text]/raw/+server.ts index a24d3a3c..a2626c4d 100644 --- a/src/routes/(app)/qr/[text]/raw/+server.ts +++ b/src/routes/(app)/qr/[text]/raw/+server.ts @@ -14,3 +14,4 @@ export async function GET({ params }) { }, }); } + diff --git a/static/images/bitcoin-logo.png b/static/images/bitcoin-logo.png new file mode 100644 index 00000000..c9bdae0a Binary files /dev/null and b/static/images/bitcoin-logo.png differ diff --git a/static/images/nfc.png b/static/images/nfc.png new file mode 100644 index 00000000..9d86d727 Binary files /dev/null and b/static/images/nfc.png differ diff --git a/static/images/tap.png b/static/images/tap.png index 7e4b659e..a6622111 100644 Binary files a/static/images/tap.png and b/static/images/tap.png differ -- cgit v1.2.3 From fd6e5957f2625e4e12e22c4f018c68ce28f99128 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 17 Jul 2025 16:18:30 -0700 Subject: square connection --- src/locales/en.json | 2 ++ src/routes/(app)/settings/account/+page.server.ts | 6 ++++-- src/routes/(app)/settings/account/+page.svelte | 16 +++++++++++++++- src/routes/(app)/settings/square/+page.server.ts | 18 ++++++++++++++++++ src/routes/(app)/settings/square/+page.svelte | 0 static/images/square.svg | 15 +++++++++++++++ 6 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 src/routes/(app)/settings/square/+page.server.ts create mode 100644 src/routes/(app)/settings/square/+page.svelte create mode 100644 static/images/square.svg (limited to 'static') diff --git a/src/locales/en.json b/src/locales/en.json index 77b2cb20..0ff021cd 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -296,6 +296,8 @@ "placeholder": "Enter an address, invoice or username" }, "settings": { + "connectSquare": "Connect to Square", + "revokeSquare": "Revoke Square Connection", "confirmAutoWithdrawal": "Confirm auto withdrawal settings", "confirmAutoWithdrawalDesc": "Your auto withdrawals have been disabled. Please double check your destination address before re-enabling them or remove the address to dismiss this message.", "tip": "Default tip", diff --git a/src/routes/(app)/settings/account/+page.server.ts b/src/routes/(app)/settings/account/+page.server.ts index f0cc700e..ebb90f05 100644 --- a/src/routes/(app)/settings/account/+page.server.ts +++ b/src/routes/(app)/settings/account/+page.server.ts @@ -1,9 +1,11 @@ import getRates from "$lib/rates"; import updateUser from "$lib/settings"; +import { auth, get } from "$lib/utils"; -export async function load() { +export async function load({ cookies }) { const rates = await getRates(); - return { rates }; + const connect = await get("/square/connect", auth(cookies)); + return { connect, rates }; } export const actions = { diff --git a/src/routes/(app)/settings/account/+page.svelte b/src/routes/(app)/settings/account/+page.svelte index d8b61170..26013cbb 100644 --- a/src/routes/(app)/settings/account/+page.svelte +++ b/src/routes/(app)/settings/account/+page.svelte @@ -13,7 +13,7 @@ let { data } = $props(); let { user } = $state(data); - let { rates, subscriptions } = data; + let { connect, rates, subscriptions } = data; let { currency, email, tip, verified } = $state(user); let rate = rates[currency]; @@ -97,6 +97,8 @@ $effect(() => { if (email !== user.email) verified = false; }); + + let revoke = () => {};
@@ -319,3 +321,15 @@
{/if} + +{#if connect !== "connected"} + + +
{$t("user.settings.connectSquare")}
+{:else} + +{/if} diff --git a/src/routes/(app)/settings/square/+page.server.ts b/src/routes/(app)/settings/square/+page.server.ts new file mode 100644 index 00000000..e00bdf1b --- /dev/null +++ b/src/routes/(app)/settings/square/+page.server.ts @@ -0,0 +1,18 @@ +import { auth, get } from "$lib/utils"; +import { fail, redirect } from "@sveltejs/kit"; + +export async function load({ cookies, url }) { + let connected; + + const query = url.searchParams.toString(); + + try { + await get(`/square/auth?${query}`, auth(cookies)); + connected = true; + } catch (e) { + const { message } = e as Error; + fail(400, { message }); + } + + if (connected) redirect(307, "/settings/account"); +} diff --git a/src/routes/(app)/settings/square/+page.svelte b/src/routes/(app)/settings/square/+page.svelte new file mode 100644 index 00000000..e69de29b diff --git a/static/images/square.svg b/static/images/square.svg new file mode 100644 index 00000000..14432609 --- /dev/null +++ b/static/images/square.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3 From 6b0eca67572620d1a8265917cb2134235994ec72 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 26 Jul 2025 16:50:02 -0700 Subject: new qr --- .../(app)/[username]/accepted/[text]/+page.svelte | 13 ++++++++----- static/images/arrow.png | Bin 0 -> 35471 bytes static/images/tap.png | Bin 110037 -> 180156 bytes 3 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 static/images/arrow.png (limited to 'static') diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte index 9770c937..090a873d 100644 --- a/src/routes/(app)/[username]/accepted/[text]/+page.svelte +++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte @@ -6,13 +6,12 @@ let { nfc, text } = $derived(data); let { username } = $derived(data.subject); let url = `https://coinos.io/p/${username.toLowerCase()}`; - - let icon; - if (nfc) icon = "nfc.png";
-
+
@@ -20,7 +19,11 @@
- + {#if nfc} + + + {/if} +
coinos.io/{username.toLowerCase()}
diff --git a/static/images/arrow.png b/static/images/arrow.png new file mode 100644 index 00000000..926cf9ea Binary files /dev/null and b/static/images/arrow.png differ diff --git a/static/images/tap.png b/static/images/tap.png index a6622111..21962b2f 100644 Binary files a/static/images/tap.png and b/static/images/tap.png differ -- cgit v1.2.3 From 2c2dfe5058c978dde5654666f72ade537aaa8564 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Sat, 26 Jul 2025 17:00:51 -0700 Subject: arrow outline --- .../(app)/[username]/accepted/[text]/+page.svelte | 4 ++-- static/images/arrow.png | Bin 35471 -> 180076 bytes 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'static') diff --git a/src/routes/(app)/[username]/accepted/[text]/+page.svelte b/src/routes/(app)/[username]/accepted/[text]/+page.svelte index 899b98f5..394cf3f7 100644 --- a/src/routes/(app)/[username]/accepted/[text]/+page.svelte +++ b/src/routes/(app)/[username]/accepted/[text]/+page.svelte @@ -20,8 +20,8 @@
{#if nfc} - - + + {/if}
diff --git a/static/images/arrow.png b/static/images/arrow.png index 926cf9ea..63ae4c0f 100644 Binary files a/static/images/arrow.png and b/static/images/arrow.png differ -- cgit v1.2.3