fix(wallet): blank send/receive on every open; sweep shows amount; camera option stays visible
Demo images / Build & push demo images (push) Successful in 3m31s

Operator-reported (2026-08-05):

- Send/Receive modals reset to a blank slate on every open. Stale state —
  destination, amount, memo, and above all an armed "send all funds"
  toggle — silently carried into the next payment.
- Arming "send all funds" now shows the swept balance in the (disabled)
  amount field instead of a confusing 0; disarming or leaving the
  on-chain tab clears it.
- The scan modal no longer hides "Scan with camera" on plain-http desktop
  (browsers only allow getUserMedia on secure origins): the option stays
  visible with a one-line explanation, and choosing it surfaces the HTTPS
  requirement with photo/paste fallbacks. The companion app's native
  scanner path is untouched and still takes priority.
- What's New entry for v1.7.125-alpha.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-08-05 21:22:42 -04:00
co-authored by Claude Fable 5
parent d0d9c032de
commit c972419840
4 changed files with 84 additions and 8 deletions
+47 -5
View File
@@ -327,15 +327,57 @@ const isSweep = computed(() => sendMethod.value === 'onchain' && sendAll.value)
function toggleSendAll() {
sendAll.value = !sendAll.value
if (sendAll.value && onchainBalance.value === null) {
rpcClient.call<{ balance_sats: number }>({ method: 'lnd.getinfo', timeout: 5000 })
.then((res) => { onchainBalance.value = res.balance_sats || 0 })
.catch(() => { /* balance hint is best-effort */ })
if (!sendAll.value) {
// Disarming clears the field — a swept-balance figure left behind reads
// as a typed amount.
amount.value = 0
return
}
// Arming shows the swept balance IN the (disabled) amount field — a field
// stuck at 0 while "send all" is lit read as "sending nothing" (operator
// feedback 2026-08-05). Refresh the figure on every arm.
const applyBalance = () => {
if (sendAll.value && onchainBalance.value !== null) amount.value = onchainBalance.value
}
applyBalance()
rpcClient.call<{ balance_sats: number }>({ method: 'lnd.getinfo', timeout: 5000 })
.then((res) => { onchainBalance.value = res.balance_sats || 0; applyBalance() })
.catch(() => { /* balance hint is best-effort */ })
}
// Leaving the on-chain tab disarms the sweep so it can never apply elsewhere
watch(sendMethod, (m) => { if (m !== 'onchain') sendAll.value = false })
// (and drops the swept-balance figure it wrote into the amount field).
watch(sendMethod, (m) => {
if (m !== 'onchain' && sendAll.value) {
sendAll.value = false
amount.value = 0
}
})
// Every open starts from a blank slate. Stale state from the previous send —
// destination, amount, and above all an armed "send all funds" toggle — is
// dangerous to inherit invisibly (operator feedback 2026-08-05).
watch(() => props.show, (shown) => {
if (!shown) return
sendMethod.value = 'lightning'
amountUnit.value = 'sats'
amountEntry.value = 0
dest.value = ''
error.value = ''
successInfo.value = null
ecashToken.value = ''
sendAll.value = false
onchainBalance.value = null
feePreset.value = 'standard'
customConfTarget.value = null
customSatPerVbyte.value = null
resolvedFeeParams.value = {}
feeEstimate.value = null
confirming.value = false
confirmBalance.value = null
invoiceAmountSats.value = null
processing.value = false
})
// --- On-chain network fee: presets map to LND confirmation targets; custom
// --- takes a block target or an explicit sat/vB rate (rate wins).