From 1f63848ca9fb01336f04b41434de1cc06a5b3d93 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 10 Sep 2024 20:39:47 -0700 Subject: move routes --- src/routes/(app)/settings/[...tab]/+page.server.ts | 34 +++ src/routes/(app)/settings/[...tab]/+page.svelte | 257 +++++++++++++++++ src/routes/(app)/settings/[...tab]/_account.svelte | 190 ++++++++++++ src/routes/(app)/settings/[...tab]/_pos.svelte | 238 +++++++++++++++ .../(app)/settings/[...tab]/_security.svelte | 321 +++++++++++++++++++++ src/routes/(app)/settings/[...tab]/_shopify.svelte | 92 ++++++ 6 files changed, 1132 insertions(+) create mode 100644 src/routes/(app)/settings/[...tab]/+page.server.ts create mode 100644 src/routes/(app)/settings/[...tab]/+page.svelte create mode 100644 src/routes/(app)/settings/[...tab]/_account.svelte create mode 100644 src/routes/(app)/settings/[...tab]/_pos.svelte create mode 100644 src/routes/(app)/settings/[...tab]/_security.svelte create mode 100644 src/routes/(app)/settings/[...tab]/_shopify.svelte (limited to 'src/routes/(app)/settings') diff --git a/src/routes/(app)/settings/[...tab]/+page.server.ts b/src/routes/(app)/settings/[...tab]/+page.server.ts new file mode 100644 index 00000000..42639b38 --- /dev/null +++ b/src/routes/(app)/settings/[...tab]/+page.server.ts @@ -0,0 +1,34 @@ +import { fail, redirect } from "@sveltejs/kit"; +import { fd, auth, get, post } from "$lib/utils"; + +export function load({ cookies, params, url }) { + if (url.pathname.endsWith("settings")) + redirect(307, url.pathname + "/account"); + params.cookies = cookies.getAll(); + return { cookies: cookies.getAll(), tab: params.tab }; +} + +export const actions = { + default: async ({ cookies, request }) => { + let form = await fd(request); + + if (form.tab === "pos") { + form.notify = form.notify === "on"; + form.nip5 = form.nip5 === "on"; + form.prompt = form.prompt === "on"; + form.autowithdraw = form.autowithdraw === "on"; + } + + let user = { ...(await get("/me", auth(cookies))), ...form }; + + try { + ({ user } = await post(`/user`, user, auth(cookies))); + } catch (e: any) { + return fail(400, { message: e.message }); + } + + if (user.language) cookies.set("lang", user.language, { path: "/" }); + + return { user, success: true }; + }, +}; diff --git a/src/routes/(app)/settings/[...tab]/+page.svelte b/src/routes/(app)/settings/[...tab]/+page.svelte new file mode 100644 index 00000000..c495a5cc --- /dev/null +++ b/src/routes/(app)/settings/[...tab]/+page.svelte @@ -0,0 +1,257 @@ + + +{#if user.haspin && $pin?.length !== 6} + +{/if} + +
+ + + +
+
+

+ {$t("user.settings.header")} +

+ +
+ {#each tabs.filter((t) => t.name !== "shopify") as { name, key }} + + + + {/each} +
+
+ + +
+ +
+ +
+
+ + diff --git a/src/routes/(app)/settings/[...tab]/_account.svelte b/src/routes/(app)/settings/[...tab]/_account.svelte new file mode 100644 index 00000000..8e3323c7 --- /dev/null +++ b/src/routes/(app)/settings/[...tab]/_account.svelte @@ -0,0 +1,190 @@ + + +
+ +
+ +
+
+ +
+ + +
+ +
+ +

+ {$t("user.settings.emailDescription")} +

+ +
+ + {#if user.verified} + + {:else if user.email} + + {/if} +
+
+ +
+ {$t("user.settings.profileImage")} + +
+ {#if $avatar || user.profile} +
+ {user.username} +
+ {:else} +
+ +
+ {/if} +
+ + + handleFile(e, "profile")} + /> +
+
+ + {#if tooLarge["avatar"]} +
Max file size 10MB
+ {/if} +
+ +
+
+ {$t("user.settings.bannerImage")} +
+ + {#if $banner || user.banner} + Banner + {:else} +
+ {/if} + + + handleFile(e, "banner")} + /> + + {#if tooLarge["banner"]} +
Max file size 10MB
+ {/if} +
+ +
+ + +
+ +
+ +

+ Coinos can automatically mark orders as Paid if you provide an API token. + +

+

+ Create a new app in Apps > App Development +

+ +

+ Edit the Admin API scopes to enable write_orders permission then install the app into your store and copy the Admin API access + token here. +

+
+ + -- cgit v1.2.3 From 2114156be3f89a2ef4c5bd13fd6d7a51d8fbc135 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 12 Sep 2024 15:23:45 -0700 Subject: self custodial send --- .env.production | 1 + bun.lockb | Bin 158882 -> 161519 bytes package.json | 3 +- src/components/Account.svelte | 17 ++- src/components/LandingHeader.svelte | 16 +-- src/components/Request.svelte | 39 ------ src/lib/invoice.ts | 7 +- src/lib/store.ts | 1 + src/lib/utils.ts | 41 ++++++- src/locales/en.json | 1 + src/routes/(app)/+error.svelte | 38 ++++++ src/routes/(app)/+layout.svelte | 6 - src/routes/(app)/[username]/(profile)/+page.svelte | 42 ++++--- src/routes/(app)/[username]/+layout.server.ts | 1 - src/routes/(app)/account/setup/step2/+page.svelte | 28 ++++- src/routes/(app)/invoice/+page.server.ts | 4 +- src/routes/(app)/invoice/[id]/+layout.server.ts | 7 +- src/routes/(app)/invoice/[id]/+page.svelte | 4 +- src/routes/(app)/logout/+page.server.ts | 1 + .../(app)/payments/[...page]/+page.server.ts | 3 +- src/routes/(app)/qr/[text]/+page.svelte | 4 - .../(app)/send/bitcoin/[address]/+page.server.ts | 7 ++ .../(app)/send/bitcoin/[address]/+page.svelte | 4 +- .../[amount]/[...feeRate]/+page.server.ts | 27 +++- .../[address]/[amount]/[...feeRate]/+page.svelte | 136 ++++++++++++++++++++- src/routes/(app)/send/ecash/+page.svelte | 6 - src/routes/(app)/sent/+page.server.ts | 3 +- src/routes/(app)/settings/[...tab]/+page.svelte | 2 +- src/routes/(static)/+layout.svelte | 2 +- src/routes/(static)/login/+page.svelte | 2 +- src/routes/(static)/register/+page.svelte | 2 +- src/routes/(static)/support/+page.svelte | 9 +- src/routes/+error.svelte | 1 - 33 files changed, 325 insertions(+), 140 deletions(-) delete mode 100644 src/components/Request.svelte create mode 100644 src/routes/(app)/+error.svelte create mode 100644 src/routes/(app)/send/bitcoin/[address]/+page.server.ts (limited to 'src/routes/(app)/settings') diff --git a/.env.production b/.env.production index 1ae57c17..8b72abf4 100644 --- a/.env.production +++ b/.env.production @@ -6,3 +6,4 @@ PUBLIC_LIQUID_EXPLORER=https://liquid.network PUBLIC_DOMAIN=coinos.io PUBLIC_COINOS_PUBKEY=ba80990666ef0b6f4ba5059347beb13242921e54669e680064ca755256a1e3a6 PUBLIC_COINOS_RELAY=wss://relay.coinos.io +PUBLIC_COINOS_NETWORK=regtest diff --git a/bun.lockb b/bun.lockb index df7d1899..97e0841d 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 848db710..2ed4c699 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,9 @@ "@capacitor/cli": "^6.0.0", "@capacitor/core": "^6.0.0", "@capacitor/ios": "^6.1.2", - "@scure/base": "^1.1.1", + "@scure/base": "^1.1.8", "@scure/bip39": "^1.2.1", + "@scure/btc-signer": "^1.3.2", "@sveltejs/adapter-node": "^2.0.0", "@sveltejs/kit": "^2.5.22", "@sveltejs/vite-plugin-svelte": "^3.0.0", diff --git a/src/components/Account.svelte b/src/components/Account.svelte index eb1b0bac..f83068b5 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -1,4 +1,5 @@ - +
-
- -
-
{type} account
-
-
+
- +
diff --git a/src/components/Request.svelte b/src/components/Request.svelte deleted file mode 100644 index 297b7438..00000000 --- a/src/components/Request.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - -{#if $request} -
-
-
-
- -

- {$request.requester.username} - {$t("payments.readyToPay")} -

-
-
- -
-
-{/if} diff --git a/src/lib/invoice.ts b/src/lib/invoice.ts index 3c885346..0ab0a9af 100644 --- a/src/lib/invoice.ts +++ b/src/lib/invoice.ts @@ -1,13 +1,14 @@ -import { auth, get, post } from "$lib/utils"; +import { auth, get, post, setAccount } from "$lib/utils"; import { redirect } from "@sveltejs/kit"; -export default async ({ cookies, request }) => { +export default async ({ cookies, request, url }) => { let form = await request.formData(); let rates = await get("/rates"); let amount = parseInt(form.get("amount")); let invoice = { + account, amount, items: JSON.parse(form.get("items")), memo: form.get("memo"), @@ -16,7 +17,7 @@ export default async ({ cookies, request }) => { type: form.get("type"), prompt: form.get("prompt") === "true", rate: parseFloat(form.get("rate")) || rates[form.get("currency")], - id: undefined + id: undefined, }; let user = { username: form.get("username"), currency: form.get("currency") }; diff --git a/src/lib/store.ts b/src/lib/store.ts index 3c1ff321..42b41127 100644 --- a/src/lib/store.ts +++ b/src/lib/store.ts @@ -38,6 +38,7 @@ let persistLocal = (key, defaultValue: any = undefined) => { return s; }; +export let account = writable(); export let amountPrompt = persistLocal("amountPrompt"); export let avatar = writable(); export let banner = writable(); diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 69e0f949..c20a7d29 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,7 +1,7 @@ import { browser } from "$app/environment"; import { toast } from "@zerodevx/svelte-toast"; import { goto } from "$app/navigation"; -import { PUBLIC_COINOS_URL } from "$env/static/public"; +import { PUBLIC_COINOS_NETWORK, PUBLIC_COINOS_URL } from "$env/static/public"; import { page } from "$app/stores"; import { get as getStore } from "svelte/store"; @@ -41,7 +41,11 @@ export let get = (url: string, headers = {}) => { }); }; -export let post = async (url: string, body: object, headers: HeadersInit | undefined = undefined) => { +export let post = async ( + url: string, + body: object, + headers: HeadersInit | undefined = undefined +) => { headers = { "content-type": "application/json", accept: "application/json", @@ -242,7 +246,11 @@ export let select = (el: HTMLInputElement): any => export let sleep = (n: number): Promise => new Promise((r) => setTimeout(r, n)); -export let wait = async (f: () => boolean | Promise, n: number = 100, s: number = 300): Promise => { +export let wait = async ( + f: () => boolean | Promise, + n: number = 100, + s: number = 300 +): Promise => { let i = 0; while (!(await f()) && i < s) { await sleep(n); @@ -327,3 +335,30 @@ export function setCookie(name: string, value: string, seconds: number): void { const expires = "expires=" + now.toUTCString(); document.cookie = name + "=" + value + ";" + expires + ";path=/"; } + +export let network = { + bitcoin: { + bech32: "bc", + pubKeyHash: 0x00, + scriptHash: 0x05, + wif: 0x80, + }, + regtest: { + bech32: "bcrt", + pubKeyHash: 0x6f, + scriptHash: 0xc4, + wif: 0xef, + }, +}[PUBLIC_COINOS_NETWORK]; + +export let versions = { + bitcoin: { + private: 0x0488ade4, + public: 0x0488b21e, + }, + regtest: { + private: 0x04358394, + public: 0x043587cf, + }, +}[PUBLIC_COINOS_NETWORK]; + diff --git a/src/locales/en.json b/src/locales/en.json index b1bbe1c4..fd2807b4 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -299,6 +299,7 @@ } }, "payments": { + "enterWalletPass": "Please enter your wallet password", "legacyVersion": "Legacy version", "newVersion": "New version", "income": "Income", diff --git a/src/routes/(app)/+error.svelte b/src/routes/(app)/+error.svelte new file mode 100644 index 00000000..6ce7979c --- /dev/null +++ b/src/routes/(app)/+error.svelte @@ -0,0 +1,38 @@ + + +
+
+ + + +
+ +
+
+
+

Error

+
+

Something went wrong

+

{$page.error.message}

+ + +
+
+
diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 0ff4816d..05ca0d0c 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -17,7 +17,6 @@ import AppHeader from "$comp/AppHeader.svelte"; import Invoice from "$comp/Invoice.svelte"; import Password from "$comp/Password.svelte"; - import Request from "$comp/Request.svelte"; import { getCookie, warning, protectedRoutes } from "$lib/utils"; import { t, locale, loading } from "$lib/translations"; import { goto, onNavigate } from "$app/navigation"; @@ -36,7 +35,6 @@ }); let { generate, rate, user, subject, token, rates } = data; - console.log("SUB", subject) $: update(data); let update = (data) => { @@ -127,10 +125,6 @@ {/if} -{#if $request} - -{/if} - diff --git a/src/routes/(app)/[username]/+layout.svelte b/src/routes/(app)/[username]/+layout.svelte index 98569f59..ce152831 100644 --- a/src/routes/(app)/[username]/+layout.svelte +++ b/src/routes/(app)/[username]/+layout.svelte @@ -1,17 +1,5 @@
@@ -19,39 +7,3 @@
- - diff --git a/src/routes/(app)/invoice/[id]/+layout.server.ts b/src/routes/(app)/invoice/[id]/+layout.server.ts index 71f53e09..a00515a0 100644 --- a/src/routes/(app)/invoice/[id]/+layout.server.ts +++ b/src/routes/(app)/invoice/[id]/+layout.server.ts @@ -16,6 +16,7 @@ export async function load({ depends, params, url, parent }) { !(url.pathname.includes("tip") || url.pathname.includes("memo")) && !options ) { + console.log("YO") redirect(307, `/send/invoice/${id}`); } diff --git a/src/routes/(app)/invoice/[id]/paid/+page.svelte b/src/routes/(app)/invoice/[id]/paid/+page.svelte index df05f12b..80d5fe6e 100644 --- a/src/routes/(app)/invoice/[id]/paid/+page.svelte +++ b/src/routes/(app)/invoice/[id]/paid/+page.svelte @@ -76,7 +76,7 @@ {/if}
- +
diff --git a/src/routes/(app)/send/bitcoin/[address]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/+page.svelte index b656dc06..6b938c38 100644 --- a/src/routes/(app)/send/bitcoin/[address]/+page.svelte +++ b/src/routes/(app)/send/bitcoin/[address]/+page.svelte @@ -24,12 +24,6 @@ }; - - - -

{$t("payments.send")}

diff --git a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte index 1267a992..0630948c 100644 --- a/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte +++ b/src/routes/(app)/send/bitcoin/[address]/[amount]/[...feeRate]/+page.svelte @@ -55,6 +55,7 @@ let key = child.derive(path); let { privateKey, publicKey } = key; let address = btc.getAddress("wpkh", privateKey, network); + console.log("ADDR", address) tx.signIdx(privateKey, i); } tx.finalize(); @@ -112,15 +113,6 @@ let goBack = () => goto(`/send/bitcoin/${address}`); - -
diff --git a/src/routes/(app)/send/invoice/[id]/+page.server.ts b/src/routes/(app)/send/invoice/[id]/+page.server.ts index fa7d28dd..c31bcd7b 100644 --- a/src/routes/(app)/send/invoice/[id]/+page.server.ts +++ b/src/routes/(app)/send/invoice/[id]/+page.server.ts @@ -12,7 +12,7 @@ export async function load({ params: { id }, parent }) { if (invoice.memoPrompt && invoice.memo === null) redirect(307, `/invoice/${id}/memo`); - if (invoice.user.username === user?.username) + if (invoice.account === user?.id) error(500, { message: "Cannot send to self" }); if (!user) redirect(307, `/invoice/${id}`); diff --git a/src/routes/(app)/send/invoice/[id]/+page.svelte b/src/routes/(app)/send/invoice/[id]/+page.svelte index 75e4e75a..4348e473 100644 --- a/src/routes/(app)/send/invoice/[id]/+page.svelte +++ b/src/routes/(app)/send/invoice/[id]/+page.svelte @@ -93,10 +93,6 @@ // }); - - {#if form?.message}
{form.message} diff --git a/src/routes/(app)/settings/[...tab]/+page.svelte b/src/routes/(app)/settings/[...tab]/+page.svelte index 7f4dc87e..df66dbd0 100644 --- a/src/routes/(app)/settings/[...tab]/+page.svelte +++ b/src/routes/(app)/settings/[...tab]/+page.svelte @@ -249,9 +249,3 @@
- - -- cgit v1.2.3 From b0fe475ac2e6549369d08afdc082968638a2e52c Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 17 Sep 2024 14:05:25 -0700 Subject: account settings --- src/components/Account.svelte | 12 ++++++++++-- src/routes/(app)/account/[id]/+page.server.ts | 19 +++++++++++++++++++ src/routes/(app)/account/[id]/+page.svelte | 21 +++++++++++++++++++++ src/routes/(app)/settings/[...tab]/+page.svelte | 2 +- 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 src/routes/(app)/account/[id]/+page.server.ts create mode 100644 src/routes/(app)/account/[id]/+page.svelte (limited to 'src/routes/(app)/settings') diff --git a/src/components/Account.svelte b/src/components/Account.svelte index d52c4f52..a8573c37 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -5,7 +5,7 @@ import { t } from "$lib/translations"; export let user, rate, account; - let { seed, balance, id } = account; + let { name, seed, balance, id } = account; $: type = seed ? "Savings" : "Cash"; $: refresh(account); @@ -17,7 +17,15 @@
- +
diff --git a/src/routes/(app)/account/[id]/+page.server.ts b/src/routes/(app)/account/[id]/+page.server.ts new file mode 100644 index 00000000..7d1c503a --- /dev/null +++ b/src/routes/(app)/account/[id]/+page.server.ts @@ -0,0 +1,19 @@ +import { error, redirect } from "@sveltejs/kit"; +import { auth, post, fd } from "$lib/utils"; + +export const actions = { + default: async ({ cookies, params, request }) => { + let { id } = params; + let body = await fd(request); + let username = cookies.get("username"); + + try { + await post(`/account/${id}`, body, auth(cookies)); + } catch (e: any) { + console.log(e); + error(400, { message: e.message }); + } + + redirect(303, `/${username}`); + }, +}; diff --git a/src/routes/(app)/account/[id]/+page.svelte b/src/routes/(app)/account/[id]/+page.svelte new file mode 100644 index 00000000..152e8dfc --- /dev/null +++ b/src/routes/(app)/account/[id]/+page.svelte @@ -0,0 +1,21 @@ + + +
+

Account settings

+ +
+
+
+ + +
+ + +
+
+
diff --git a/src/routes/(app)/settings/[...tab]/+page.svelte b/src/routes/(app)/settings/[...tab]/+page.svelte index df66dbd0..f59806d1 100644 --- a/src/routes/(app)/settings/[...tab]/+page.svelte +++ b/src/routes/(app)/settings/[...tab]/+page.svelte @@ -137,7 +137,7 @@ content: JSON.stringify({ name: user.username, about: user.address, - picture: `${PUBLIC_COINOS_URL}/public/${user.profile}.webp`, + picture: `${$page.url.origin}/public/${user.profile}.webp`, }), tags: [], }; -- cgit v1.2.3 From 11b5a6469158c0dcdafe19e0b6dfcd0abee8df2d Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Tue, 24 Sep 2024 20:02:05 -0700 Subject: styles --- src/components/Account.svelte | 8 ++++---- src/components/AppHeader.svelte | 10 +++++----- src/locales/en.json | 6 +++--- .../(app)/[username]/(profile)/+layout.svelte | 2 +- src/routes/(app)/[username]/receive/+page.svelte | 2 +- src/routes/(app)/invoice/[id]/+page.svelte | 2 +- src/routes/(app)/receive/[...token]/+page.svelte | 12 +++++------ src/routes/(app)/send/[...text]/+page.svelte | 4 ++-- src/routes/(app)/settings/[...tab]/_pos.svelte | 23 ---------------------- 9 files changed, 23 insertions(+), 46 deletions(-) (limited to 'src/routes/(app)/settings') diff --git a/src/components/Account.svelte b/src/components/Account.svelte index d4a89556..458f67c6 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -14,7 +14,7 @@
-
+
{#if seed} @@ -26,10 +26,10 @@ {/if}
-
+
{/if} diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte index 580456cd..5ef9e5e5 100644 --- a/src/routes/(app)/invoice/[id]/+page.svelte +++ b/src/routes/(app)/invoice/[id]/+page.svelte @@ -276,7 +276,7 @@ class="hover:bg-primary flex gap-1 sm:gap-2 py-3 px-2 sm:px-5 justify-center" > -
E-cash
+
Ecash
{/if} diff --git a/src/routes/(app)/receive/[...token]/+page.svelte b/src/routes/(app)/receive/[...token]/+page.svelte index 7ff93fa9..988c1e6c 100644 --- a/src/routes/(app)/receive/[...token]/+page.svelte +++ b/src/routes/(app)/receive/[...token]/+page.svelte @@ -31,7 +31,7 @@

- {$t("payments.voucher")} + {$t("user.dashboard.receive")}

@@ -51,7 +51,7 @@ name="text" placeholder={$t("payments.voucherText")} on:keypress={keypress} - class="w-full p-4 border rounded-xl h-48 text-xl" + class="w-full p-4 border rounded-xl h-32 text-xl" bind:value={text} on:paste={() => (pasted = true)} autocapitalize="none" @@ -62,19 +62,19 @@
diff --git a/src/routes/(app)/send/[...text]/+page.svelte b/src/routes/(app)/send/[...text]/+page.svelte index be7fc664..faa4a766 100644 --- a/src/routes/(app)/send/[...text]/+page.svelte +++ b/src/routes/(app)/send/[...text]/+page.svelte @@ -63,7 +63,7 @@
-
- -