diff options
Diffstat (limited to 'src/routes/(app)')
16 files changed, 155 insertions, 142 deletions
diff --git a/src/routes/(app)/[username]/invoice/[id]/+page.svelte b/src/routes/(app)/[username]/invoice/[id]/+page.svelte index cdffd199..423fc719 100644 --- a/src/routes/(app)/[username]/invoice/[id]/+page.svelte +++ b/src/routes/(app)/[username]/invoice/[id]/+page.svelte @@ -292,7 +292,7 @@ {/if} {#if user?.id === invoice?.user?.id} - <a href={`/voucher`}> + <a href={`/receive`} class="block"> <button class="flex gap-2 text-center break-all rounded-2xl hover:opacity-80 py-5 px-6 w-full mx-auto justify-center border text-xl whitespace-nowrap text-secondary" > diff --git a/src/routes/(app)/[username]/payments/[...page]/+page.server.js b/src/routes/(app)/[username]/payments/[...page]/+page.server.js index de692a86..4a539e43 100644 --- a/src/routes/(app)/[username]/payments/[...page]/+page.server.js +++ b/src/routes/(app)/[username]/payments/[...page]/+page.server.js @@ -22,5 +22,5 @@ export async function load({ cookies, depends, params, request }) { 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}; + return { payments, page, pages, start, end, incoming, outgoing }; } diff --git a/src/routes/(app)/ecash/[id]/+layout.server.js b/src/routes/(app)/ecash/[id]/+layout.server.js new file mode 100644 index 00000000..0b8b2917 --- /dev/null +++ b/src/routes/(app)/ecash/[id]/+layout.server.js @@ -0,0 +1,10 @@ +import { auth, get } from "$lib/utils"; +import { fail, redirect } from "@sveltejs/kit"; +import parse from "$lib/parse"; + +export async function load({ cookies, params, request, url }) { + let { id } = params; + let { token, status } = await get(`/cash/${id}`); + let { spent, total, mint, external } = status; + return { id, token, spent, total, mint, external }; +} diff --git a/src/routes/(app)/ecash/[id]/+layout.svelte b/src/routes/(app)/ecash/[id]/+layout.svelte new file mode 100644 index 00000000..d3c95e00 --- /dev/null +++ b/src/routes/(app)/ecash/[id]/+layout.svelte @@ -0,0 +1,53 @@ +<script> + import AppHeader from "$comp/AppHeader.svelte"; + import { getDecodedToken } from "@cashu/cashu-ts"; + import { copy, sats, f, s } from "$lib/utils"; + import { t } from "$lib/translations"; + import Icon from "$comp/Icon.svelte"; + + export let data; + + let { id, rates, user, token, total, spent, external, mint } = data; + let currency = user?.currency || "USD"; + let rate = rates[currency]; + + let amount = total - spent; + + $: amountFiat = parseFloat(((amount * rate) / sats).toFixed(2)); + $: spentFiat = parseFloat(((spent * rate) / sats).toFixed(2)); +</script> + +<div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> + <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> + {$t("payments.ecash")} + </h1> + + {#if amount > 0} + <div class="text-center font-bold text-2xl"> + <div> + {f(amountFiat, currency)} + </div> + <div> + <span class="text-secondary font-normal text-xl" + >⚡️{`${s(amount)}`}</span + > + </div> + </div> + {/if} + + {#if spent > 0} + <div class="text-center font-bold text-2xl"> + <div> + {f(spentFiat, currency)} + <span class=" text-red-600">{$t("payments.spent")}</span> + </div> + <div> + <span class="text-secondary font-normal text-xl" + >⚡️{`${s(spent)}`}</span + > + </div> + </div> + {/if} + + <slot /> +</div> diff --git a/src/routes/(app)/ecash/[id]/+page.server.js b/src/routes/(app)/ecash/[id]/+page.server.js index 421c8cb6..15511174 100644 --- a/src/routes/(app)/ecash/[id]/+page.server.js +++ b/src/routes/(app)/ecash/[id]/+page.server.js @@ -1,11 +1,18 @@ -import { auth, get } from "$lib/utils"; import { fail, redirect } from "@sveltejs/kit"; -import parse from "$lib/parse"; +import { auth, fd, post } from "$lib/utils"; -export async function load({ cookies, params, request, url }) { - let { id } = params; - let { token, status } = await get(`/cash/${id}`); - let spent = parseInt(status.spent); - let total = parseInt(status.total); - return { id, token, spent, total }; -} +export const actions = { + default: async ({ cookies, request }) => { + let { token } = await fd(request); + let claimed; + try { + claimed = await post(`/claim`, { token }, auth(cookies)); + claimed = { ok: true }; + } catch (e) { + return fail(400, { error: e.message }); + } + if (claimed?.ok) { + redirect(307, `/${cookies.get("username")}/payments`); + } + }, +}; diff --git a/src/routes/(app)/ecash/[id]/+page.svelte b/src/routes/(app)/ecash/[id]/+page.svelte index 18a1cba2..375f168a 100644 --- a/src/routes/(app)/ecash/[id]/+page.svelte +++ b/src/routes/(app)/ecash/[id]/+page.svelte @@ -1,95 +1,64 @@ <script> - import AppHeader from "$comp/AppHeader.svelte"; - import { getDecodedToken } from "@cashu/cashu-ts"; + import { enhance } from "$app/forms"; import { copy, sats, f, s } from "$lib/utils"; import { t } from "$lib/translations"; import Icon from "$comp/Icon.svelte"; import { page } from "$app/stores"; export let data; - - let { id, rates, user, token, total, spent } = data; - let currency = user?.currency || "USD"; - let rate = rates[currency]; - - let amount = total - spent; + export let form; let link = $page.url.href; - - $: amountFiat = parseFloat(((amount * rate) / sats).toFixed(2)); - $: spentFiat = parseFloat(((spent * rate) / sats).toFixed(2)); + let { id, total, token, external, spent } = data; </script> -<div class="container px-4 max-w-lg mx-auto space-y-5 mt-20"> - <h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold"> - {$t("payments.ecash")} - </h1> - - {#if amount > 0} - <div class="text-center font-bold text-2xl"> - <div> - {f(amountFiat, currency)} - </div> - <div> - <span class="text-secondary font-normal text-xl" - >⚡️{`${s(amount)}`}</span - > - </div> +{#if form?.error} + <div class="mb-5"> + <div class="text-red-600"> + {form.error === "default" ? $t("error.unrecognizedInput") : form.error} </div> - {/if} - - {#if spent > 0} - <div class="text-center font-bold text-2xl"> - <div> - {f(spentFiat, currency)} - <span class=" text-red-600">{$t("payments.spent")}</span> - </div> - <div> - <span class="text-secondary font-normal text-xl" - >⚡️{`${s(spent)}`}</span - > - </div> - </div> - {/if} - - <div class="flex flex-wrap gap-2 text-xl"> - <button - type="button" - class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full justify-center gap-2" - on:click={() => copy(link)} - > - <Icon icon="link" style="w-8 my-auto" /> - <div class="my-auto">{$t("payments.copyLink")}</div> - </button> + </div> +{/if} - <!-- TODO we need animated QR's --> - <!-- <a href={`/qr/${encodeURIComponent(token)}`} class="contents"> --> - <!-- <button --> - <!-- type="button" --> - <!-- class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full justify-center gap-2" --> - <!-- > --> - <!-- <Icon icon="qr" style="w-8 my-auto invert" /> --> - <!-- <div class="my-auto">{$t("payments.qr")}</div> --> - <!-- </button> --> - <!-- </a> --> +<div class="flex flex-wrap gap-2 text-xl"> + <button + type="button" + class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full justify-center gap-2" + on:click={() => copy(link)} + > + <Icon icon="link" style="w-8 my-auto" /> + <div class="my-auto">{$t("payments.copyLink")}</div> + </button> - {#if spent < total} - <a href={`/voucher/${id}`} class="contents"> + {#if spent < total} + {#if external} + <a href={`/ecash/${id}/swap`} class="contents"> <button - type="button" + type="submit" class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full justify-center gap-2" > <Icon icon="receive" style="w-8 my-auto" /> - <div class="my-auto">{$t("payments.redeem")}</div> + <div class="my-auto">{$t("payments.swap")}</div> </button> </a> + {:else} + <form method="POST" use:enhance class="w-full"> + <input type="hidden" name="token" bind:value={token} /> + <button + type="submit" + class="flex border rounded-2xl px-6 py-5 font-bold hover:opacity-80 w-full justify-center gap-2" + > + <Icon icon="receive" style="w-8 my-auto" /> + <div class="my-auto">{$t("payments.redeem")}</div> + </button> + </form> {/if} + {/if} - <button - class="border rounded-2xl px-6 py-5 w-full break-all text-xl hover:bg-slate-100" - on:click={() => copy(token)} - > - {token} - </button> - </div> + <button + class="border rounded-2xl px-6 py-5 w-full break-all text-xl hover:bg-slate-100" + on:click={() => copy(token)} + > + {token} + </button> </div> diff --git a/src/routes/(app)/ecash/[id]/swap/+page.server.ts b/src/routes/(app)/ecash/[id]/swap/+page.server.ts new file mode 100644 index 00000000..c8806bf0 --- /dev/null +++ b/src/routes/(app)/ecash/[id]/swap/+page.server.ts @@ -0,0 +1,3 @@ + export async function load() { + return { test: 123 }; +} diff --git a/src/routes/(app)/ecash/[id]/swap/+page.svelte b/src/routes/(app)/ecash/[id]/swap/+page.svelte new file mode 100644 index 00000000..3df9504d --- /dev/null +++ b/src/routes/(app)/ecash/[id]/swap/+page.svelte @@ -0,0 +1,5 @@ +<script> + export let data; +</script> + +<div class="text-center">Support for swapping in cash from other mints is coming soon</div> diff --git a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte index 1652952a..ffe6eac3 100644 --- a/src/routes/(app)/pay/[username]/[...amount]/+page.svelte +++ b/src/routes/(app)/pay/[username]/[...amount]/+page.svelte @@ -64,6 +64,8 @@ </div> {/if} +{rate} + <div class="container px-4 mt-20 max-w-xl mx-auto space-y-8"> <Numpad bind:amount={a} diff --git a/src/routes/(app)/receive/[...token]/+page.server.js b/src/routes/(app)/receive/[...token]/+page.server.js new file mode 100644 index 00000000..30b42f32 --- /dev/null +++ b/src/routes/(app)/receive/[...token]/+page.server.js @@ -0,0 +1,17 @@ +import { auth, fd, get, post } from "$lib/utils"; +import { error, fail, redirect } from "@sveltejs/kit"; +import parse from "$lib/parse"; + +export async function load({ cookies, params, parent, url }) { + let { user } = await parent(); + if (!user) redirect(307, `/register?redirect=${url.pathname}`); + await parse(params.token, url.host, cookies); +} + +export const actions = { + default: async ({ cookies, request, url }) => { + let { text } = await fd(request); + let msg = await parse(text, url.host, cookies); + return fail(400, { error: msg || "default" }); + }, +}; diff --git a/src/routes/(app)/voucher/[...token]/+page.svelte b/src/routes/(app)/receive/[...token]/+page.svelte index 2fd4b879..2fd4b879 100644 --- a/src/routes/(app)/voucher/[...token]/+page.svelte +++ b/src/routes/(app)/receive/[...token]/+page.svelte diff --git a/src/routes/(app)/redeem/[redeemcode]/+page.server.js b/src/routes/(app)/redeem/[redeemcode]/+page.server.js deleted file mode 100644 index 25153533..00000000 --- a/src/routes/(app)/redeem/[redeemcode]/+page.server.js +++ /dev/null @@ -1,17 +0,0 @@ -import { error, redirect } from "@sveltejs/kit"; -import { auth, post } from "$lib/utils"; - -export async function load({ cookies, locals, params }) { - let { user } = locals; - - if (user) { - try { - await post("/redeem", params, auth(cookies)); - } catch (e) { - redirect(307, "/"); - } - redirect(307, `/${user.username}/payments`); - } - - redirect(307, "/login"); -} diff --git a/src/routes/(app)/redeem/[redeemcode]/+page.svelte b/src/routes/(app)/redeem/[redeemcode]/+page.svelte deleted file mode 100644 index b2fcf2f4..00000000 --- a/src/routes/(app)/redeem/[redeemcode]/+page.svelte +++ /dev/null @@ -1,4 +0,0 @@ -<script> - import { loginRedirect } from "$lib/store"; - $loginRedirect = undefined; -</script> diff --git a/src/routes/(app)/send/[...text]/+page.server.js b/src/routes/(app)/send/[...text]/+page.server.js index c1ba5945..ba5d6190 100644 --- a/src/routes/(app)/send/[...text]/+page.server.js +++ b/src/routes/(app)/send/[...text]/+page.server.js @@ -1,9 +1,10 @@ -import { auth, get } from "$lib/utils"; +import { auth, fd, get } from "$lib/utils"; import { fail, redirect } from "@sveltejs/kit"; import parse from "$lib/parse"; export async function load({ cookies, params, request, url }) { let { text } = params; + await parse(text, url.host, cookies); let contacts = await get("/contacts", auth(cookies)); return { contacts }; @@ -11,9 +12,8 @@ export async function load({ cookies, params, request, url }) { export const actions = { default: async ({ cookies, request, url }) => { - const form = await request.formData(); - let t = form.get("text"); - let msg = await parse(t, url.host, cookies); + let { text } = await fd(request); + let msg = await parse(text, url.host, cookies); return fail(400, { error: msg || "default" }); }, }; diff --git a/src/routes/(app)/send/ecash/+page.server.js b/src/routes/(app)/send/ecash/+page.server.js index ed002ace..cef1ba78 100644 --- a/src/routes/(app)/send/ecash/+page.server.js +++ b/src/routes/(app)/send/ecash/+page.server.js @@ -1,11 +1,11 @@ -import { error, redirect } from "@sveltejs/kit"; +import { error, redirect, Cookies } from "@sveltejs/kit"; import { auth, post, fd } from "$lib/utils"; import { v4 } from "uuid"; export const actions = { default: async ({ cookies, request }) => { let id; - let body = await fd(request); + let body = await fd(request); try { ({ id } = await post("/mint", body, auth(cookies))); diff --git a/src/routes/(app)/voucher/[...token]/+page.server.js b/src/routes/(app)/voucher/[...token]/+page.server.js deleted file mode 100644 index cb04224e..00000000 --- a/src/routes/(app)/voucher/[...token]/+page.server.js +++ /dev/null @@ -1,32 +0,0 @@ -import { validate } from "bitcoin-address-validation"; -import bip21 from "bip21"; -import { auth, get, isLiquid, post } from "$lib/utils"; -import { error, fail, redirect } from "@sveltejs/kit"; -import { PUBLIC_DOMAIN } from "$env/static/public"; -import parse from "$lib/parse"; -import { test } from "$lib/parse"; - -export async function load({ cookies, params, parent, request, url }) { - let { user } = await parent(); - if (!user) redirect(307, `/register?redirect=${url.pathname}`); - - let { token } = params; - if (token && !token.startsWith("cashu")) - ({ token } = await get(`/cash/${token}`)); - await parse(token, url.host, cookies); - - if (token) error(409, "Token could not be redeemed. Was it already spent?"); -} - -export const actions = { - default: async ({ cookies, request, url }) => { - const form = await request.formData(); - let t = form.get("text"); - if (t.startsWith("cashu")) { - let { id } = await post("/cash", { token: t }, auth); - redirect(307, `/ecash/${id}`); - } - let msg = await parse(t, url.host, cookies); - return fail(400, { error: msg || "default" }); - }, -}; |
