aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/AppHeader.svelte2
-rw-r--r--src/routes/(app)/+layout.server.js3
-rw-r--r--src/routes/(app)/[username]/+page.server.js2
-rw-r--r--src/routes/(app)/[username]/+page.svelte27
-rw-r--r--src/routes/(app)/[username]/dashboard/+page.svelte4
-rw-r--r--src/routes/(app)/dashboard/+server.js6
-rw-r--r--src/routes/(app)/redeem/[redeemcode]/+server.js12
-rw-r--r--src/routes/(app)/register/+page.server.js6
-rw-r--r--src/routes/(app)/send/[uuid=uuid]/+page.server.js1
-rw-r--r--src/routes/(app)/send/voucher/+page.server.js16
-rw-r--r--src/routes/(app)/send/voucher/+page.svelte53
-rw-r--r--src/routes/(app)/voucher/[code]/+page.server.js8
-rw-r--r--src/routes/(app)/voucher/[code]/+page.svelte49
-rw-r--r--src/service-worker.js12
14 files changed, 171 insertions, 30 deletions
diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte
index a76b1146..91786a2a 100644
--- a/src/components/AppHeader.svelte
+++ b/src/components/AppHeader.svelte
@@ -30,7 +30,7 @@
? `url(/api/public/${subject.username}-banner.webp)`
: undefined;
- $: $page && (showMenu = false);
+ $: $page && (showMenu = false);
</script>
<header
diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js
index 64ebc3e2..cf3deb88 100644
--- a/src/routes/(app)/+layout.server.js
+++ b/src/routes/(app)/+layout.server.js
@@ -25,8 +25,7 @@ export async function load({ cookies, locals, request, url, params }) {
try {
rate = await get('/rate');
rates = await get('/rates');
- } catch (e) {
- }
+ } catch (e) {}
return { subject, user, token, rate, rates };
}
diff --git a/src/routes/(app)/[username]/+page.server.js b/src/routes/(app)/[username]/+page.server.js
index 5186044b..27de60b5 100644
--- a/src/routes/(app)/[username]/+page.server.js
+++ b/src/routes/(app)/[username]/+page.server.js
@@ -2,6 +2,6 @@ import Qr from 'qrcode-base64';
export async function load({ params, url }) {
let text = `${params.username}@${url.hostname}`;
- let src = Qr.drawImg(text, { size: 300 });
+ let src = Qr.drawImg(text, { size: 300 });
return { src, text };
}
diff --git a/src/routes/(app)/[username]/+page.svelte b/src/routes/(app)/[username]/+page.svelte
index f2e18913..4edfaa38 100644
--- a/src/routes/(app)/[username]/+page.svelte
+++ b/src/routes/(app)/[username]/+page.svelte
@@ -44,12 +44,7 @@
</div>
<div class="space-y-5 mt-5 sm:mt-20 mx-auto max-w-lg">
- <img
- {src}
- class="w-[300px] mx-auto"
- on:click={() => copy(text)}
- alt="Lightning address"
- />
+ <img {src} class="w-[300px] mx-auto" on:click={() => copy(text)} alt="Lightning address" />
<div class="bg-primary font-semibold rounded-xl text-sm p-3 flex">
<div class="my-auto font-semibold text-lg w-full text-center">{text}</div>
@@ -58,14 +53,16 @@
</button>
</div>
- {#if user?.username === subject.username}
- <p class="text-secondary mb-1">
- This <a href="https://lightningaddress.com" class="underline" target="_blank" rel="noreferrer"
- >lightning address</a
- > is like an email for bitcoin. You can publish it on your website or business cards and use it multiple times.
- </p>
- {/if}
+ {#if user?.username === subject.username}
+ <p class="text-secondary mb-1">
+ This <a
+ href="https://lightningaddress.com"
+ class="underline"
+ target="_blank"
+ rel="noreferrer">lightning address</a
+ > is like an email for bitcoin. You can publish it on your website or business cards and use
+ it multiple times.
+ </p>
+ {/if}
</div>
-
-
</div>
diff --git a/src/routes/(app)/[username]/dashboard/+page.svelte b/src/routes/(app)/[username]/dashboard/+page.svelte
index 1cbebfc1..a042ddcb 100644
--- a/src/routes/(app)/[username]/dashboard/+page.svelte
+++ b/src/routes/(app)/[username]/dashboard/+page.svelte
@@ -82,9 +82,9 @@
>Deposit</button
>
</a>
- <a href={`/${user.username}/settings`}>
+ <a href={`/send/voucher`}>
<button class="rounded-full border py-2 px-5 font-bold hover:opacity-80 w-full"
- >Settings</button
+ >Voucher</button
>
</a>
</div>
diff --git a/src/routes/(app)/dashboard/+server.js b/src/routes/(app)/dashboard/+server.js
new file mode 100644
index 00000000..da001738
--- /dev/null
+++ b/src/routes/(app)/dashboard/+server.js
@@ -0,0 +1,6 @@
+import { redirect } from '@sveltejs/kit';
+export async function GET({ locals }) {
+ let { user } = locals;
+ if (user) throw redirect(307, `/${user.username}/dashboard`);
+ throw redirect(307, '/login');
+}
diff --git a/src/routes/(app)/redeem/[redeemcode]/+server.js b/src/routes/(app)/redeem/[redeemcode]/+server.js
new file mode 100644
index 00000000..c1990112
--- /dev/null
+++ b/src/routes/(app)/redeem/[redeemcode]/+server.js
@@ -0,0 +1,12 @@
+import { redirect } from '@sveltejs/kit';
+import { auth, post } from "$lib/utils";
+
+export async function GET({ cookies, locals, params }) {
+ let { user } = locals;
+ if (user) {
+ await post('/redeem', params, auth(cookies));
+ throw redirect(307, `/${user.username}/dashboard`);
+ }
+
+ throw redirect(307, '/login');
+}
diff --git a/src/routes/(app)/register/+page.server.js b/src/routes/(app)/register/+page.server.js
index 43fd5dbf..96fd3515 100644
--- a/src/routes/(app)/register/+page.server.js
+++ b/src/routes/(app)/register/+page.server.js
@@ -2,9 +2,9 @@ import { invalid, redirect } from '@sveltejs/kit';
import { post, login } from '$lib/utils';
export const load = async ({ parent }) => {
- let { user } = await parent();
- if (user) throw redirect(307, '/dashboard');
-}
+ let { user } = await parent();
+ if (user) throw redirect(307, '/dashboard');
+};
export const actions = {
default: async ({ cookies, request }) => {
diff --git a/src/routes/(app)/send/[uuid=uuid]/+page.server.js b/src/routes/(app)/send/[uuid=uuid]/+page.server.js
index cdf06e5c..63192b7a 100644
--- a/src/routes/(app)/send/[uuid=uuid]/+page.server.js
+++ b/src/routes/(app)/send/[uuid=uuid]/+page.server.js
@@ -3,6 +3,7 @@ import { btc as asset, auth, get, post } from '$lib/utils';
export async function load({ params, parent }) {
let { user } = await parent();
+
let { amount, address, tip, text, user: recipient } = await get(`/invoice/${params.uuid}`);
if (recipient.username === user.username) throw error(500, { message: 'Cannot send to self' });
if (tip) amount += tip;
diff --git a/src/routes/(app)/send/voucher/+page.server.js b/src/routes/(app)/send/voucher/+page.server.js
new file mode 100644
index 00000000..078d889e
--- /dev/null
+++ b/src/routes/(app)/send/voucher/+page.server.js
@@ -0,0 +1,16 @@
+import { invalid, redirect } from '@sveltejs/kit';
+import { auth, post } from '$lib/utils';
+
+export const actions = {
+ default: async ({ cookies, request }) => {
+ 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 });
+ }
+
+ throw redirect(307, `/voucher/${p.redeemcode}`);
+ }
+};
diff --git a/src/routes/(app)/send/voucher/+page.svelte b/src/routes/(app)/send/voucher/+page.svelte
new file mode 100644
index 00000000..2c54c4a6
--- /dev/null
+++ b/src/routes/(app)/send/voucher/+page.svelte
@@ -0,0 +1,53 @@
+<script>
+ 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 { address, amount } = $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="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}
+ Send
+ {/if}
+ </button>
+ </div>
+ </form>
+</div>
diff --git a/src/routes/(app)/voucher/[code]/+page.server.js b/src/routes/(app)/voucher/[code]/+page.server.js
new file mode 100644
index 00000000..89ce69ac
--- /dev/null
+++ b/src/routes/(app)/voucher/[code]/+page.server.js
@@ -0,0 +1,8 @@
+import { get } from '$lib/utils';
+import Qr from 'qrcode-base64';
+export let load = async ({ params: { code }, url }) => {
+ let payment = await get(`/payment/${code}`);
+
+ let src = Qr.drawImg(url.hostname, { size: 300 });
+ return { payment, src };
+};
diff --git a/src/routes/(app)/voucher/[code]/+page.svelte b/src/routes/(app)/voucher/[code]/+page.svelte
new file mode 100644
index 00000000..442d32ae
--- /dev/null
+++ b/src/routes/(app)/voucher/[code]/+page.svelte
@@ -0,0 +1,49 @@
+<script>
+ import { Icon } from '$comp';
+ import { toast } from '@zerodevx/svelte-toast';
+ import { t } from '$lib/translations';
+ import { copy, f, s, sat, sats } from '$lib/utils';
+ import { selectedRate } from '$lib/store';
+
+ export let data;
+ let { src } = data;
+ $: ({ amount, currency, rate, redeemcode, user } = 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">
+ <h1 class="text-3xl md:text-4xl font-bold">Voucher</h1>
+
+ <img {src} class="w-[300px] mx-auto cursor-pointer" on:click={() => copy(redeemcode)} alt="Redeem Code" />
+ <div>
+ <h2 class="text-2xl md:text-3xl font-semibold">
+ {f(amountFiat, currency)}
+ </h2>
+ <h3 class="text-secondary md:text-lg mb-6 mt-1">
+ {sat(amount)}
+ </h3>
+ </div>
+ <div class="mx-auto my-auto flex gap-2 justify-center">
+ <a href={`/redeem/${redeemcode}`}>
+ <button class="text-lg rounded-full border py-3 px-7 font-bold hover:opacity-80">
+ Redeem
+ </button>
+ </a>
+ <!-- <button class="text-lg rounded-full border py-3 px-7 font-bold hover:opacity-80"> -->
+ <!-- Top up -->
+ <!-- </button> -->
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/src/service-worker.js b/src/service-worker.js
index 7952231d..4fb470e9 100644
--- a/src/service-worker.js
+++ b/src/service-worker.js
@@ -1,7 +1,7 @@
-self.addEventListener('fetch', function(event) {
- event.respondWith(
- caches.match(event.request).then(function(response) {
- return response || fetch(event.request);
- })
- );
+self.addEventListener('fetch', function (event) {
+ event.respondWith(
+ caches.match(event.request).then(function (response) {
+ return response || fetch(event.request);
+ })
+ );
});