diff options
| author | Adam Soltys <[email protected]> | 2023-01-27 20:58:08 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2023-01-27 20:58:08 -0800 |
| commit | 2dbd712039e4268c6cf8e6240033caf464ebcd50 (patch) | |
| tree | 7f3dc97f2b37b06c8193183f611b5b5abcb0f5e7 | |
| parent | 1ff3877220343972ba8e7008b7338b41cc4c876d (diff) | |
| download | coinos-ui-2dbd712039e4268c6cf8e6240033caf464ebcd50.tar.gz coinos-ui-2dbd712039e4268c6cf8e6240033caf464ebcd50.zip | |
lnurlw
| -rw-r--r-- | src/components/Lnurlp.svelte | 58 | ||||
| -rw-r--r-- | src/components/Lnurlw.svelte | 55 | ||||
| -rw-r--r-- | src/components/index.js | 2 | ||||
| -rw-r--r-- | src/routes/(app)/ln/[lnurl]/+page.server.js | 27 | ||||
| -rw-r--r-- | src/routes/(app)/ln/[lnurl]/+page.svelte | 62 | ||||
| -rw-r--r-- | src/routes/(app)/ln/withdrawal/sent/+page.svelte | 23 | ||||
| -rw-r--r-- | src/routes/(app)/send/lnurl/+page.svelte | 0 |
7 files changed, 170 insertions, 57 deletions
diff --git a/src/components/Lnurlp.svelte b/src/components/Lnurlp.svelte new file mode 100644 index 00000000..22364fcf --- /dev/null +++ b/src/components/Lnurlp.svelte @@ -0,0 +1,58 @@ +<script> + import { t } from '$lib/translations'; + import { enhance } from '$app/forms'; + import { Numpad, Spinner } from '$comp'; + import { pin } from '$lib/store'; + + export let data, form; + let { currency } = data.user; + let { minSendable, maxSendable, callback, metadata } = data; + + let amount = minSendable, + loading; + let submit = () => (loading = true); +</script> + +<div class="container px-4 mt-20 max-w-xl mx-auto"> + <div class="text-center mb-8"> + {#each JSON.parse(metadata) as m} + <div> + {#if m[0] === 'text/plain'} + <h1 class="text-3xl md:text-4xl font-semibold mb-2">{m[1]}</h1> + {/if} + {#if m[0].includes('image')} + <img src={`data:image/png;base64,${m[1]}`} alt="Recipient" /> + {/if} + </div> + {/each} + </div> + + {#if form?.error} + <div class="text-red-600 text-center mb-5"> + {form.error} + </div> + {/if} + + <Numpad bind:amount {currency} /> + + <form action="?/pay" method="POST" use:enhance on:submit={submit}> + <input name="amount" value={amount} type="hidden" /> + <input name="minSendable" value={minSendable} type="hidden" /> + <input name="maxSendable" value={maxSendable} type="hidden" /> + <input name="callback" value={callback} 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/components/Lnurlw.svelte b/src/components/Lnurlw.svelte new file mode 100644 index 00000000..dab360aa --- /dev/null +++ b/src/components/Lnurlw.svelte @@ -0,0 +1,55 @@ +<script> + import { t } from '$lib/translations'; + import { enhance } from '$app/forms'; + import { Numpad, Spinner } from '$comp'; + import { pin } from '$lib/store'; + + export let data, form; + + let { currency, username } = data.user; + let { defaultDescription, minWithdrawable, maxWithdrawable, k1, callback } = data; + + let amount = maxWithdrawable, + loading; + + let submit = () => (loading = true); +</script> + +<div class="container px-4 mt-20 max-w-xl mx-auto"> + <div class="text-center mb-8"> + <div> + <h1 class="text-3xl md:text-4xl font-semibold mb-2">{defaultDescription}</h1> + </div> + </div> + + {#if form?.error} + <div class="text-red-600 text-center mb-5"> + {form.error} + </div> + {/if} + + <Numpad bind:amount {currency} /> + + <form action="?/withdraw" method="POST" use:enhance on:submit={submit}> + <input name="amount" value={amount} type="hidden" /> + <input name="username" value={username} type="hidden" /> + <input name="currency" value={currency} type="hidden" /> + <input name="minWithdrawable" value={minWithdrawable} type="hidden" /> + <input name="maxWithdrawable" value={maxWithdrawable} type="hidden" /> + <input name="callback" value={callback} type="hidden" /> + <input name="k1" value={k1} 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.redeem')} + {/if} + </button> + </div> + </form> +</div> diff --git a/src/components/index.js b/src/components/index.js index 3b21f96d..ea44c7d9 100644 --- a/src/components/index.js +++ b/src/components/index.js @@ -1,3 +1,5 @@ +export { default as Lnurlp } from './Lnurlp.svelte'; +export { default as Lnurlw } from './Lnurlw.svelte'; export { default as Event } from './Event.svelte'; export { default as Password } from './Password.svelte'; export { default as Feed } from './Feed.svelte'; diff --git a/src/routes/(app)/ln/[lnurl]/+page.server.js b/src/routes/(app)/ln/[lnurl]/+page.server.js index 6f61143f..a947dbb4 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.server.js +++ b/src/routes/(app)/ln/[lnurl]/+page.server.js @@ -5,7 +5,8 @@ export async function load({ params }) { try { let { lnurl } = params; let data = await get(`/decode?text=${lnurl}`); - if (data.tag !== 'payRequest') throw error(500, 'We can only handle lnurl pay requests'); + if (data.tag === 'payRequest') throw redirect('/lnurlp'); + throw error(500, 'We can only handle lnurl pay requests'); return data; } catch (e) { throw error(500, e.message); @@ -13,7 +14,7 @@ export async function load({ params }) { } export const actions = { - default: async ({ cookies, fetch, request }) => { + pay: async ({ cookies, fetch, request }) => { let error; let { callback, amount, minSendable, maxSendable } = Object.fromEntries( @@ -26,5 +27,27 @@ export const actions = { let { pr } = await fetch(`${callback}?amount=${amount}`).then((r) => r.json()); throw redirect(307, `/send/lightning/${pr}`); + }, + + withdraw: async ({ cookies, fetch, request }) => { + let error; + + let { callback, amount, minWithdrawable, maxWithdrawable, k1 } = Object.fromEntries( + await request.formData() + ); + + if (amount < minWithdrawable) error = `Amount must be at least ${minWithdrawable} sats`; + if (amount > maxWithdrawable) error = `Amount must be at most ${maxWithdrawable} sats`; + if (error) return fail(400, { error }); + + let invoice = { amount, type: 'lightning' }; + let user = { username: form.get('username'), currency: form.get('currency') }; + + let { text: pr } = await post('/invoice', { invoice, user }, auth(cookies)); + + let c = callback.includes('?') ? '&' : '?'; + await fetch(`${callback}${c}k1=${k1}&pr=${pr}`).then((r) => r.json()); + + throw redirect(307, `/ln/withdrawal/sent`); } }; diff --git a/src/routes/(app)/ln/[lnurl]/+page.svelte b/src/routes/(app)/ln/[lnurl]/+page.svelte index 297ac35a..f9423153 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.svelte +++ b/src/routes/(app)/ln/[lnurl]/+page.svelte @@ -1,58 +1,10 @@ <script> - import { t } from '$lib/translations'; - import { enhance } from '$app/forms'; - import { Numpad, Spinner } from '$comp'; - import { pin } from '$lib/store'; - - export let data, form; - let { currency } = data.user; - let { minSendable, maxSendable, callback, metadata } = data; - - let amount = minSendable, - loading; - let submit = () => (loading = true); + import { Lnurlp, Lnurlw } from '$comp'; + let { tag } = data; </script> -<div class="container px-4 mt-20 max-w-xl mx-auto"> - <div class="text-center mb-8"> - {#each JSON.parse(metadata) as m} - <div> - {#if m[0] === 'text/plain'} - <h1 class="text-3xl md:text-4xl font-semibold mb-2">{m[1]}</h1> - {/if} - {#if m[0].includes('image')} - <img src={`data:image/png;base64,${m[1]}`} alt="Recipient" /> - {/if} - </div> - {/each} - </div> - - {#if form?.error} - <div class="text-red-600 text-center mb-5"> - {form.error} - </div> - {/if} - - <Numpad bind:amount {currency} /> - - <form method="POST" use:enhance on:submit={submit}> - <input name="amount" value={amount} type="hidden" /> - <input name="minSendable" value={minSendable} type="hidden" /> - <input name="maxSendable" value={maxSendable} type="hidden" /> - <input name="callback" value={callback} 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> +{#if tag === 'payRequest'} + <Lnurlp {data} /> +{:else if tag === 'withdrawRequest'} + <Lnurlw {data} /> +{/if} diff --git a/src/routes/(app)/ln/withdrawal/sent/+page.svelte b/src/routes/(app)/ln/withdrawal/sent/+page.svelte new file mode 100644 index 00000000..84e6a7e0 --- /dev/null +++ b/src/routes/(app)/ln/withdrawal/sent/+page.svelte @@ -0,0 +1,23 @@ +<script> + import { scale } from 'svelte/transition'; + import { Icon } from '$comp'; + import { toast } from '@zerodevx/svelte-toast'; + import { t } from '$lib/translations'; + + export let data; + let { user } = data; + toast.pop(0); +</script> + +<div class="text-center mt-20 md:mt-0"> + <div class="flex w-full max-w-[200px] mx-auto py-20" in:scale={{ start: 0.5 }}> + <Icon icon="check" style="mx-auto" /> + </div> + <h1 class="text-3xl md:text-4xl font-bold mb-6">Request Sent!</h1> +</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)/send/lnurl/+page.svelte b/src/routes/(app)/send/lnurl/+page.svelte deleted file mode 100644 index e69de29b..00000000 --- a/src/routes/(app)/send/lnurl/+page.svelte +++ /dev/null |
