From 1b7cc6d64fb2ee3340a18d0924c4b64afabbc1e1 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Fri, 6 Sep 2024 09:32:53 -0700 Subject: per account payment pages --- src/components/Account.svelte | 87 +++--- src/components/Numpad.svelte | 2 +- src/lib/types.ts | 1 + src/routes/(app)/[username]/(profile)/+page.svelte | 4 +- .../payments/[...page]/+page.server.ts | 26 ++ .../[...account]/payments/[...page]/+page.svelte | 315 +++++++++++++++++++++ .../[...account]/payments/[...page]/+server.ts | 18 ++ .../receive/[...param]/+page.server.ts | 22 ++ .../[...account]/receive/[...param]/+page.svelte | 116 ++++++++ .../(app)/[username]/account/setup/+page.svelte | 4 +- .../[username]/account/setup/step2/+page.svelte | 15 +- .../(app)/[username]/invoice/[id]/+page.svelte | 89 +++--- .../[username]/payments/[...page]/+page.server.ts | 26 -- .../[username]/payments/[...page]/+page.svelte | 315 --------------------- .../(app)/[username]/payments/[...page]/+server.ts | 18 -- .../[username]/receive/[...param]/+page.server.ts | 20 -- .../[username]/receive/[...param]/+page.svelte | 116 -------- 17 files changed, 594 insertions(+), 600 deletions(-) create mode 100644 src/routes/(app)/[username]/[...account]/payments/[...page]/+page.server.ts create mode 100644 src/routes/(app)/[username]/[...account]/payments/[...page]/+page.svelte create mode 100644 src/routes/(app)/[username]/[...account]/payments/[...page]/+server.ts create mode 100644 src/routes/(app)/[username]/[...account]/receive/[...param]/+page.server.ts create mode 100644 src/routes/(app)/[username]/[...account]/receive/[...param]/+page.svelte delete mode 100644 src/routes/(app)/[username]/payments/[...page]/+page.server.ts delete mode 100644 src/routes/(app)/[username]/payments/[...page]/+page.svelte delete mode 100644 src/routes/(app)/[username]/payments/[...page]/+server.ts delete mode 100644 src/routes/(app)/[username]/receive/[...param]/+page.server.ts delete mode 100644 src/routes/(app)/[username]/receive/[...param]/+page.svelte (limited to 'src') diff --git a/src/components/Account.svelte b/src/components/Account.svelte index 5286c4d3..a781e809 100644 --- a/src/components/Account.svelte +++ b/src/components/Account.svelte @@ -4,50 +4,55 @@ import { t } from "$lib/translations"; export let user, rate, account; - let { balance, setup, type } = account; + let { balance, setup, type, id } = account; -
-
- -
{type}
-
+ + + diff --git a/src/components/Numpad.svelte b/src/components/Numpad.svelte index 88b5b899..78322ff5 100644 --- a/src/components/Numpad.svelte +++ b/src/components/Numpad.svelte @@ -1,7 +1,7 @@ diff --git a/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.server.ts b/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.server.ts new file mode 100644 index 00000000..070349f8 --- /dev/null +++ b/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.server.ts @@ -0,0 +1,26 @@ +import { get, auth } from "$lib/utils"; + +let limit = 25; + +export async function load({ cookies, depends, params }) { + depends("app:payments"); + + let parts = params.page.split("/"); + + let start, end, page; + if (parts.length === 1) [page] = parts; + if (parts.length === 2) [start, page] = parts; + if (parts.length === 3) [start, end, page] = parts; + if (!parseInt(page)) page = 1; + + let offset = (page - 1) * limit; + if (!start) start = Date.now() / 1000 - 24 * 60 * 60; + + let url = `/payments?start=${start * 1000}&limit=${limit}&offset=${offset}`; + if (end) url += `&end=${end * 1000}`; + + let { count, payments, incoming, outgoing } = await get(url, auth(cookies)); + let pages = new Array(Math.ceil(count / limit)); + + return { payments, page, pages, start, end, incoming, outgoing }; +} diff --git a/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.svelte b/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.svelte new file mode 100644 index 00000000..1efdc2ec --- /dev/null +++ b/src/routes/(app)/[username]/[...account]/payments/[...page]/+page.svelte @@ -0,0 +1,315 @@ + + +
+

+ {$t("payments.header")} +

+ +
+
+
+ {#each presets as { start, end, title }, i} + + + + {/each} +
+
+ +
+ {#if pages.length > 1} + {#each pages as _, i} + +
+ {i + 1} +
+
+ {/each} + {/if} +
+ +
+ {#each payments as p} + +
+
+
+ {f(Math.abs(p.amount) * (p.rate / sats), p.currency)} + {#if p.tip} + + +{Math.round((p.tip / Math.abs(p.amount)) * 100)}% + + {/if} +
+ +
+ {sat(Math.abs(p.amount) + (p.tip || 0))} +
+
+ +
+ {#if p.type === types.pot} + +
+
+ Pot +
+ +
Pot
+
+
+ {:else if p.with} +
+
+ +
+
+ {p.with.username} +
+
+ {:else} +
+ {#if [types.ecash, types.lightning].includes(p.type)} +
⚡️
+ {:else if p.type === types.bitcoin} +
+ Bitcoin +
+ {:else if p.type === types.liquid} +
+ Liquid +
+ {/if} + +
+ {p.amount > 0 + ? p.confirmed + ? "Received" + : "Pending" + : "Sent"} +
+
+ {/if} +
+ +
+
+ {format(new Date(p.created), "h:mm aaa")} +
+
+ {format(new Date(p.created), "MMM d, yy")} +
+
+
+ + {:else} +

{$t("payments.empty")}

+ {/each} +
+ +
+ {#each Object.keys(incoming) as c} + + + + + + {#if tipsIn || tipsOut}{$t("payments.tips")}{/if} + + {$t("payments.total")} + + {@const totalIn = incoming[c]?.fiat || 0} + {@const tipsIn = incoming[c]?.fiatTips || 0} + {@const subtotalIn = totalIn - tipsIn} + + {@const totalOut = -outgoing[c]?.fiat || 0} + {@const tipsOut = outgoing[c]?.fiatTips || 0} + {@const subtotalOut = totalOut - tipsOut} + + {$t("payments.income")} + + {tipsIn ? f(tipsIn, c) : "-"} + {totalIn ? f(totalIn, c) : "-"} + + {$t("payments.expenditure")} + + {tipsOut ? f(tipsOut, c) : "-"} + {totalOut ? f(totalOut, c) : "-"} + {/each} +
+ + +
+
+ + diff --git a/src/routes/(app)/[username]/[...account]/payments/[...page]/+server.ts b/src/routes/(app)/[username]/[...account]/payments/[...page]/+server.ts new file mode 100644 index 00000000..a81faaf3 --- /dev/null +++ b/src/routes/(app)/[username]/[...account]/payments/[...page]/+server.ts @@ -0,0 +1,18 @@ +import { get, auth } from "$lib/utils"; +import { json } from "@sveltejs/kit"; + +export async function GET({ cookies, params }) { + let parts = params.page.split("/"); + + let start, end; + if (parts.length === 1) [start] = parts; + if (parts.length === 2) [start, end] = parts; + + if (!start) start = Date.now() / 1000 - 24 * 60 * 60; + + let url = `/payments?start=${start * 1000}`; + if (end) url += `&end=${end * 1000}`; + + let { payments } = await get(url, auth(cookies)); + return json({ payments }); +} diff --git a/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.server.ts b/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.server.ts new file mode 100644 index 00000000..13eb1381 --- /dev/null +++ b/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.server.ts @@ -0,0 +1,22 @@ +import { redirect } from "@sveltejs/kit"; +import { auth, post } from "$lib/utils"; +import type { Invoice } from "$lib/types"; + +export let load = async ({ cookies, params, parent }) => { + let { account } = params; + let {subject, user, rates } = await parent(); + + let invoice: Invoice = { + account, + type: account ? "bitcoin": "lightning", + rate: rates[user?.currency || subject?.currency], + }; + + if(!user) user = subject; + invoice = await post("/invoice", { invoice, account, user }, auth(cookies)); + let { id } = invoice; + + if (invoice.memoPrompt && !invoice.memo) { + redirect(307, `/${user.username}/invoice/${id}/memo`); + } else redirect(307, `/${user.username}/invoice/${id}`); +}; diff --git a/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.svelte b/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.svelte new file mode 100644 index 00000000..f9267105 --- /dev/null +++ b/src/routes/(app)/[username]/[...account]/receive/[...param]/+page.svelte @@ -0,0 +1,116 @@ + + + + + +
+

+ {$t("payments.send")} +

+ +
+ {#if form?.error} +
+
+ {$t("error.unrecognizedInput")} +
+
+ {/if} + +
+