diff options
| author | Adam Soltys <[email protected]> | 2026-09-21 19:41:37 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-09-21 19:41:39 -0700 |
| commit | 2e98fba55d572186f39d00235db1024791ba1561 (patch) | |
| tree | 24f65c725540f400b913116017db896700a6ffc0 | |
| parent | efeab01cd99c5f57e7c904df96030fc518371fa2 (diff) | |
| download | coinos-ui-2e98fba55d572186f39d00235db1024791ba1561.tar.gz coinos-ui-2e98fba55d572186f39d00235db1024791ba1561.zip | |
send: stop the Max buttons from cancelling their own submit, show LNURL action errors
Choosing Max on the LNURL-pay page left the button spinning forever. Two
things combined:
The Max buttons set `loading` from their click handler. Svelte flushes
`disabled={loading}` to the DOM before the browser runs the button's
submit activation, and a disabled button submits nothing. Set loading
from the form's onsubmit instead, the way the Send button always did.
The /ln page never passed `form` into the Lnurlp and Lnurlw components,
so any action failure (pay, max or withdraw) rendered nothing and never
reset the spinner. Pass it through, and reset loading when a result
arrives.
Verified in headless Chrome against the dev stack: the bolt11 Max lands
on the fee view, and the LNURL Max surfaces the server's error and
re-enables the buttons.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
| -rw-r--r-- | src/components/Lnurlp.svelte | 9 | ||||
| -rw-r--r-- | src/routes/(app)/ln/[lnurl]/+page.svelte | 8 | ||||
| -rw-r--r-- | src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte | 11 |
3 files changed, 21 insertions, 7 deletions
diff --git a/src/components/Lnurlp.svelte b/src/components/Lnurlp.svelte index 2b715667..c1ae0c95 100644 --- a/src/components/Lnurlp.svelte +++ b/src/components/Lnurlp.svelte @@ -17,6 +17,8 @@ let amount = $state(Math.round(minSendable / 1000)), loading = $state(); let submit = () => (loading = true); + // An action result (an error, since success redirects) ends the wait + $effect(() => form && (loading = false)); </script> <div class="container px-4 mt-20 max-w-xl mx-auto space-y-2"> @@ -60,12 +62,15 @@ <div class="flex w-full gap-2"> {#if max >= Math.round(minSendable / 1000)} + <!-- loading is set by the form's onsubmit, not here: flipping + `disabled` from a click handler lands in the DOM before the + browser's submit activation runs, and a disabled button submits + nothing (the page just sat on a spinner). --> <button type="submit" class="btn !w-auto grow" formaction="?/max" - disabled={loading} - onclick={submit}>Max ⚡️{s(max)}</button + disabled={loading}>Max ⚡️{s(max)}</button > {/if} <button bind:this={send} type="submit" class="btn btn-accent !w-auto grow"> diff --git a/src/routes/(app)/ln/[lnurl]/+page.svelte b/src/routes/(app)/ln/[lnurl]/+page.svelte index 386df9d2..0f1b030f 100644 --- a/src/routes/(app)/ln/[lnurl]/+page.svelte +++ b/src/routes/(app)/ln/[lnurl]/+page.svelte @@ -1,12 +1,14 @@ <script> import Lnurlp from "$comp/Lnurlp.svelte"; import Lnurlw from "$comp/Lnurlw.svelte"; - let { data } = $props(); + let { data, form } = $props(); let { tag } = data; </script> +<!-- form carries the action result; without it a failed pay/max/withdraw + showed nothing and left the button spinning forever --> {#if tag === "payRequest"} - <Lnurlp {data} /> + <Lnurlp {data} {form} /> {:else if tag === "withdrawRequest"} - <Lnurlw {data} /> + <Lnurlw {data} {form} /> {/if} diff --git a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte index c84e5d53..d3d9f757 100644 --- a/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte +++ b/src/routes/(app)/send/lightning/[payreq]/[...memo]/+page.svelte @@ -174,7 +174,13 @@ {/if} </form> {:else} - <form method="POST" action="?/setAmount" class="space-y-2" use:enhance> + <form + method="POST" + action="?/setAmount" + class="space-y-2" + use:enhance + onsubmit={submit} + > <input type="hidden" value={a} name="amount" /> <input name="rate" value={$rate} type="hidden" /> @@ -187,12 +193,13 @@ /> <div class="flex justify-center gap-2"> + <!-- no onclick: see Lnurlp.svelte — disabling from the click + handler cancels the submit; the form's onsubmit sets loading --> <button type="submit" class="btn !w-auto grow" formaction="?/max" disabled={loading} - onclick={submit} > {#if loading} <Spinner /> |
