diff options
| author | Adam Soltys <[email protected]> | 2022-10-06 00:13:16 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2022-10-06 00:13:16 -0700 |
| commit | bf70219a4753d31a201ffc10e0c378a512adb721 (patch) | |
| tree | 699d86a205d204e5abadae3c62362e2ff286b299 /src | |
| parent | 5b24ffae2d402fbbff78f53727ca87f5cfe75618 (diff) | |
| download | coinos-ui-bf70219a4753d31a201ffc10e0c378a512adb721.tar.gz coinos-ui-bf70219a4753d31a201ffc10e0c378a512adb721.zip | |
send route can take a parameter
Diffstat (limited to 'src')
| -rw-r--r-- | src/components/AppHeader.svelte | 3 | ||||
| -rw-r--r-- | src/routes/+layout.svelte | 2 | ||||
| -rw-r--r-- | src/routes/[username]/+page.svelte | 75 | ||||
| -rw-r--r-- | src/routes/[username]/bitcoin/+page.server.js | 4 | ||||
| -rw-r--r-- | src/routes/[username]/bitcoin/+page.svelte | 0 | ||||
| -rw-r--r-- | src/routes/[username]/settings/+page.svelte | 2 | ||||
| -rw-r--r-- | src/routes/[username]/settings/_account.svelte | 3 | ||||
| -rw-r--r-- | src/routes/[username]/transactions/[...page]/+page.svelte | 19 | ||||
| -rw-r--r-- | src/routes/scan/+page.svelte | 4 | ||||
| -rw-r--r-- | src/routes/send/+page.server.js | 47 | ||||
| -rw-r--r-- | src/routes/send/[...text]/+page.server.js | 55 | ||||
| -rw-r--r-- | src/routes/send/[...text]/+page.svelte (renamed from src/routes/send/+page.svelte) | 0 | ||||
| -rw-r--r-- | src/routes/send/lightning/[payreq]/+page.svelte | 2 | ||||
| -rw-r--r-- | src/routes/send/user/[username]/+page.svelte | 2 |
14 files changed, 127 insertions, 91 deletions
diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte index a21c4ecd..94bd9b1a 100644 --- a/src/components/AppHeader.svelte +++ b/src/components/AppHeader.svelte @@ -13,9 +13,6 @@ $: update(data); let update = (data) => ({ subject, user } = data); - $: updateUser(user); - let updateUser = () => console.log('USER', user); - const menuButtons = [ { stringID: 'nav.dashboard', icon: 'dash', goto: 'dashboard' }, { stringID: 'nav.settings', icon: 'settings', goto: 'settings' }, diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index a07d2fb1..c86b0eb5 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -35,7 +35,9 @@ <SvelteToast options={{ reversed: true, intro: { y: 192 } }} /> +<main data-sveltekit-prefetch> <slot /> +</main> <style global> :root { diff --git a/src/routes/[username]/+page.svelte b/src/routes/[username]/+page.svelte index 48039c7b..27553192 100644 --- a/src/routes/[username]/+page.svelte +++ b/src/routes/[username]/+page.svelte @@ -36,43 +36,54 @@ let followed = false; </script> -<div class="flex xl:block justify-center items-center my-20 px-3"> - <div class="space-y-10 xl:space-y-0"> - <div class="xl:ml-[calc(15vw-64px)] space-y-2 w-full md:w-72"> - <h1 class="text-3xl font-bold">{subject.username}</h1> +<div class="container px-4 flex flex-wrap"> + <div class="p-10 pt-20 w-full lg:w-1/3"> + <h1 class="text-3xl font-bold">{subject.username}</h1> - <p class="text-secondary"> - {subject.address && subject.address !== 'null' ? subject.address : ''} - </p> + <p class="text-secondary"> + {subject.address && subject.address !== 'null' ? subject.address : ''} + </p> - <!-- TODO - we need to hook this up - <button - class="border rounded-full py-2 w-28 font-semibold flex justify-center items-center text-sm" - on:click={() => (followed = !followed)} - ><Icon icon={followed ? 'minus' : 'plus'} style="mr-1" /> - {$t('user.' + (followed ? 'remove' : 'follow'))} - </button> - --> - </div> + <!-- TODO + we need to hook this up + <button + class="border rounded-full py-2 w-28 font-semibold flex justify-center items-center text-sm" + on:click={() => (followed = !followed)} + ><Icon icon={followed ? 'minus' : 'plus'} style="mr-1" /> + {$t('user.' + (followed ? 'remove' : 'follow'))} + </button> + --> + </div> - <div class="space-y-5 static xl:absolute top-[255px] left-[calc(50vw-150px)]"> - <div - on:click={() => copy(lightningAddress)} - id="qr" - class="cursor-pointer w-[292px] md:w-[342px] h-[342px] border border-lightgrey rounded-3xl flex p-5 justify-center items-center relative" - /> + <div class="space-y-5 lg:mt-20 mx-auto"> + <div class="flex justify-center gap-2"> + <a href={`/${subject.username}`}> + <button + class="rounded-full border py-2 px-5 font-bold hover:opacity-80 w-full mb-2 bg-black text-white" + >Lightning</button + > + </a> + <a href={`/${subject.username}/bitcoin`}> + <button class="rounded-full border py-2 px-5 font-bold hover:opacity-80 w-full mb-2" + >Bitcoin</button + > + </a> + </div> + <div + on:click={() => copy(lightningAddress)} + id="qr" + class="cursor-pointer w-[292px] md:w-[342px] h-[342px] border border-lightgrey rounded-3xl flex p-5 justify-center items-center relative" + /> - <p class="text-secondary text-xl text-center font-semibold">{$t('user.scanToPayBTC')}</p> + <p class="text-secondary text-xl text-center font-semibold">{$t('user.scanToPayBTC')}</p> - <div - class="bg-primary font-semibold rounded-xl text-sm p-3 flex flex-wrap justify-between items-center" - > - <span>{lightningAddress}</span> - <button class="hover:opacity-80" on:click={() => copy(lightningAddress)}> - <Icon icon="copy" style="ml-2" /> - </button> - </div> + <div + class="bg-primary font-semibold rounded-xl text-sm p-3 flex flex-wrap justify-between items-center" + > + <span>{lightningAddress}</span> + <button class="hover:opacity-80" on:click={() => copy(lightningAddress)}> + <Icon icon="copy" style="ml-2" /> + </button> </div> </div> </div> diff --git a/src/routes/[username]/bitcoin/+page.server.js b/src/routes/[username]/bitcoin/+page.server.js new file mode 100644 index 00000000..7ef65346 --- /dev/null +++ b/src/routes/[username]/bitcoin/+page.server.js @@ -0,0 +1,4 @@ +import { redirect } from '@sveltejs/kit'; +export async function load({ params }) { + throw redirect(303, `/${params.username}`); +} diff --git a/src/routes/[username]/bitcoin/+page.svelte b/src/routes/[username]/bitcoin/+page.svelte new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/routes/[username]/bitcoin/+page.svelte diff --git a/src/routes/[username]/settings/+page.svelte b/src/routes/[username]/settings/+page.svelte index b031cb93..9759b3d8 100644 --- a/src/routes/[username]/settings/+page.svelte +++ b/src/routes/[username]/settings/+page.svelte @@ -10,7 +10,7 @@ import { avatarUpload, bannerUpload } from '$lib/store'; import { upload } from '$lib/upload'; - export let data, form; + export let data; let { user, rates, token } = data; $: update(data); diff --git a/src/routes/[username]/settings/_account.svelte b/src/routes/[username]/settings/_account.svelte index b6636129..7c667815 100644 --- a/src/routes/[username]/settings/_account.svelte +++ b/src/routes/[username]/settings/_account.svelte @@ -180,17 +180,20 @@ src={banner} class="w-full object-cover object-center visible overflow-hidden h-48 mb-4 hover:opacity-80" on:click={() => select('banner')} + alt="Banner" /> {:else if user.banner} <img src={`/api/public/${user.username}-banner.png`} class="w-full object-cover object-center visible overflow-hidden h-48 mb-4 hover:opacity-80" on:click={() => select('banner')} + alt="Banner" /> {:else} <div class="bg-gradient-to-r {$colorTheme} w-full h-48 mb-4 cursor-pointer hover:opacity-80" on:click={() => select('banner')} + alt="Banner" /> {/if} diff --git a/src/routes/[username]/transactions/[...page]/+page.svelte b/src/routes/[username]/transactions/[...page]/+page.svelte index 5e03cc57..d694c760 100644 --- a/src/routes/[username]/transactions/[...page]/+page.svelte +++ b/src/routes/[username]/transactions/[...page]/+page.svelte @@ -1,17 +1,23 @@ <script> + import { onMount } from "svelte"; + import { formatDistance, parseISO } from 'date-fns'; import { newPayment } from '$lib/store'; import { t } from '$lib/translations'; import { f, s, sats } from '$lib/utils'; + import { page } from "$app/stores"; + export let data; let { user } = data; - $newPayment = false; - let page, + let p, total, transactions = [], pages = []; - $: data && ({ page, pages, total, transactions } = data); + $: data && ({ page: p, pages, total, transactions } = data); + + $: $page && ($newPayment = false); + $: $newPayment && invalidate(`/users/${user.username}`); </script> <div class="mt-24 mb-20"> @@ -26,7 +32,7 @@ <a class="mr-1 last:mr-0" href={`/${user.username}/transactions/${i + 1}`} - class:active={page === i + 1} + class:active={p === i + 1} > <div class="border py-2 rounded-full border-2 w-12 h-12 hover:opacity-80 text-center"> {i + 1} @@ -64,7 +70,10 @@ </div> <div class="text-secondary text-right"> - {new Date(tx.createdAt).toLocaleDateString(undefined, { dateStyle: 'medium' })} + {formatDistance(parseISO(tx.createdAt), new Date(), { + includeSeconds: true, + addSuffix: true + })} </div> </div> {/each} diff --git a/src/routes/scan/+page.svelte b/src/routes/scan/+page.svelte index 3e024bc8..1c14cb6d 100644 --- a/src/routes/scan/+page.svelte +++ b/src/routes/scan/+page.svelte @@ -1,7 +1,7 @@ <script> import { Icon } from '$comp'; import QrScanner from 'qr-scanner'; - import { onMount } from 'svelte'; + import { onMount, onDestroy } from 'svelte'; import { back } from '$lib/utils'; import { goto } from '$app/navigation'; @@ -10,6 +10,8 @@ scanner = new QrScanner(vid, (text) => goto(`/send/${text}`)); scanner.start(); }); + + onDestroy(() => scanner?.stop()); </script> <button class="ml-5 md:ml-20 mt-5 md:mt-10 hover:opacity-80" on:click={back}> diff --git a/src/routes/send/+page.server.js b/src/routes/send/+page.server.js deleted file mode 100644 index c8edb1cc..00000000 --- a/src/routes/send/+page.server.js +++ /dev/null @@ -1,47 +0,0 @@ -import validate from 'bitcoin-address-validation'; -import bip21 from 'bip21'; -import { get } from '$lib/utils'; -import { invalid, redirect } from '@sveltejs/kit'; - -export const actions = { - default: async ({ request }) => { - const values = await request.formData(); - const t = values.get('text'); - if (!t) return; - - // lightning - if (t.startsWith('ln')) { - throw redirect(303, `/send/lightning/${t}`); - } - - // bitcoin - if (validate(t)) { - let user; - try { - ({ user } = await get(`/invoice/${t}`)); - } catch (e) { - throw redirect(303, `/send/bitcoin/${t}`); - } - - if (user) throw redirect(303, `/send/user/${user.username}`); - } - - // ln address - if (t.includes('@') && t.includes('.')) { - let [name, domain] = t.split('@'); - try { - let lnurl = await get(`/encode?domain=${domain}&name=${name}`); - } catch (e) {} - } - - // user - let user; - try { - user = await get(`/users/${t}`); - } catch (e) {} - - if (user) throw redirect(303, `/send/user/${t}`); - - return invalid(403, { error: 'Failed to recognize input' }); - } -}; diff --git a/src/routes/send/[...text]/+page.server.js b/src/routes/send/[...text]/+page.server.js new file mode 100644 index 00000000..ec764882 --- /dev/null +++ b/src/routes/send/[...text]/+page.server.js @@ -0,0 +1,55 @@ +import validate from 'bitcoin-address-validation'; +import bip21 from 'bip21'; +import { get } from '$lib/utils'; +import { invalid, redirect } from '@sveltejs/kit'; + +let parse = async (t) => { + if (!t) return; + + // lightning + if (t.startsWith('ln')) { + throw redirect(303, `/send/lightning/${t}`); + } + + // bitcoin + if (validate(t)) { + let user; + try { + ({ user } = await get(`/invoice/${t}`)); + } catch (e) { + throw redirect(303, `/send/bitcoin/${t}`); + } + + if (user) throw redirect(303, `/send/user/${user.username}`); + } + + // ln address + if (t.includes('@') && t.includes('.')) { + let [name, domain] = t.split('@'); + try { + let lnurl = await get(`/encode?domain=${domain}&name=${name}`); + } catch (e) {} + } + + // user + let user; + try { + user = await get(`/users/${t}`); + } catch (e) {} + + if (user) throw redirect(303, `/send/user/${t}`); +}; + +export async function load({ params }) { + let { text } = params; + await parse(text); +} + +export const actions = { + default: async ({ request }) => { + const form = await request.formData(); + await parse(form.get('text')); + + return invalid(403, { error: 'Failed to recognize input' }); + } +}; diff --git a/src/routes/send/+page.svelte b/src/routes/send/[...text]/+page.svelte index 5d6d123e..5d6d123e 100644 --- a/src/routes/send/+page.svelte +++ b/src/routes/send/[...text]/+page.svelte diff --git a/src/routes/send/lightning/[payreq]/+page.svelte b/src/routes/send/lightning/[payreq]/+page.svelte index 1b248af6..973550f6 100644 --- a/src/routes/send/lightning/[payreq]/+page.svelte +++ b/src/routes/send/lightning/[payreq]/+page.svelte @@ -23,7 +23,7 @@ <div class="container px-4 mt-20 max-w-xl mx-auto"> {#if amount} <div class="text-center mb-8"> - <h1 class="text-xl md:text-2xl text-secondary mb-2">Sending</h1> + <h1 class="text-xl md:text-2xl text-secondary mb-2">Send</h1> <p class="text-6xl break-words mb-4"> {s(amount)} <span class="text-xl md:text-2xl text-secondary">sats</span> </p> diff --git a/src/routes/send/user/[username]/+page.svelte b/src/routes/send/user/[username]/+page.svelte index 1193696b..05908011 100644 --- a/src/routes/send/user/[username]/+page.svelte +++ b/src/routes/send/user/[username]/+page.svelte @@ -38,7 +38,7 @@ <div class="container px-4 mt-20 max-w-xl mx-auto"> {#if amount} <div class="text-center mb-8"> - <h1 class="text-xl md:text-2xl text-secondary mb-2">Sending</h1> + <h1 class="text-xl md:text-2xl text-secondary mb-2">Send</h1> <p class="text-6xl break-words mb-4"> {fiat ? f(amountFiat, currency) : s(a)} {#if !fiat} |
