diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.js | 17 | ||||
| -rw-r--r-- | src/features/zaps.js | 15 |
2 files changed, 29 insertions, 3 deletions
@@ -4985,6 +4985,23 @@ if (INTENT_URI) { ui.tab = 'send'; render(); handleScanned(INTENT_URI); + // A lightning:lnurl… (or ln-address) intent often lands BEFORE the + // feature that pays it is ready — ark connects lazily, so zaps' + // matchSendText declines and the raw URI falls through into the + // recipient field. Keep re-offering the text to the feature chain for a + // while; when a feature finally claims it (the zap amount screen takes + // over), sweep the leftover raw text out of the recipient. + let tries = 0; + const retry = setInterval(() => { + const s = ui.send; + const pending = s && s.recipients.length === 1 && s.recipients[0].address === INTENT_URI; + if (!pending || ++tries > 20) return clearInterval(retry); + if (featureMatchSend(INTENT_URI)) { + clearInterval(retry); + s.recipients[0].address = ''; + render(); + } + }, 1000); }, 500); } diff --git a/src/features/zaps.js b/src/features/zaps.js index 29f2aa8..03b80e1 100644 --- a/src/features/zaps.js +++ b/src/features/zaps.js @@ -43,6 +43,16 @@ export function zapsFeature(ctx) { } const shortCode = (s) => s.slice(0, 12) + '…' + s.slice(-6); + // What a zap target is CALLED on buttons and the amount screen: a human + // address when there is one, a shortened bech32 otherwise — a raw + // lightning:lnurl1… blob (an intent from the Android wrapper, an NFC tag) + // is unreadable and overflows the button it lands on. + const zapDisplay = (target, raw) => { + if (target.kind === 'npub') return shortNpub(npubOf(target.pk) || String(raw || '').trim()); + if (target.address) return target.address; + const s = String(raw || '').trim().replace(/^lightning:/i, ''); + return s.length > 24 ? shortCode(s) : s; + }; // Begin the amount screen for a decoded offer. Fetching the actual invoice // (via the ASP's CLN) and verifying it happens on confirm. @@ -314,8 +324,7 @@ export function zapsFeature(ctx) { // text is complete and advances immediately; npub/lnurl carry a bech32 // checksum and only ever match when complete. if (typed && target.kind === 'lnaddr') return false; - const display = target.kind === 'npub' ? shortNpub(npubOf(target.pk) || text.trim()) : (target.address || text.trim()); - begin(target, display); + begin(target, zapDisplay(target, text)); return true; }, // The typed-lightning-address affordance on the send form. @@ -323,7 +332,7 @@ export function zapsFeature(ctx) { if (!canPay() || !ui.send || ui.send.recipients.length !== 1) return null; const target = parseZapTarget(a); if (!target || target.kind === 'npub') return null; - const display = target.address || String(a || '').trim(); + const display = zapDisplay(target, a); return h('button', { type: 'button', class: 'btn-primary btn-block', onClick: () => begin(target, display), |
