aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-18 19:44:27 -0800
committerAdam Soltys <[email protected]>2023-01-18 19:44:27 -0800
commit67c4af186fec0423664b18847921eb9696a1eeef (patch)
tree85e0fb00f3aa89fdde1cbb667bf801564bff7610 /src
parentb1ad12734eeafc36a07bd76f649a98ae9ade5723 (diff)
downloadcoinos-ui-67c4af186fec0423664b18847921eb9696a1eeef.tar.gz
coinos-ui-67c4af186fec0423664b18847921eb9696a1eeef.zip
pots
Diffstat (limited to 'src')
-rw-r--r--src/components/Event.svelte10
-rw-r--r--src/components/Feed.svelte4
-rw-r--r--src/components/RegisterOrLogin.svelte4
-rw-r--r--src/lib/invoice.js8
-rw-r--r--src/lib/socket.js5
-rw-r--r--src/locales/en.json8
-rw-r--r--src/routes/(app)/+layout.server.js4
-rw-r--r--src/routes/(app)/[username]/(profile)/event/[id]/+page.server.js3
-rw-r--r--src/routes/(app)/[username]/(profile)/event/[id]/+page.svelte6
-rw-r--r--src/routes/(app)/[username]/dashboard/+page.svelte2
-rw-r--r--src/routes/(app)/[username]/payments/[...page]/+page.svelte4
-rw-r--r--src/routes/(app)/invoice/+server.js5
-rw-r--r--src/routes/(app)/invoice/[hash]/+layout.server.js (renamed from src/routes/(app)/invoice/[id]/+layout.server.js)8
-rw-r--r--src/routes/(app)/invoice/[hash]/+layout.svelte (renamed from src/routes/(app)/invoice/[id]/+layout.svelte)0
-rw-r--r--src/routes/(app)/invoice/[hash]/+page.server.js (renamed from src/routes/(app)/invoice/[id]/+page.server.js)0
-rw-r--r--src/routes/(app)/invoice/[hash]/+page.svelte (renamed from src/routes/(app)/invoice/[id]/+page.svelte)0
-rw-r--r--src/routes/(app)/invoice/[hash]/paid/+page.svelte (renamed from src/routes/(app)/invoice/[id]/paid/+page.svelte)0
-rw-r--r--src/routes/(app)/invoice/[hash]/tip/+page.server.js (renamed from src/routes/(app)/invoice/[id]/tip/+page.server.js)0
-rw-r--r--src/routes/(app)/invoice/[hash]/tip/+page.svelte (renamed from src/routes/(app)/invoice/[id]/tip/+page.svelte)0
-rw-r--r--src/routes/(app)/login/+page.server.js2
-rw-r--r--src/routes/(app)/password/+server.js2
-rw-r--r--src/routes/(app)/pot/[name]/+page.server.js (renamed from src/routes/(app)/voucher/[redeemcode]/+page.server.js)7
-rw-r--r--src/routes/(app)/pot/[name]/+page.svelte96
-rw-r--r--src/routes/(app)/pot/[name]/withdraw/+page.server.js21
-rw-r--r--src/routes/(app)/pot/[name]/withdraw/+page.svelte (renamed from src/routes/(app)/send/voucher/+page.svelte)3
-rw-r--r--src/routes/(app)/register/+page.server.js6
-rw-r--r--src/routes/(app)/send/[...text]/+page.server.js6
-rw-r--r--src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js (renamed from src/routes/(app)/send/voucher/+page.server.js)5
-rw-r--r--src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte55
-rw-r--r--src/routes/(app)/send/user/[username]/[...amount]/+page.server.js2
-rw-r--r--src/routes/(app)/send/user/[username]/[...amount]/+page.svelte18
-rw-r--r--src/routes/(app)/sent/+page.server.js6
-rw-r--r--src/routes/(app)/sent/+page.svelte2
-rw-r--r--src/routes/(app)/tx/[id]/+page.server.js2
-rw-r--r--src/routes/(app)/tx/[id]/+page.svelte28
-rw-r--r--src/routes/(app)/voucher/[redeemcode]/+page.svelte77
36 files changed, 262 insertions, 147 deletions
diff --git a/src/components/Event.svelte b/src/components/Event.svelte
index 704a0636..68f44589 100644
--- a/src/components/Event.svelte
+++ b/src/components/Event.svelte
@@ -1,8 +1,8 @@
<script>
- import { Avatar, Icon } from "$comp";
- export let event;
+ import { Avatar, Icon } from '$comp';
+ export let event;
- let { id, user, seen, content } = event;
+ let { id, user, seen, content } = event;
let distance = (date) => {
let m = 60;
@@ -30,10 +30,10 @@
<a href={`/${user.pubkey}`}>
<div class="mb-auto mr-2">
<div class="md:hidden">
- <Avatar size={12} user={user} disabled={true} />
+ <Avatar size={12} {user} disabled={true} />
</div>
<div class="hidden md:block">
- <Avatar size={20} user={user} disabled={true} />
+ <Avatar size={20} {user} disabled={true} />
</div>
</div>
</a>
diff --git a/src/components/Feed.svelte b/src/components/Feed.svelte
index a552be67..ab757fa1 100644
--- a/src/components/Feed.svelte
+++ b/src/components/Feed.svelte
@@ -60,8 +60,8 @@
{#if browser}
{#if sorted.length}
<VirtualScroll data={sorted} key="id" let:data pageMode={true} estimateSize={200}>
- <a href={`/${data.user.pubkey}/event/${data.id}`}>
- <Event event={data} />
+ <a href={`/${data.user.pubkey}/event/${data.id}`}>
+ <Event event={data} />
</a>
</VirtualScroll>
{:else}
diff --git a/src/components/RegisterOrLogin.svelte b/src/components/RegisterOrLogin.svelte
index 23a045a0..7ac2fbb3 100644
--- a/src/components/RegisterOrLogin.svelte
+++ b/src/components/RegisterOrLogin.svelte
@@ -6,7 +6,7 @@
import { enhance } from '$app/forms';
import { Icon, Spinner } from '$comp';
import { focus } from '$lib/utils';
- import { password } from '$lib/store';
+ import { password, loginRedirect } from '$lib/store';
import { t } from '$lib/translations';
import { page } from '$app/stores';
import { generate } from '$lib/nostr';
@@ -114,6 +114,8 @@
{/if}
<form class="space-y-5" on:submit|preventDefault={handleSubmit} method="POST">
+ <input type="hidden" name="loginRedirect" value={$loginRedirect} />
+
<div>
<label for="username" class="font-semibold">{$t('login.username')}</label>
<input
diff --git a/src/lib/invoice.js b/src/lib/invoice.js
index c81b4061..fa29130e 100644
--- a/src/lib/invoice.js
+++ b/src/lib/invoice.js
@@ -19,19 +19,19 @@ export default async ({ cookies, request, url }) => {
let user = { username: form.get('username'), currency: form.get('currency') };
- let { id } = await post('/invoice', { invoice, user }, auth(cookies));
+ let { hash } = await post('/invoice', { invoice, user }, auth(cookies));
if (request_id) {
if (url.pathname.endsWith('tip')) {
- throw redirect(307, `/send/${id}`);
+ throw redirect(307, `/send/${hash}`);
}
throw redirect(307, `/${user.username}/request/${request_id}`);
}
if (invoice.prompt) {
- throw redirect(307, `/invoice/${id}/tip`);
+ throw redirect(307, `/invoice/${hash}/tip`);
} else {
- throw redirect(307, `/invoice/${id}`);
+ throw redirect(307, `/invoice/${hash}`);
}
};
diff --git a/src/lib/socket.js b/src/lib/socket.js
index 755c87e4..86083974 100644
--- a/src/lib/socket.js
+++ b/src/lib/socket.js
@@ -58,8 +58,7 @@ export const messages = (data) => ({
async payment() {
let { amount, invoice } = data;
-
- if (invoice) invalidate('app:invoice');
+ invalidate('app:invoice');
let payments = get(txns);
let i = payments.findIndex((p) => p.id === data.id);
@@ -118,5 +117,5 @@ function reconnectToWebsocket() {
if (currentReconnectDelay < maxReconnectDelay) {
currentReconnectDelay *= 2;
}
- connect();
+ connect(token);
}
diff --git a/src/locales/en.json b/src/locales/en.json
index 86504df5..b7f4c316 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -258,12 +258,12 @@
}
},
"payments": {
- "amount": "Amount",
- "date": "Date",
- "id": "Transaction ID",
+ "amount": "Amount",
+ "date": "Date",
+ "id": "Transaction ID",
"details": "Transaction Details",
"header": "Payments",
- "preimage": "Preimage",
+ "preimage": "Preimage",
"type": "Type",
"time": "Time",
"sent": "Sent",
diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js
index f69c914f..63a01df6 100644
--- a/src/routes/(app)/+layout.server.js
+++ b/src/routes/(app)/+layout.server.js
@@ -29,8 +29,8 @@ export async function load({ cookies, request, url, params }) {
rate = await get('/rate');
rates = await get('/rates');
} catch (e) {
- console.log(e)
- }
+ console.log(e);
+ }
return { user, token, rate, rates };
}
diff --git a/src/routes/(app)/[username]/(profile)/event/[id]/+page.server.js b/src/routes/(app)/[username]/(profile)/event/[id]/+page.server.js
index f31b4902..6182de17 100644
--- a/src/routes/(app)/[username]/(profile)/event/[id]/+page.server.js
+++ b/src/routes/(app)/[username]/(profile)/event/[id]/+page.server.js
@@ -5,9 +5,8 @@ export async function load({ params: { id } }) {
try {
let event = await get(`/event/${id}`);
if (!event) throw error(500, 'Event not found');
- return { event };
+ return { event };
} catch (e) {
throw error(500, e.message);
}
-
}
diff --git a/src/routes/(app)/[username]/(profile)/event/[id]/+page.svelte b/src/routes/(app)/[username]/(profile)/event/[id]/+page.svelte
index 1347947f..85fc815a 100644
--- a/src/routes/(app)/[username]/(profile)/event/[id]/+page.svelte
+++ b/src/routes/(app)/[username]/(profile)/event/[id]/+page.svelte
@@ -1,7 +1,7 @@
<script>
- import { Event } from "$comp";
- export let data;
- let { event } = data;
+ import { Event } from '$comp';
+ export let data;
+ let { event } = data;
</script>
<Event {event} />
diff --git a/src/routes/(app)/[username]/dashboard/+page.svelte b/src/routes/(app)/[username]/dashboard/+page.svelte
index 3779ab2f..314e3577 100644
--- a/src/routes/(app)/[username]/dashboard/+page.svelte
+++ b/src/routes/(app)/[username]/dashboard/+page.svelte
@@ -121,7 +121,7 @@
<!-- <div class="font-bold"> -->
<!-- {f(amount * (rate / sats), currency)} -->
<!-- </div> -->
- <!-- -->
+ <!-- -->
<!-- <div class="text-secondary">{sat(amount)}</div> -->
<!-- </div> -->
<!-- </div> -->
diff --git a/src/routes/(app)/[username]/payments/[...page]/+page.svelte b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
index 4348eb72..e37b3221 100644
--- a/src/routes/(app)/[username]/payments/[...page]/+page.svelte
+++ b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
@@ -163,10 +163,10 @@
<div class="text-secondary text-right text-sm my-auto">
<div>
- {format(new Date(tx.created_at), 'h:mm aaa')}
+ {format(new Date(tx.created), 'h:mm aaa')}
</div>
<div>
- {format(new Date(tx.created_at), 'MMM d')}
+ {format(new Date(tx.created), 'MMM d')}
</div>
</div>
</div>
diff --git a/src/routes/(app)/invoice/+server.js b/src/routes/(app)/invoice/+server.js
new file mode 100644
index 00000000..1321739e
--- /dev/null
+++ b/src/routes/(app)/invoice/+server.js
@@ -0,0 +1,5 @@
+import { auth, post } from '$lib/utils';
+import { json } from '@sveltejs/kit';
+
+export let POST = async ({ cookies: c, request: r }) =>
+ json(await post('/invoice', await r.json(), auth(c)));
diff --git a/src/routes/(app)/invoice/[id]/+layout.server.js b/src/routes/(app)/invoice/[hash]/+layout.server.js
index 78d8481e..61a479ab 100644
--- a/src/routes/(app)/invoice/[id]/+layout.server.js
+++ b/src/routes/(app)/invoice/[hash]/+layout.server.js
@@ -5,15 +5,15 @@ import { redirect } from '@sveltejs/kit';
export async function load({ depends, params, url }) {
depends('app:invoice');
- let { id } = params;
- let invoice = await get(`/invoice?id=${id}`);
+ let { hash } = params;
+ let invoice = await get(`/invoice?hash=${hash}`);
let { amount, received } = invoice;
amount = parseInt(amount);
let paid = (!amount && received) || (amount > 0 && received >= amount);
- if (paid && !url.pathname.endsWith('paid')) throw redirect(307, `/invoice/${id}/paid`);
+ if (paid && !url.pathname.endsWith('paid')) throw redirect(307, `/invoice/${hash}/paid`);
let sm = Qr.drawImg(invoice.text, { size: 300 });
- return { id, invoice, sm, lg: sm };
+ return { hash, invoice, sm, lg: sm };
}
diff --git a/src/routes/(app)/invoice/[id]/+layout.svelte b/src/routes/(app)/invoice/[hash]/+layout.svelte
index 4fa864ce..4fa864ce 100644
--- a/src/routes/(app)/invoice/[id]/+layout.svelte
+++ b/src/routes/(app)/invoice/[hash]/+layout.svelte
diff --git a/src/routes/(app)/invoice/[id]/+page.server.js b/src/routes/(app)/invoice/[hash]/+page.server.js
index 1068f273..1068f273 100644
--- a/src/routes/(app)/invoice/[id]/+page.server.js
+++ b/src/routes/(app)/invoice/[hash]/+page.server.js
diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[hash]/+page.svelte
index 28ff27c0..28ff27c0 100644
--- a/src/routes/(app)/invoice/[id]/+page.svelte
+++ b/src/routes/(app)/invoice/[hash]/+page.svelte
diff --git a/src/routes/(app)/invoice/[id]/paid/+page.svelte b/src/routes/(app)/invoice/[hash]/paid/+page.svelte
index 2ccbc971..2ccbc971 100644
--- a/src/routes/(app)/invoice/[id]/paid/+page.svelte
+++ b/src/routes/(app)/invoice/[hash]/paid/+page.svelte
diff --git a/src/routes/(app)/invoice/[id]/tip/+page.server.js b/src/routes/(app)/invoice/[hash]/tip/+page.server.js
index c78e5020..c78e5020 100644
--- a/src/routes/(app)/invoice/[id]/tip/+page.server.js
+++ b/src/routes/(app)/invoice/[hash]/tip/+page.server.js
diff --git a/src/routes/(app)/invoice/[id]/tip/+page.svelte b/src/routes/(app)/invoice/[hash]/tip/+page.svelte
index 308720ab..308720ab 100644
--- a/src/routes/(app)/invoice/[id]/tip/+page.svelte
+++ b/src/routes/(app)/invoice/[hash]/tip/+page.svelte
diff --git a/src/routes/(app)/login/+page.server.js b/src/routes/(app)/login/+page.server.js
index 873b68d4..4c3c0897 100644
--- a/src/routes/(app)/login/+page.server.js
+++ b/src/routes/(app)/login/+page.server.js
@@ -14,7 +14,7 @@ export const actions = {
try {
let r = await login(user, cookies);
- console.log("R", r)
+ console.log('R', r);
} catch (e) {
return invalid(400, { error: 'Login failed', message: e.message, ...form });
}
diff --git a/src/routes/(app)/password/+server.js b/src/routes/(app)/password/+server.js
index 9f2ab6b8..b4a81740 100644
--- a/src/routes/(app)/password/+server.js
+++ b/src/routes/(app)/password/+server.js
@@ -2,6 +2,6 @@ import { json } from '@sveltejs/kit';
import { auth, post } from '$lib/utils';
export async function POST({ cookies, request }) {
- let result = await post('/checkPassword', await request.json(), auth(cookies));
+ let result = await post('/password', await request.json(), auth(cookies));
return json(result);
}
diff --git a/src/routes/(app)/voucher/[redeemcode]/+page.server.js b/src/routes/(app)/pot/[name]/+page.server.js
index fbbec7bc..8f8b9d8f 100644
--- a/src/routes/(app)/voucher/[redeemcode]/+page.server.js
+++ b/src/routes/(app)/pot/[name]/+page.server.js
@@ -2,12 +2,11 @@ import { error, redirect } from '@sveltejs/kit';
import { auth, get, post } from '$lib/utils';
import Qr from 'qrcode-base64';
-export let load = async ({ params: { redeemcode }, url }) => {
- let payment = await get(`/voucher/${redeemcode}`);
- console.log(payment);
+export let load = async ({ params: { name }, url }) => {
+ let { amount, payments } = await get(`/pot/${name}`);
let src = Qr.drawImg(url.href, { size: 300 });
- return { payment, src };
+ return { amount, payments, src };
};
export const actions = {
diff --git a/src/routes/(app)/pot/[name]/+page.svelte b/src/routes/(app)/pot/[name]/+page.svelte
new file mode 100644
index 00000000..48dc9b31
--- /dev/null
+++ b/src/routes/(app)/pot/[name]/+page.svelte
@@ -0,0 +1,96 @@
+<script>
+ import { format } from 'date-fns';
+ import { enhance } from '$app/forms';
+ import { page } from '$app/stores';
+ import { Avatar, Icon } from '$comp';
+ import { toast } from '@zerodevx/svelte-toast';
+ import { t } from '$lib/translations';
+ import { copy, f, s, sat, sats } from '$lib/utils';
+ import { loginRedirect, selectedRate } from '$lib/store';
+
+ export let data;
+
+ let { amount, src, payments, rates, user } = data;
+ let { name } = $page.params;
+
+ toast.pop(0);
+
+ let currency = user ? user.currency : 'CAD';
+ let rate = rates[currency];
+
+ $: amountFiat = parseFloat(((amount * rate) / sats).toFixed(2));
+ $loginRedirect = $page.url.pathname;
+</script>
+
+<div class="container px-4 max-w-xl mx-auto mt-10 space-y-5">
+ <div class="w-full flex">
+ <a href="/" class="mx-auto">
+ <Icon icon="logo" />
+ </a>
+ </div>
+
+ <div class="flex justify-center items-center text-center">
+ <div class="shadow-xl rounded-3xl px-10 pt-5 pb-10 space-y-5 w-full mx-5">
+ <div class="relative">
+ <!-- <p class="absolute right-0 top-1 underline"><Icon icon="settings" /></p> -->
+ <h1 class="text-2xl md:text-3xl font-semibold">Public Pot</h1>
+ </div>
+ <p class="text-secondary">Anyone who knows the URL for this pot can add or take out funds</p>
+ <div class="flex justify-center gap-4">
+ <div class="my-auto">
+ <h2 class="text-2xl md:text-3xl font-semibold">
+ {f(amountFiat, currency)}
+ </h2>
+ <h3 class="text-secondary md:text-lg mt-1">
+ {sat(amount)}
+ </h3>
+ </div>
+ </div>
+ <div class="mx-auto my-auto flex gap-2 justify-center" data-sveltekit-prefetch="off">
+ <a href={`/send/pot/${name}`}>
+ <button class="text-lg rounded-full border py-3 px-7 font-bold hover:opacity-80">
+ Chip in
+ </button>
+ </a>
+ <a href={`/pot/${name}/withdraw`}>
+ <button class="text-lg rounded-full border py-3 px-7 font-bold hover:opacity-80">
+ Dip in
+ </button>
+ </a>
+ </div>
+ <div class="text-base">
+ {#each payments as p}
+ <a href={`/${p.user.username}`}>
+ <div class="flex h-24 hover:bg-gray-100 px-4">
+ <div class="flex grow">
+ <div class="flex my-auto">
+ <div class="my-auto">
+ <Avatar user={p.user} size={12} />
+ </div>
+ <div class="ml-1 text-secondary my-auto">
+ {p.user.username}
+ {p.amount > 0 ? 'took out' : 'threw in'}
+ </div>
+ </div>
+ <div class="text-secondary my-auto">
+ {sat(p.amount)}
+ </div>
+ </div>
+
+ <div class="text-secondary text-right text-sm my-auto">
+ <div>
+ {format(new Date(p.created), 'h:mm aaa')}
+ </div>
+ <div>
+ {format(new Date(p.created), 'MMM d')}
+ </div>
+ </div>
+ </div>
+ </a>
+ {:else}
+ <p class="text-secondary text-lg text-center">{$t('payments.empty')}</p>
+ {/each}
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/src/routes/(app)/pot/[name]/withdraw/+page.server.js b/src/routes/(app)/pot/[name]/withdraw/+page.server.js
new file mode 100644
index 00000000..6534e07b
--- /dev/null
+++ b/src/routes/(app)/pot/[name]/withdraw/+page.server.js
@@ -0,0 +1,21 @@
+import { invalid, redirect } from '@sveltejs/kit';
+import { auth, post } from '$lib/utils';
+
+export async function load({ parent }) {
+ let { user } = await parent();
+ if (!user) throw redirect(307, '/register');
+}
+
+export const actions = {
+ default: async ({ cookies, request }) => {
+ let body = Object.fromEntries(await request.formData());
+
+ try {
+ await post('/withdraw', body, auth(cookies));
+ } catch (e) {
+ return invalid(400, { message: e.message });
+ }
+
+ throw redirect(307, `/pot/${body.name}`);
+ }
+};
diff --git a/src/routes/(app)/send/voucher/+page.svelte b/src/routes/(app)/pot/[name]/withdraw/+page.svelte
index 0020adc3..bb11ddde 100644
--- a/src/routes/(app)/send/voucher/+page.svelte
+++ b/src/routes/(app)/pot/[name]/withdraw/+page.svelte
@@ -9,7 +9,7 @@
export let data;
export let form;
- let { address, amount } = $page.params;
+ let { amount, name } = $page.params;
let { currency } = data.user;
let loading;
@@ -35,6 +35,7 @@
<Numpad bind:amount {currency} />
<form method="POST" use:enhance on:submit={submit}>
+ <input name="name" value={name} type="hidden" />
<input name="amount" value={amount} type="hidden" />
<input name="pin" value={$pin} type="hidden" />
diff --git a/src/routes/(app)/register/+page.server.js b/src/routes/(app)/register/+page.server.js
index 793bd7f6..58b62ba2 100644
--- a/src/routes/(app)/register/+page.server.js
+++ b/src/routes/(app)/register/+page.server.js
@@ -9,10 +9,12 @@ export const load = async ({ parent }) => {
export const actions = {
default: async ({ cookies, request }) => {
let form = Object.fromEntries(await request.formData());
- let { username, password, cipher, salt, pubkey } = form;
+ let { username, password, cipher, salt, pubkey, loginRedirect } = form;
let user = { username, password, cipher, salt, pubkey };
let error;
+ console.log('LR', loginRedirect);
+
try {
await post('/register', { user });
} catch (e) {
@@ -27,6 +29,6 @@ export const actions = {
}
if (error) return invalid(400, { error });
- throw redirect(307, `/${user.username}/dashboard`);
+ throw redirect(307, loginRedirect || `/${user.username}/dashboard`);
}
};
diff --git a/src/routes/(app)/send/[...text]/+page.server.js b/src/routes/(app)/send/[...text]/+page.server.js
index eab57d64..f0c8b892 100644
--- a/src/routes/(app)/send/[...text]/+page.server.js
+++ b/src/routes/(app)/send/[...text]/+page.server.js
@@ -73,8 +73,8 @@ export async function load({ cookies, params, request, url }) {
export const actions = {
default: async ({ request, url }) => {
const form = await request.formData();
- await parse(form.get('text'), url.host);
-
- return invalid(403, { error: 'Does not compute, try again' });
+ let t = form.get('text');
+ await parse(t, url.host);
+ throw redirect(307, `/send/pot/${t}`);
}
};
diff --git a/src/routes/(app)/send/voucher/+page.server.js b/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js
index d479c76a..f25fcb6d 100644
--- a/src/routes/(app)/send/voucher/+page.server.js
+++ b/src/routes/(app)/send/pot/[name]/[...amount]/+page.server.js
@@ -3,14 +3,15 @@ import { auth, post } from '$lib/utils';
export const actions = {
default: async ({ cookies, request }) => {
+ let body = Object.fromEntries(await request.formData());
let p;
+
try {
- let body = Object.fromEntries(await request.formData());
p = await post('/send', body, auth(cookies));
} catch (e) {
return invalid(400, { message: e.message });
}
- if (p) throw redirect(307, `/voucher/${p.redeemcode}`);
+ if (p) throw redirect(307, `/pot/${body.name}`);
}
};
diff --git a/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte b/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte
new file mode 100644
index 00000000..bb11ddde
--- /dev/null
+++ b/src/routes/(app)/send/pot/[name]/[...amount]/+page.svelte
@@ -0,0 +1,55 @@
+<script>
+ import { t } from '$lib/translations';
+ import { enhance } from '$app/forms';
+ import { Icon, Numpad, Spinner } from '$comp';
+ import { page } from '$app/stores';
+ import { back } from '$lib/utils';
+ import { pin } from '$lib/store';
+
+ export let data;
+ export let form;
+
+ let { amount, name } = $page.params;
+ let { currency } = data.user;
+ let loading;
+
+ let submit = () => (loading = true);
+ $: update(form);
+ let update = () => {
+ if (form?.message.includes('pin')) $pin = undefined;
+ loading = false;
+ };
+</script>
+
+<button class="ml-5 md:ml-20 mt-5 md:mt-10 hover:opacity-80" on:click={back}>
+ <Icon icon="arrow-left" style="w-10" />
+</button>
+
+{#if form?.message}
+ <div class="text-red-600 text-center">
+ {form.message}
+ </div>
+{/if}
+
+<div class="container px-4 mt-20 max-w-xl mx-auto">
+ <Numpad bind:amount {currency} />
+
+ <form method="POST" use:enhance on:submit={submit}>
+ <input name="name" value={name} type="hidden" />
+ <input name="amount" value={amount} type="hidden" />
+ <input name="pin" value={$pin} type="hidden" />
+
+ <div class="flex w-full">
+ <button
+ type="submit"
+ class="opacity-100 hover:opacity-80'} rounded-2xl border py-3 font-bold mx-auto mt-2 bg-black text-white px-4 w-24"
+ >
+ {#if loading}
+ <Spinner />
+ {:else}
+ {$t('payments.send')}
+ {/if}
+ </button>
+ </div>
+ </form>
+</div>
diff --git a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
index a659eef3..e670320c 100644
--- a/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/user/[username]/[...amount]/+page.server.js
@@ -14,6 +14,7 @@ export const actions = {
try {
let body = Object.fromEntries(await request.formData());
let { amount, confirmed } = body;
+ amount = parseInt(amount);
if (!confirmed) {
return invalid(403, { amount, confirm: true });
@@ -21,6 +22,7 @@ export const actions = {
await post('/send', body, auth(cookies));
} catch (e) {
+ console.log(e);
return invalid(400, { message: e.message });
}
diff --git a/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte b/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
index 4cb8cfce..07e29f44 100644
--- a/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
+++ b/src/routes/(app)/send/user/[username]/[...amount]/+page.svelte
@@ -5,23 +5,32 @@
import { enhance } from '$app/forms';
import { Avatar, Icon, Numpad, Spinner } from '$comp';
import { page } from '$app/stores';
- import { back, f, s, sats } from '$lib/utils';
+ import { back, f, post, s, sats } from '$lib/utils';
export let data;
export let form;
- let { recipient, user } = data;
+ let { recipient, rates, user } = data;
let currency = user?.currency || 'USD';
let amount = form?.amount || data.amount;
let a,
af,
amountFiat = amount * ($selectedRate / sats),
- fiat = !amount;
+ fiat = !amount,
+ hash;
- let setAmount = () => {
+ let setAmount = async () => {
amount = a;
amountFiat = af;
+
+ ({ hash } = await post('/invoice', {
+ invoice: {
+ amount,
+ rate: rates[recipient.currency]
+ },
+ user: recipient
+ }));
};
let handleBack = () => {
@@ -77,6 +86,7 @@
<input name="username" value={recipient.username} type="hidden" />
<input name="confirmed" value={form?.confirm} type="hidden" />
<input name="pin" value={$pin} type="hidden" />
+ <input name="hash" value={hash} type="hidden" />
<div class="flex w-full">
{#if amount}
diff --git a/src/routes/(app)/sent/+page.server.js b/src/routes/(app)/sent/+page.server.js
index fb35e367..381ff32f 100644
--- a/src/routes/(app)/sent/+page.server.js
+++ b/src/routes/(app)/sent/+page.server.js
@@ -1,6 +1,6 @@
import { get, auth } from '$lib/utils';
export let load = async ({ cookies }) => {
- let { payments } = await get('/payments', auth(cookies));
- return { payments }
-}
+ let { payments } = await get('/payments', auth(cookies));
+ return { payments };
+};
diff --git a/src/routes/(app)/sent/+page.svelte b/src/routes/(app)/sent/+page.svelte
index 2168a517..79a0aa6e 100644
--- a/src/routes/(app)/sent/+page.svelte
+++ b/src/routes/(app)/sent/+page.svelte
@@ -8,7 +8,7 @@
export let data;
let { payments, user } = data;
- let payment = payments[0]
+ let payment = payments[0];
let { amount, rate } = payment;
amount = Math.abs(amount);
diff --git a/src/routes/(app)/tx/[id]/+page.server.js b/src/routes/(app)/tx/[id]/+page.server.js
index 7db5d4f1..cbd7355e 100644
--- a/src/routes/(app)/tx/[id]/+page.server.js
+++ b/src/routes/(app)/tx/[id]/+page.server.js
@@ -2,5 +2,5 @@ import { auth, get } from '$lib/utils';
export async function load({ cookies, params }) {
let tx = await get(`/payments/${params.id}`, auth(cookies));
- return { tx };
+ return { tx };
}
diff --git a/src/routes/(app)/tx/[id]/+page.svelte b/src/routes/(app)/tx/[id]/+page.svelte
index 63e45f17..a2bb1459 100644
--- a/src/routes/(app)/tx/[id]/+page.svelte
+++ b/src/routes/(app)/tx/[id]/+page.svelte
@@ -2,13 +2,15 @@
import { t } from '$lib/translations';
import { back, copy, f, s, sats } from '$lib/utils';
import { Avatar, Icon } from '$comp';
- import { format, parseISO } from 'date-fns';
+ import { format } from 'date-fns';
import { PUBLIC_EXPLORER as expl } from '$env/static/public';
export let data;
let { user, tx } = data;
let { username } = user;
- let { amount, hash, createdAt, rate, network, preimage, fee, currency } = tx;
+ let { amount, hash, created, rate, type, preimage, fee, currency } = tx;
+ fee = fee || 0;
+
let fiat = (Math.abs(amount) * rate) / sats;
</script>
@@ -32,12 +34,12 @@
<div>
<div class="font-bold">{$t('payments.date')}</div>
<div>
- {format(parseISO(createdAt), 'MMMM d')},
- {format(parseISO(createdAt), 'h:mm aaa')}
+ {format(new Date(created), 'MMMM d')},
+ {format(new Date(created), 'h:mm aaa')}
</div>
</div>
- {#if network === 'lightning'}
+ {#if type === 'lightning'}
<div>
<div class="font-bold">{$t('payments.preimage')}</div>
<div>
@@ -47,16 +49,14 @@
{:else}
<div>
<div class="font-bold">{$t('payments.id')}</div>
- <div class="flex">
- <div>
- <a href={`${expl}/tx/${hash}`} target="_blank" class="text-blue-600">{hash}</a>
+ <div class="flex">
+ <div>
+ <a href={`${expl}/tx/${hash}`} target="_blank" class="text-blue-600">{hash}</a>
+ </div>
+ <button class="flex font-bold hover:opacity-80 mb-auto" on:click={() => copy(hash)}
+ ><Icon icon="copy" style="mr-1" />
+ </button>
</div>
- <button
- class="flex font-bold hover:opacity-80 mb-auto"
- on:click={() => copy(hash)}
- ><Icon icon="copy" style="mr-1" />
- </button>
- </div>
</div>
{/if}
</div>
diff --git a/src/routes/(app)/voucher/[redeemcode]/+page.svelte b/src/routes/(app)/voucher/[redeemcode]/+page.svelte
deleted file mode 100644
index 9af67498..00000000
--- a/src/routes/(app)/voucher/[redeemcode]/+page.svelte
+++ /dev/null
@@ -1,77 +0,0 @@
-<script>
- import { enhance } from '$app/forms';
- import { page } from '$app/stores';
- import { Avatar, Icon } from '$comp';
- import { toast } from '@zerodevx/svelte-toast';
- import { t } from '$lib/translations';
- import { copy, f, s, sat, sats } from '$lib/utils';
- import { loginRedirect, selectedRate } from '$lib/store';
-
- export let data;
- let { src } = data;
- $: ({ amount, currency, rate, redeemed, redeemcode, user, redeemer } = data.payment);
-
- toast.pop(0);
-
- $: amountFiat = parseFloat(((-amount * rate) / sats).toFixed(2));
-</script>
-
-<div class="container px-4 max-w-lg mx-auto mt-10 space-y-5">
- <div class="w-full flex">
- <a href="/" class="mx-auto">
- <Icon icon="logo" />
- </a>
- </div>
-
- <div class="flex justify-center items-center text-center">
- <div class="shadow-xl rounded-3xl px-10 pt-5 pb-10 space-y-5 w-full mx-5">
- {#if !redeemed}
- <img
- {src}
- class="w-[300px] mx-auto cursor-pointer"
- on:click={() => copy(redeemcode)}
- alt="Redeem Code"
- />
- {/if}
- <div class="flex justify-center gap-4">
- <div class="my-auto">
- <h2 class="text-2xl md:text-3xl font-semibold">
- {f(amountFiat, currency)}
- </h2>
- <h3 class="text-secondary md:text-lg mt-1">
- {sat(amount)}
- </h3>
- </div>
- <div class="my-auto">{$t('transactions.from')}</div>
- <div class="flex">
- <Avatar {user} size={20} />
- <div class="my-auto">{user.username}</div>
- </div>
- </div>
- <div class="mx-auto my-auto flex gap-2 justify-center" data-sveltekit-prefetch="off">
- {#if redeemer}
- <div class="my-auto">{$t('transactions.redeemedBy')}</div>
- <div class="flex">
- <Avatar user={redeemer} size={20} />
- <div class="my-auto">{redeemer.username}</div>
- </div>
- {:else}
- <form
- method="POST"
- use:enhance
- on:submit={() => ($loginRedirect = `/redeem/${redeemcode}`)}
- >
- <button
- type="submit"
- class="text-lg rounded-full border py-3 px-7 font-bold hover:opacity-80"
- class:bg-gray-200={redeemed}
- disabled={$loginRedirect || redeemed}
- >
- {redeemed ? $t('transactions.redeemed') : $t('transactions.redeem')}
- </button>
- </form>
- {/if}
- </div>
- </div>
- </div>
-</div>