diff options
| author | Adam Soltys <[email protected]> | 2024-09-25 12:50:46 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2024-09-25 12:50:46 -0700 |
| commit | 3be85cc511220725bfff7add3a6cb4927f73b15c (patch) | |
| tree | 1768a9f0a25c2ee0a847d5ce0174ab3cfcf6ba77 | |
| parent | 396535514c4fe00e872e5cc5af0a504e923736bb (diff) | |
| download | coinos-ui-3be85cc511220725bfff7add3a6cb4927f73b15c.tar.gz coinos-ui-3be85cc511220725bfff7add3a6cb4927f73b15c.zip | |
invoice fixes
| -rw-r--r-- | src/components/AppHeader.svelte | 23 | ||||
| -rw-r--r-- | src/routes/(app)/+layout.server.ts | 3 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/(profile)/+page.server.ts | 3 | ||||
| -rw-r--r-- | src/routes/(app)/[username]/+layout.server.ts | 3 | ||||
| -rw-r--r-- | src/routes/(app)/invoice/[id]/+layout.server.ts | 3 | ||||
| -rw-r--r-- | src/routes/(app)/invoice/[id]/+layout.svelte | 1 | ||||
| -rw-r--r-- | src/routes/(app)/invoice/[id]/[email protected] | 115 | ||||
| -rw-r--r-- | src/routes/(app)/invoice/[id]/+page.svelte | 6 | ||||
| -rw-r--r-- | src/routes/(app)/pay/[username]/[...amount]/+page.server.ts | 6 | ||||
| -rw-r--r-- | src/routes/(app)/send/invoice/[id]/+page.server.ts | 2 |
10 files changed, 143 insertions, 22 deletions
diff --git a/src/components/AppHeader.svelte b/src/components/AppHeader.svelte index cc521e93..541059f5 100644 --- a/src/components/AppHeader.svelte +++ b/src/components/AppHeader.svelte @@ -9,6 +9,8 @@ export let user, subject; + $: if (!subject) subject = user; + let menuButtons; $: if (user) menuButtons = [ @@ -58,8 +60,9 @@ </a> <a href={`/invoice`}> <button - class="bg-white p-2 rounded-full w-12 h-12 sm:w-16 sm:h-16 drop-shadow-xl border border-black/10 {$page - .url.pathname.includes('invoice') + class="bg-white p-2 rounded-full w-12 h-12 sm:w-16 sm:h-16 drop-shadow-xl border border-black/10 {$page.url.pathname.includes( + 'invoice' + ) ? 'opacity-100' : 'opacity-70 hover:opacity-80'}" ><Icon icon="receive" style="mx-auto w-6 sm:w-8" /> @@ -98,8 +101,8 @@ <div class="relative"> <OutClick on:outclick={() => (showMenu = false)}> <button - class="bg-white p-2 rounded-full w-12 h-12 sm:w-16 sm:h-16 drop-shadow-xl border border-black/10 { - $page.url.pathname === `/settings` || + class="bg-white p-2 rounded-full w-12 h-12 sm:w-16 sm:h-16 drop-shadow-xl border border-black/10 {$page + .url.pathname === `/settings` || $page.url.pathname === `/support` ? 'opacity-100' : `opacity-70 hover:opacity-80 ${ @@ -141,11 +144,13 @@ </a> {/if} </nav> - <div - class="absolute md:w-[64px] md:mx-auto lg:left-[154px] xl:left-[194px] left-[calc(50vw-64px)] -bottom-[64px] z-30" - > - <Avatar user={subject} /> - </div> + {#if subject} + <div + class="absolute md:w-[64px] md:mx-auto lg:left-[154px] xl:left-[194px] left-[calc(50vw-64px)] -bottom-[64px] z-30" + > + <Avatar user={subject} /> + </div> + {/if} </header> {/if} diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts index 0901cb5d..36381082 100644 --- a/src/routes/(app)/+layout.server.ts +++ b/src/routes/(app)/+layout.server.ts @@ -24,9 +24,6 @@ export async function load({ cookies, request, url, params }) { } } - if (!subject) subject = user; - if (!user) user = subject; - if (user?.needsMigration) { redirect(307, `/migrate`); } diff --git a/src/routes/(app)/[username]/(profile)/+page.server.ts b/src/routes/(app)/[username]/(profile)/+page.server.ts index ed4ee58c..e3d3bed1 100644 --- a/src/routes/(app)/[username]/(profile)/+page.server.ts +++ b/src/routes/(app)/[username]/(profile)/+page.server.ts @@ -6,7 +6,8 @@ export async function load({ cookies, depends, parent }) { let { subject } = await parent(); - let accounts = await get("/accounts", auth(cookies)); + let accounts = []; + if (cookies.get("token")) accounts = await get("/accounts", auth(cookies)); let items = await get(`/${subject.id}/items`, auth(cookies)); items.map((i) => (i.quantity = 0)); diff --git a/src/routes/(app)/[username]/+layout.server.ts b/src/routes/(app)/[username]/+layout.server.ts index 9a520036..284501a2 100644 --- a/src/routes/(app)/[username]/+layout.server.ts +++ b/src/routes/(app)/[username]/+layout.server.ts @@ -12,11 +12,10 @@ export let load = async ({ try { let subject = await get(`/users/${username}`); let { user } = await parent(); - if (!user) user = subject; let expires = new Date(); expires.setSeconds(expires.getSeconds() + 380 * 24 * 60 * 60); - cookies.set("username", username, { path: "/", expires }); + cookies.set("username", username, { path: "/", expires }); return { subject, user }; } catch (e) { diff --git a/src/routes/(app)/invoice/[id]/+layout.server.ts b/src/routes/(app)/invoice/[id]/+layout.server.ts index 55c44f36..e2f03fd7 100644 --- a/src/routes/(app)/invoice/[id]/+layout.server.ts +++ b/src/routes/(app)/invoice/[id]/+layout.server.ts @@ -24,6 +24,7 @@ export async function load({ depends, params, url, parent }) { let { amount, pending, received } = invoice; amount = parseInt(amount); + subject = user || invoice.user; let paid = (!amount && (pending || received)) || @@ -34,5 +35,5 @@ export async function load({ depends, params, url, parent }) { } let src = Qr.drawImg(invoice?.text || "", { size: 500 }); - return { id, invoice, subject, src }; + return { id, invoice, subject, src, user }; } diff --git a/src/routes/(app)/invoice/[id]/+layout.svelte b/src/routes/(app)/invoice/[id]/+layout.svelte deleted file mode 100644 index 4fa864ce..00000000 --- a/src/routes/(app)/invoice/[id]/+layout.svelte +++ /dev/null @@ -1 +0,0 @@ -<slot /> diff --git a/src/routes/(app)/invoice/[id]/[email protected] b/src/routes/(app)/invoice/[id]/[email protected] new file mode 100644 index 00000000..db14b046 --- /dev/null +++ b/src/routes/(app)/invoice/[id]/[email protected] @@ -0,0 +1,115 @@ +<script> + import { SvelteToast } from "@zerodevx/svelte-toast"; + import { onDestroy, onMount } from "svelte"; + import { close, connect, send } from "$lib/socket"; + import { + last, + invoice, + request, + ndef, + passwordPrompt, + password, + pin, + } from "$lib/store"; + import { page } from "$app/stores"; + import { browser } from "$app/environment"; + import LoadingSplash from "$comp/LoadingSplash.svelte"; + import AppHeader from "$comp/AppHeader.svelte"; + import Invoice from "$comp/Invoice.svelte"; + import Password from "$comp/Password.svelte"; + import { getCookie, warning, protectedRoutes } from "$lib/utils"; + import { t, locale, loading } from "$lib/translations"; + import { goto, onNavigate } from "$app/navigation"; + + export let data; + + let { generate, rate, user, subject, token, rates } = data; + + $: update(data); + let update = (data) => { + ({ rate, user, subject, token, rates } = data); + }; + + onMount(async () => { + if (browser) { + checkSocket(); + $pin = getCookie("pin"); + + if (window.NDEFReader && user.nfc) { + try { + $ndef = new NDEFReader(); + await $ndef.scan(); + + $ndef.addEventListener("readingerror", (e) => { + console.log("nfc error", e); + }); + + $ndef.addEventListener("reading", ({ message, serialNumber }) => { + goto(`/send/${message}`); + }); + } catch (error) { + console.log("Argh! " + error); + } + } + } + }); + + $: browser && connect(token); + + let lost, + checkTimer, + expireTimer, + counter = 0; + + let checkSocket = () => { + counter++; + lost = Date.now() - $last > 30000; + if (lost) connect(token); + if (counter > 5) { + send("heartbeat", token); + counter = 0; + } + + checkTimer = setTimeout(checkSocket, 1000); + }; + + onDestroy(() => { + if (browser) { + close(); + clearTimeout(checkTimer); + clearTimeout(expireTimer); + } + }); +</script> + +{#if browser && user && $passwordPrompt} + <Password {user} /> +{/if} + +<svelte:head> + {#if subject} + <title>coinos - {subject.username}</title> + <meta name="lightning" content={`lnurlp:${subject.username}@coinos.io`} /> + {:else} + <title>coinos</title> + {/if} + + {#if subject?.profile} + <meta name="og:image" content={`/api/public/${subject.profile}.webp`} /> + {:else} + <meta property="og:image" content="/images/logo.webp" /> + {/if} +</svelte:head> + +<SvelteToast options={{ reversed: true, intro: { y: 192 } }} /> + +<main class="pb-20"> + <AppHeader {user} {subject} /> + {#if !$loading} + <slot /> + {/if} +</main> + +{#if $invoice} + <Invoice {user} /> +{/if} diff --git a/src/routes/(app)/invoice/[id]/+page.svelte b/src/routes/(app)/invoice/[id]/+page.svelte index 3b25797d..ac4c2d32 100644 --- a/src/routes/(app)/invoice/[id]/+page.svelte +++ b/src/routes/(app)/invoice/[id]/+page.svelte @@ -143,7 +143,9 @@ </a> </div> {:else} - <div class="break-all pb-5 text-center text-secondary text-xl min-h-[120px] flex"> + <div + class="break-all pb-5 text-center text-secondary text-xl min-h-[120px] flex" + > <div class="m-auto">{txt}</div> </div> {/if} @@ -236,7 +238,7 @@ </div> </div> - {#if aid === user.id} + {#if aid === user?.id} <div class="grid grid-cols-2 justify-around text-secondary"> <button class="hover:bg-primary my-auto flex gap-1 sm:gap-2 py-3 px-2 sm:px-5 justify-center" diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts index cf8143f0..5fa7737f 100644 --- a/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts +++ b/src/routes/(app)/pay/[username]/[...amount]/+page.server.ts @@ -2,10 +2,12 @@ import { error, fail, redirect } from "@sveltejs/kit"; import { types, sats, fd, auth, get, post } from "$lib/utils"; export async function load({ cookies, params, parent }) { + let { username } = params; + let { rates, user } = await parent(); + + if (user.username = username) error(500, "Cannot send to self"); let subject = await get(`/users/${params.username}`); - let { rates } = await parent(); - let { username } = params; let [amount, currency] = params.amount.split("/"); let rate; diff --git a/src/routes/(app)/send/invoice/[id]/+page.server.ts b/src/routes/(app)/send/invoice/[id]/+page.server.ts index 6c89912d..f294f88d 100644 --- a/src/routes/(app)/send/invoice/[id]/+page.server.ts +++ b/src/routes/(app)/send/invoice/[id]/+page.server.ts @@ -12,7 +12,7 @@ export async function load({ params: { id }, parent }) { if (invoice.memoPrompt && invoice.memo === null) redirect(307, `/invoice/${id}/memo`); - if (invoice.account === user?.id) + if (user && invoice.account === user?.id) error(500, { message: "Cannot send to self" }); if (!user) redirect(307, `/invoice/${id}`); |
