aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-12-22 23:09:36 -0800
committerAdam Soltys <[email protected]>2024-12-22 23:09:36 -0800
commitab82b405be6f2665c43518b4ad253becc8ab7430 (patch)
tree6e6fa488e6d78aa15f38da081b203423e4bb9d92 /src/routes/(app)
parente2fcfdc4d608e260bb596952d8b54a7dcef05258 (diff)
downloadcoinos-ui-ab82b405be6f2665c43518b4ad253becc8ab7430.tar.gz
coinos-ui-ab82b405be6f2665c43518b4ad253becc8ab7430.zip
set memo
Diffstat (limited to 'src/routes/(app)')
-rw-r--r--src/routes/(app)/[username]/receive/+page.svelte63
-rw-r--r--src/routes/(app)/invoice/+server.ts11
-rw-r--r--src/routes/(app)/invoice/[id]/+page.svelte67
-rw-r--r--src/routes/(app)/invoice/[id]/memo/+page.server.ts8
-rw-r--r--src/routes/(app)/invoice/[id]/memo/+page.svelte2
-rw-r--r--src/routes/(app)/pay/[username]/[...amount]/+page.server.ts2
-rw-r--r--src/routes/(app)/pay/[username]/[...amount]/+page.svelte21
7 files changed, 112 insertions, 62 deletions
diff --git a/src/routes/(app)/[username]/receive/+page.svelte b/src/routes/(app)/[username]/receive/+page.svelte
index 28d33754..9f3a3fd8 100644
--- a/src/routes/(app)/[username]/receive/+page.svelte
+++ b/src/routes/(app)/[username]/receive/+page.svelte
@@ -5,6 +5,7 @@
loc,
post,
copy,
+ fail,
f,
get,
types,
@@ -20,6 +21,7 @@
import InvoiceActions from "$comp/InvoiceActions.svelte";
import InvoiceTypes from "$comp/InvoiceTypes.svelte";
import SetAmount from "$comp/SetAmount.svelte";
+ import SetMemo from "$comp/SetMemo.svelte";
import { t } from "$lib/translations";
import { goto, invalidate } from "$app/navigation";
@@ -48,21 +50,30 @@
amountFiat,
tip;
+ let update = async () => {
+ try {
+ ({ id } = await post(`/invoice`, {
+ invoice,
+ user: { username, currency },
+ }));
+
+ let url = `/invoice/${id}`;
+ if (subject?.prompt) url += "/tip";
+ else url += "?options=true";
+
+ goto(url, { invalidateAll: true, noScroll: true });
+ } catch (e) {
+ fail(e.message);
+ }
+ };
+
let setType = async (type) => {
$showQr = true;
if (type === types.lightning && !amount)
goto(`/${username}/receive`, { invalidateAll: true, noScroll: true });
else {
invoice.type = type;
- ({ id } = await post(`/invoice`, {
- invoice,
- user: { username, currency },
- }));
-
- goto(`/invoice/${id}?options=true`, {
- invalidateAll: true,
- noScroll: true,
- });
+ await update();
}
};
@@ -77,23 +88,27 @@
invoice.amount = newAmount;
invoice.tip = 0;
- ({ id } = await post(`/invoice`, {
- invoice,
- user: { username, currency },
- }));
-
- let url = `/invoice/${id}`;
- if (subject?.prompt) url += "/tip";
- else url += "?options=true";
-
- goto(url, { invalidateAll: true, noScroll: true });
+ await update();
};
let newAmount = $state();
let settingAmount = $state();
let fiat = $state(true);
let toggleAmount = () => (settingAmount = !settingAmount);
- let submit;
+
+ let setMemo = async (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ settingMemo = false;
+ invoice.memo = memo;
+ await update();
+ };
+
+ let memo = $state();
+ let settingMemo = $state();
+ let toggleMemo = () => (settingMemo = !settingMemo);
+
let link = $derived(
[types.bitcoin, types.liquid].includes(type) ? text : `lightning:${text}`,
);
@@ -119,22 +134,23 @@
{tip}
{rate}
showQr={$showQr}
+ t={$t}
/>
<InvoiceActions
{toggleAmount}
+ {toggleMemo}
{user}
{invoice}
{copy}
{link}
{type}
- {types}
{showQr}
{txt}
t={$t}
/>
- <InvoiceTypes {aid} {invoice} {user} {type} {types} {setType} t={$t} />
+ <InvoiceTypes {aid} {invoice} {user} {type} {setType} t={$t} />
</div>
<SetAmount
@@ -143,9 +159,10 @@
{currency}
locale={loc(user)}
{rate}
- {submit}
{settingAmount}
{setAmount}
{toggleAmount}
t={$t}
/>
+
+<SetMemo bind:memo {settingMemo} {setMemo} {toggleMemo} t={$t} />
diff --git a/src/routes/(app)/invoice/+server.ts b/src/routes/(app)/invoice/+server.ts
index f20d70f3..f494c153 100644
--- a/src/routes/(app)/invoice/+server.ts
+++ b/src/routes/(app)/invoice/+server.ts
@@ -1,7 +1,12 @@
import { auth, post } from "$lib/utils";
-import { json } from "@sveltejs/kit";
+import { error, json } from "@sveltejs/kit";
export const POST = async ({ cookies, request }) => {
- const body = await request.json();
- return json(await post("/invoice", body, auth(cookies)));
+ try {
+ const body = await request.json();
+ return json(await post("/invoice", body, auth(cookies)));
+ } catch (e) {
+ const { message } = e as Error;
+ error(500, message);
+ }
};
diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte
index 8ad555bb..350d2398 100644
--- a/src/routes/(app)/invoice/[id]/+page.svelte
+++ b/src/routes/(app)/invoice/[id]/+page.svelte
@@ -7,6 +7,7 @@
post,
copy,
f,
+ fail,
get,
types,
sat,
@@ -21,6 +22,7 @@
import InvoiceActions from "$comp/InvoiceActions.svelte";
import InvoiceTypes from "$comp/InvoiceTypes.svelte";
import SetAmount from "$comp/SetAmount.svelte";
+ import SetMemo from "$comp/SetMemo.svelte";
import { t } from "$lib/translations";
import { goto, invalidate } from "$app/navigation";
@@ -38,6 +40,7 @@
let { id, subject, user } = $state(data);
let { invoice, src } = $derived(data);
let { aid, amount, rate, tip, hash, text, type } = $derived(invoice);
+ let { memo } = $state(invoice);
let { username, currency } = $derived(invoice.user);
let locale = loc(user);
@@ -65,24 +68,37 @@
}
});
+ let update = async () => {
+ try {
+ ({ id } = await post(`/invoice`, {
+ invoice,
+ user: { username, currency },
+ }));
+
+ let url = `/invoice/${id}`;
+ if (subject?.prompt) url += "/tip";
+ else url += "?options=true";
+
+ goto(url, { invalidateAll: true, noScroll: true });
+ } catch (e) {
+ fail(e.message);
+ }
+ };
+
let setType = async (type) => {
$showQr = true;
if (type === types.lightning && !amount)
goto(`/${username}/receive`, { invalidateAll: true, noScroll: true });
else {
invoice.type = type;
- ({ id } = await post(`/invoice`, {
- invoice,
- user: { username, currency },
- }));
-
- goto(`/invoice/${id}?options=true`, {
- invalidateAll: true,
- noScroll: true,
- });
+ await update();
}
};
+ let newAmount = $state(0);
+ let settingAmount = $state();
+ let toggleAmount = $state(() => (settingAmount = !settingAmount));
+
let setAmount = async (e) => {
e.preventDefault();
e.stopPropagation();
@@ -93,23 +109,24 @@
invoice.amount = newAmount;
invoice.tip = 0;
- ({ id } = await post(`/invoice`, {
- invoice,
- user: { username, currency },
- }));
+ await update();
+ };
- let url = `./${id}`;
- if (subject?.prompt) url += "/tip";
- else url += "?options=true";
+ let setMemo = async (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ console.log("setting");
- goto(url, { invalidateAll: true, noScroll: true });
+ settingMemo = false;
+ invoice.memo = memo;
+ console.log("MEMO", invoice.memo);
+ await update();
};
- let newAmount = $state(0);
- let settingAmount = $state();
- let toggleAmount = $state(() => (settingAmount = !settingAmount));
+ let settingMemo = $state();
+ let toggleMemo = () => (settingMemo = !settingMemo);
+
let fiat = $state(true);
- let submit = $state();
let amountFiat = $derived(parseFloat(((amount * rate) / sats).toFixed(2)));
let tipAmount = $derived(((tip * rate) / sats).toFixed(2));
let link = $derived(
@@ -134,22 +151,23 @@
{tip}
{rate}
showQr={$showQr}
+ t={$t}
/>
<InvoiceActions
{toggleAmount}
+ {toggleMemo}
{user}
{invoice}
{copy}
{link}
{type}
- {types}
{txt}
t={$t}
bind:showQr={$showQr}
/>
- <InvoiceTypes {aid} {invoice} {user} {type} {types} {setType} t={$t} />
+ <InvoiceTypes {aid} {invoice} {user} {type} {setType} t={$t} />
</div>
<SetAmount
@@ -158,10 +176,11 @@
{currency}
{locale}
{rate}
- {submit}
{settingAmount}
{setAmount}
{toggleAmount}
amountPrompt={$amountPrompt}
t={$t}
/>
+
+<SetMemo bind:memo {settingMemo} {setMemo} {toggleMemo} t={$t} />
diff --git a/src/routes/(app)/invoice/[id]/memo/+page.server.ts b/src/routes/(app)/invoice/[id]/memo/+page.server.ts
index a2609658..d54ff30d 100644
--- a/src/routes/(app)/invoice/[id]/memo/+page.server.ts
+++ b/src/routes/(app)/invoice/[id]/memo/+page.server.ts
@@ -1,12 +1,4 @@
import invoice from "$lib/invoice";
-import { redirect } from "@sveltejs/kit";
-
-export async function load({ parent, params }) {
- const { invoice } = await parent();
- if (!invoice.amount) {
- redirect(307, `/invoice/${invoice.id}`);
- }
-}
export const actions = {
default: invoice,
diff --git a/src/routes/(app)/invoice/[id]/memo/+page.svelte b/src/routes/(app)/invoice/[id]/memo/+page.svelte
index 67283148..c8b1a429 100644
--- a/src/routes/(app)/invoice/[id]/memo/+page.svelte
+++ b/src/routes/(app)/invoice/[id]/memo/+page.svelte
@@ -26,8 +26,6 @@
tip,
user: { username, currency },
} = $derived(invoice);
-
- invoice.memo = user?.username;
</script>
<form
diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts
index 65665610..431310a3 100644
--- a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts
+++ b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts
@@ -33,6 +33,8 @@ export async function load({ cookies, params, parent }) {
auth(cookies),
);
+ const { balance } = await get(`/account/${user.id}`, auth(cookies));
+
redirect(307, `/invoice/${id}`);
}
diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte
index b22e3c1f..7e696b22 100644
--- a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte
+++ b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte
@@ -16,6 +16,14 @@
let initialAmount = form?.amount || data.amount;
let amount = $state(initialAmount);
let fiat = $state(!initialAmount);
+
+ let setMax = (e) => {
+ e.preventDefault();
+ fiat = false;
+ amount = user.balance;
+ console.log("OK YES", amount);
+ next.click();
+ };
</script>
{#if form?.message}
@@ -27,13 +35,22 @@
<div class="container px-4 mt-20 max-w-xl mx-auto space-y-2">
<Numpad bind:amount bind:fiat {currency} {locale} {rate} submit={next} />
- <form method="POST" use:enhance>
+ <form method="POST" use:enhance class="flex gap-2 justify-center">
<input name="amount" value={amount} type="hidden" />
<input name="rate" value={rate} type="hidden" />
<input name="username" value={subject.username} type="hidden" />
<input name="prompt" value={subject.prompt} type="hidden" />
- <button type="submit" bind:this={next} class="btn btn-accent">
+ {#if user?.balance}
+ <button
+ type="button"
+ class="btn !w-auto grow"
+ onclick={setMax}
+ onkeydown={setMax}>Max ⚡️{s(user.balance)}</button
+ >
+ {/if}
+
+ <button type="submit" bind:this={next} class="btn btn-accent !w-auto grow">
{$t("payments.next")}</button
>
</form>