aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-24 09:53:40 -0800
committerAdam Soltys <[email protected]>2023-01-24 09:53:40 -0800
commitc8b250bc216b190e913fab27d599b40518d7e748 (patch)
tree191e56d4d6671c9e24f7db9a7c268461a76bb11d /src
parent29ed3a4366eb9719d32dac390764bf119c40afff (diff)
downloadcoinos-ui-c8b250bc216b190e913fab27d599b40518d7e748.tar.gz
coinos-ui-c8b250bc216b190e913fab27d599b40518d7e748.zip
lnurl pay
Diffstat (limited to 'src')
-rw-r--r--src/lib/utils.js9
-rw-r--r--src/routes/(app)/+layout.server.js4
-rw-r--r--src/routes/(app)/[username]/payments/[...page]/+page.svelte2
-rw-r--r--src/routes/(app)/ln/[lnurl]/+page.server.js27
-rw-r--r--src/routes/(app)/ln/[lnurl]/+page.svelte15
-rw-r--r--src/routes/(app)/payment/[id]/+page.svelte4
-rw-r--r--src/routes/(app)/send/[...text]/+page.server.js15
-rw-r--r--src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js8
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.server.js2
-rw-r--r--src/routes/(app)/send/lightning/[payreq]/+page.svelte36
10 files changed, 73 insertions, 49 deletions
diff --git a/src/lib/utils.js b/src/lib/utils.js
index f2d78ee8..179aecc6 100644
--- a/src/lib/utils.js
+++ b/src/lib/utils.js
@@ -82,14 +82,7 @@ export function reverseFormat(val, locale) {
return Number.isNaN(reversedVal) ? 0 : +reversedVal;
}
-export let protectedRoutes = [
- /customers/,
- /dashboard/,
- /settings/,
- /payments/,
- /\/ln\//,
- /request/
-];
+export let protectedRoutes = [/customers/, /dashboard/, /settings/, /payments/, /request/];
export const success = (m) => {
toast.pop();
diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js
index 63a01df6..0b76c973 100644
--- a/src/routes/(app)/+layout.server.js
+++ b/src/routes/(app)/+layout.server.js
@@ -15,8 +15,10 @@ export async function load({ cookies, request, url, params }) {
} catch (e) {}
}
- if (user && ['/', '/login', '/register'].includes(pathname) && request.method === 'GET')
+ if (user && ['/', '/login', '/register'].includes(pathname) && request.method === 'GET') {
+ console.log('dashboarding', pathname);
throw redirect(307, `/${user.username}/dashboard`);
+ }
if (
protectedRoutes.find((p) => pathname.match(p)) &&
diff --git a/src/routes/(app)/[username]/payments/[...page]/+page.svelte b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
index e28ade67..620aec84 100644
--- a/src/routes/(app)/[username]/payments/[...page]/+page.svelte
+++ b/src/routes/(app)/[username]/payments/[...page]/+page.svelte
@@ -112,7 +112,7 @@
<div class="text-base">
{#each $payments as p}
- <a href={`/payment/${p.id}`}>
+ <a href={`/payment/${p.id}`}>
<div class="grid grid-cols-3 border-b h-24 hover:bg-gray-100 px-4">
<div class="whitespace-nowrap my-auto">
<div class="font-bold">
diff --git a/src/routes/(app)/ln/[lnurl]/+page.server.js b/src/routes/(app)/ln/[lnurl]/+page.server.js
index bb731e84..ded2e58c 100644
--- a/src/routes/(app)/ln/[lnurl]/+page.server.js
+++ b/src/routes/(app)/ln/[lnurl]/+page.server.js
@@ -1,23 +1,30 @@
import { auth, get, post } from '$lib/utils';
-import { error, redirect } from '@sveltejs/kit';
+import { error, invalid, redirect } from '@sveltejs/kit';
export async function load({ params }) {
try {
let { lnurl } = params;
- lnurl = await get(`/decode?text=${lnurl}`);
- if (lnurl.tag !== 'payRequest') throw error(500, 'We can only handle lnurl pay requests');
-
- return lnurl;
+ let data = await get(`/decode?text=${lnurl}`);
+ if (data.tag !== 'payRequest') throw error(500, 'We can only handle lnurl pay requests');
+ return data;
} catch (e) {
throw error(500, e.message);
}
}
export const actions = {
- default: async ({ cookies, request }) => {
- let { callback, ...form } = Object.fromEntries(await request.formData());
- form.params = { callback };
- await post('/pay', form, auth(cookies));
- throw redirect(307, '/sent');
+ default: async ({ cookies, fetch, request }) => {
+ let error;
+
+ let { callback, amount, minSendable, maxSendable } = Object.fromEntries(
+ await request.formData()
+ );
+
+ if (amount < minSendable) error = `Amount must be at least ${minSendable} sats`;
+ if (amount > maxSendable) error = `Amount must be at most ${maxSendable} sats`;
+ if (error) return invalid(400, { error });
+
+ let { pr } = await fetch(`${callback}?amount=${amount}`).then((r) => r.json());
+ throw redirect(307, `/send/lightning/${pr}`);
}
};
diff --git a/src/routes/(app)/ln/[lnurl]/+page.svelte b/src/routes/(app)/ln/[lnurl]/+page.svelte
index 15edeaef..297ac35a 100644
--- a/src/routes/(app)/ln/[lnurl]/+page.svelte
+++ b/src/routes/(app)/ln/[lnurl]/+page.svelte
@@ -4,10 +4,12 @@
import { Numpad, Spinner } from '$comp';
import { pin } from '$lib/store';
- export let data;
+ export let data, form;
let { currency } = data.user;
let { minSendable, maxSendable, callback, metadata } = data;
- let amount, loading;
+
+ let amount = minSendable,
+ loading;
let submit = () => (loading = true);
</script>
@@ -24,10 +26,19 @@
</div>
{/each}
</div>
+
+ {#if form?.error}
+ <div class="text-red-600 text-center mb-5">
+ {form.error}
+ </div>
+ {/if}
+
<Numpad bind:amount {currency} />
<form method="POST" use:enhance on:submit={submit}>
<input name="amount" value={amount} type="hidden" />
+ <input name="minSendable" value={minSendable} type="hidden" />
+ <input name="maxSendable" value={maxSendable} type="hidden" />
<input name="callback" value={callback} type="hidden" />
<input name="pin" value={$pin} type="hidden" />
diff --git a/src/routes/(app)/payment/[id]/+page.svelte b/src/routes/(app)/payment/[id]/+page.svelte
index 9c0afaac..5a604d99 100644
--- a/src/routes/(app)/payment/[id]/+page.svelte
+++ b/src/routes/(app)/payment/[id]/+page.svelte
@@ -8,7 +8,7 @@
export let data;
let { user, tx } = data;
let { username } = user;
- let { id, amount, hash, created, rate, type, preimage, fee, currency } = tx;
+ let { id, amount, hash, created, rate, type, ref, fee, currency } = tx;
fee = fee || 0;
let fiat = (Math.abs(amount) * rate) / sats;
@@ -43,7 +43,7 @@
<div>
<div class="font-bold">{$t('payments.preimage')}</div>
<div>
- {preimage}
+ {ref}
</div>
</div>
{:else}
diff --git a/src/routes/(app)/send/[...text]/+page.server.js b/src/routes/(app)/send/[...text]/+page.server.js
index f0c8b892..3cc9f73d 100644
--- a/src/routes/(app)/send/[...text]/+page.server.js
+++ b/src/routes/(app)/send/[...text]/+page.server.js
@@ -15,20 +15,17 @@ let parse = async (t, host) => {
options: { amount }
} = bip21.decode(t));
- // ln address
if (t.includes('@') && t.includes('.')) {
- let [name, domain] = t.split('@');
- if (domain === host) t = name;
- else {
- try {
- t = await get(`/encode?domain=${domain}&name=${name}`);
- } catch (e) {}
- }
+ try {
+ t = await get(`/encode?address=${t}`);
+ } catch (e) {}
}
- if (t.includes('/voucher')) throw redirect(307, t.substring(t.indexOf('/voucher')));
+ if (t.includes('/pot')) throw redirect(307, t.substring(t.indexOf('/pot')));
+ console.log('LNURL?');
if (t.toLowerCase().startsWith('lnurl')) throw redirect(307, `/ln/${t}`);
+ console.log('NOPE');
if (t.includes(':')) t = t.split(':')[1];
// lightning
diff --git a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
index 066043e7..901d90a8 100644
--- a/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
+++ b/src/routes/(app)/send/bitcoin/[address]/[...amount]/+page.server.js
@@ -4,9 +4,13 @@ import { auth, post } from '$lib/utils';
export const actions = {
default: async ({ cookies, request }) => {
try {
- let feeRate, subtract;
+ let feeRate, subtract;
let { address, amount, pin } = Object.fromEntries(await request.formData());
- let { tx } = await post('/bitcoin/fee', { address, amount, feeRate, subtract }, auth(cookies));
+ let { tx } = await post(
+ '/bitcoin/fee',
+ { address, amount, feeRate, subtract },
+ auth(cookies)
+ );
await post('/bitcoin/send', { pin, tx }, auth(cookies));
} catch (e) {
return invalid(400, { message: e.message });
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.server.js b/src/routes/(app)/send/lightning/[payreq]/+page.server.js
index a72e1c07..def7651c 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.server.js
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.server.js
@@ -15,7 +15,7 @@ export const actions = {
let body = Object.fromEntries(await request.formData());
let { amount, confirmed } = body;
- console.log("AMOUNT", amount);
+ console.log('AMOUNT', amount);
if (!confirmed) {
return invalid(403, { amount, confirm: true });
diff --git a/src/routes/(app)/send/lightning/[payreq]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
index 76ab432f..a88a0aec 100644
--- a/src/routes/(app)/send/lightning/[payreq]/+page.svelte
+++ b/src/routes/(app)/send/lightning/[payreq]/+page.svelte
@@ -24,6 +24,9 @@
if (form?.message?.includes('pin')) $pin = undefined;
loading = false;
};
+
+ let show;
+ let toggle = () => (show = !show);
</script>
<button class="ml-5 md:ml-20 mt-5 md:mt-10 hover:opacity-80" on:click={back}>
@@ -41,10 +44,10 @@
<div class="text-center mb-8">
<h1 class="text-xl md:text-2xl text-secondary mb-2">{$t('payments.send')}</h1>
<p class="text-6xl break-words mb-4">
- {s(amount)} <span class="text-xl md:text-2xl text-secondary">sats</span>
+ ⚡️{s(amount)}
</p>
<h1 class="text-xl md:text-2xl text-secondary mb-2">{$t('payments.to')}</h1>
- <p class="text-6xl break-words">{alias}</p>
+ <p class="text-4xl break-words">{alias}</p>
</div>
<form method="POST" use:enhance on:submit={submit} action="?/send" class="space-y-5">
@@ -52,17 +55,7 @@
<input name="amount" value={amount} type="hidden" />
<input name="confirmed" value={form?.confirm} type="hidden" />
<input name="pin" value={$pin} type="hidden" />
-
- <div class="relative w-96 mx-auto">
- <label>Max fee</label>
- <input name="maxfee" value={maxfee} />
-
- <div
- class="absolute right-[2px] top-[25px] text-gray-600 rounded-r-2xl p-4 h-[54px] my-auto border-l "
- >
- sats
- </div>
- </div>
+ <input name="maxfee" value={maxfee} type="hidden" />
<div class="flex w-full">
<button
@@ -78,6 +71,23 @@
</button>
</div>
</form>
+
+ {#if show}
+ <div class="relative w-96 mx-auto">
+ <label>Max fee</label>
+ <input name="maxfee" value={maxfee} />
+
+ <div
+ class="absolute right-[2px] top-[25px] text-gray-600 rounded-r-2xl p-4 h-[54px] my-auto border-l "
+ >
+ ⚡️
+ </div>
+ </div>
+ {:else}
+ <div class="flex w-full mt-5">
+ <button class="mx-auto" on:click={toggle}>Settings</button>
+ </div>
+ {/if}
{:else}
<form method="POST" action="?/setAmount" class="w-[300px] mx-auto">
<input type="hidden" value={a} name="amount" />