aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/(app)/fund
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-11-10 21:33:49 -0800
committerAdam Soltys <[email protected]>2023-11-11 00:04:22 -0800
commitae87f1d43c6d2cf34bd2ea6fd7b4d28af6d2aa91 (patch)
tree694efda287338a3b81c5d7d41328c9f2e30e5218 /src/routes/(app)/fund
parentefdbc67c17fab67bf3cdce448a30aa82f62c5212 (diff)
downloadcoinos-ui-ae87f1d43c6d2cf34bd2ea6fd7b4d28af6d2aa91.tar.gz
coinos-ui-ae87f1d43c6d2cf34bd2ea6fd7b4d28af6d2aa91.zip
nav update
Diffstat (limited to 'src/routes/(app)/fund')
-rw-r--r--src/routes/(app)/fund/[id]/+page.server.js23
-rw-r--r--src/routes/(app)/fund/[id]/+page.svelte138
-rw-r--r--src/routes/(app)/fund/[id]/sweep/+page.server.js14
-rw-r--r--src/routes/(app)/fund/[id]/sweep/+page.svelte37
-rw-r--r--src/routes/(app)/fund/[id]/withdraw/+page.server.js20
-rw-r--r--src/routes/(app)/fund/[id]/withdraw/+page.svelte58
-rw-r--r--src/routes/(app)/fund/[id]/withdraw/+server.js6
7 files changed, 296 insertions, 0 deletions
diff --git a/src/routes/(app)/fund/[id]/+page.server.js b/src/routes/(app)/fund/[id]/+page.server.js
new file mode 100644
index 00000000..4194deed
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/+page.server.js
@@ -0,0 +1,23 @@
+import { error, redirect } from '@sveltejs/kit';
+import { auth, get, post } from '$lib/utils';
+import Qr from 'qrcode-base64';
+
+export let load = async ({ params: { id }, url }) => {
+ let { amount, payments } = await get(`/fund/${id}`);
+
+ let src = Qr.drawImg(url.href, { size: 300 });
+ return { amount, payments, src };
+};
+
+export const actions = {
+ default: async ({ cookies, locals, params, request }) => {
+ let { user } = locals;
+
+ if (user) {
+ await post('/redeem', params, auth(cookies));
+ throw redirect(307, `/${user.username}/payments`);
+ }
+
+ throw redirect(307, '/register');
+ }
+};
diff --git a/src/routes/(app)/fund/[id]/+page.svelte b/src/routes/(app)/fund/[id]/+page.svelte
new file mode 100644
index 00000000..d2d3079c
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/+page.svelte
@@ -0,0 +1,138 @@
+<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 { types, copy, f, s, sat, sats } from '$lib/utils';
+ import { loginRedirect } from '$lib/store';
+
+ export let data;
+
+ let { amount, src, payments, rates, user } = data;
+ let { id } = $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;
+
+ let show;
+ let toggle = () => (show = !show);
+</script>
+
+<div class="container px-4 max-w-4xl mx-auto mt-10 space-y-5">
+ <div class="flex justify-center items-center">
+ <div class="md:shadow-xl rounded-3xl md:px-10 pt-5 pb-10 space-y-5 w-full md:mx-5">
+ <div class="relative flex justify-center gap-2">
+ <!-- <p class="absolute right-0 top-1 underline"><Icon icon="settings" /></p> -->
+ {#if id.split('-').length === 4}
+ <h1 class="text-2xl md:text-3xl font-semibold my-auto">Card {id}</h1>
+ {:else}
+ <img src="/images/moneypot.jpg" class="w-24" alt="Fund" />
+ <div class="my-auto">
+ <h1 class="text-2xl font-semibold my-auto">{$t('payments.fund')}</h1>
+ <h1 class="text-secondary my-auto">{id}</h1>
+ </div>
+ {/if}
+ </div>
+ {#if show}
+ <img {src} class="mx-auto" alt={id} />
+ {/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>
+ <div class="flex gap-2" data-sveltekit-prefetch="off">
+ <div class="grow">
+ <a href={`/send/fund/${id}`}>
+ <button
+ class="rounded-full border py-3 px-2 font-bold hover:opacity-80 flex gap-1 w-full justify-center"
+ >
+ <Icon icon="plus" />
+ {$t('payments.addFunds')}
+ </button>
+ </a>
+ </div>
+ <div class="grow">
+ <a href={`/fund/${id}/withdraw`}>
+ <button
+ class="rounded-full border py-3 px-2 font-bold hover:opacity-80 flex gap-1 w-full justify-center"
+ >
+ <Icon icon="minus" style="rotate-180" />
+ {$t('payments.takeFunds')}
+ </button>
+ </a>
+ </div>
+ </div>
+ <div class="flex gap-2" data-sveltekit-prefetch="off">
+ <button
+ class="rounded-full border py-3 px-2 font-bold hover:opacity-80 flex gap-1 w-full justify-center"
+ on:click={toggle}
+ >
+ <Icon icon="qr" style="invert" />
+ {show ? $t('payments.hide') : $t('payments.show')} QR
+ </button>
+ <button
+ class="rounded-full border py-3 px-2 font-bold hover:opacity-80 flex gap-1 w-full justify-center"
+ on:click={() => copy($page.url.host + $page.url.pathname)}
+ >
+ <Icon icon="copy" style="w-6" />
+ {$t('payments.copyLink')}
+ </button>
+ </div>
+ <div class="text-base">
+ {#each payments as p}
+ <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" class:text-red-800={p.amount > 0}>
+ {f(Math.abs(p.amount) * (p.rate / sats), p.currency)}
+ {#if p.tip}
+ <span class="text-sm text-secondary">
+ +{Math.round((p.tip / Math.abs(p.amount)) * 100)}%
+ </span>
+ {/if}
+ </div>
+
+ <div class="text-secondary">
+ {sat(Math.abs(p.amount) + (p.tip || 0))}
+ </div>
+ </div>
+
+ <div class="flex my-auto">
+ <div class="flex">
+ <div class="my-auto">
+ <Avatar user={p.user} size={16} disabled={true} />
+ </div>
+ <div class="my-auto ml-1 text-secondary">{p.user.username}</div>
+ </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)/fund/[id]/sweep/+page.server.js b/src/routes/(app)/fund/[id]/sweep/+page.server.js
new file mode 100644
index 00000000..9fd244a3
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/sweep/+page.server.js
@@ -0,0 +1,14 @@
+import { get, auth, post } from '$lib/utils';
+import { redirect } from '@sveltejs/kit';
+
+export async function load({ cookies, params, parent }) {
+ let { user } = await parent();
+ let { id } = params;
+ let { amount } = await get(`/fund/${id}`);
+
+
+ if (!amount) throw redirect(307, `/fund/${id}`);
+ if (!user) throw redirect(307, `/register?redirect=/fund/${id}/sweep`);
+ await post('/take', { amount, id }, auth(cookies));
+ return { amount, id };
+}
diff --git a/src/routes/(app)/fund/[id]/sweep/+page.svelte b/src/routes/(app)/fund/[id]/sweep/+page.svelte
new file mode 100644
index 00000000..64bed4dd
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/sweep/+page.svelte
@@ -0,0 +1,37 @@
+<script>
+ import { scale } from 'svelte/transition';
+ import { fiat, f, s } from '$lib/utils';
+ import { Icon } from '$comp';
+ import { t } from '$lib/translations';
+
+ export let data;
+
+ let { amount, id, user, rates } = data;
+ let { currency } = user;
+ $: rate = rates[currency];
+</script>
+
+<div class="container px-4 max-w-xl mx-auto mt-10 space-y-5 text-center">
+ <div class="w-full flex">
+ <a href="/" class="mx-auto">
+ <Icon icon="logo" />
+ </a>
+ </div>
+
+ <div class="flex w-full py-5 max-w-[200px] mx-auto" in:scale={{ start: 0.5 }}>
+ <Icon icon="check" style="mx-auto" />
+ </div>
+ <h1 class="text-3xl md:text-4xl font-bold mb-6">{$t('payments.fundsClaimed')}</h1>
+ <h2 class="text-2xl md:text-3xl font-semibold">
+ {f(fiat(amount, rate), currency)}
+ </h2>
+ <h3 class="text-secondary md:text-lg mb-6 mt-1">
+ ⚡️{s(amount)}
+ </h3>
+</div>
+
+<a href={`/${user.username}/payments`}>
+ <div class="opacity-0 w-screen h-screen fixed top-0 left-0 z-50" />
+</a>
+
+<div class="fixed bottom-10 w-full text-center">{$t('payments.tapAnywhere')}</div>
diff --git a/src/routes/(app)/fund/[id]/withdraw/+page.server.js b/src/routes/(app)/fund/[id]/withdraw/+page.server.js
new file mode 100644
index 00000000..476149f2
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/withdraw/+page.server.js
@@ -0,0 +1,20 @@
+import { fail, json, redirect } from '@sveltejs/kit';
+import { fd, 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 = await fd(request);
+ try {
+ await post('/take', body, auth(cookies));
+ } catch (e) {
+ return fail(400, { message: e.message });
+ }
+
+ throw redirect(307, `/fund/${body.id}`);
+ }
+};
diff --git a/src/routes/(app)/fund/[id]/withdraw/+page.svelte b/src/routes/(app)/fund/[id]/withdraw/+page.svelte
new file mode 100644
index 00000000..9cad945a
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/withdraw/+page.svelte
@@ -0,0 +1,58 @@
+<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 { rates } = data;
+ let { amount, id } = $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;
+ };
+
+ $: rate = rates[currency];
+</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 bind:currency bind:rate {submit} />
+
+ <form method="POST" use:enhance on:submit={submit}>
+ <input name="id" value={id} 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)/fund/[id]/withdraw/+server.js b/src/routes/(app)/fund/[id]/withdraw/+server.js
new file mode 100644
index 00000000..0f9a23f3
--- /dev/null
+++ b/src/routes/(app)/fund/[id]/withdraw/+server.js
@@ -0,0 +1,6 @@
+import { json } from '@sveltejs/kit';
+import { auth, post } from '$lib/utils';
+
+export async function POST({ cookies, request }) {
+ return json(await post('/take', await request.json(), auth(cookies)));
+}