feat(ui): dual-ecash wallet settings, buy-peer-files, seed backup, assorted fixes

- Tabbed Wallet Settings modal (Cashu + Fedimint) and dual-balance wallet card
- Buy a peer's paid file (ecash / node Lightning / on-chain / external QR)
- Recovery-phrase reveal + backup section; onboarding seed retry resilience
- NetBird HTTPS launch, remote-control two-finger scroll + external-open
- Shared BackButton, single-v version label, mesh Bitcoin header toggles

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-06-17 19:21:42 -04:00
co-authored by Claude Opus 4.8
parent bd567cd165
commit 87769cbfbf
46 changed files with 1527 additions and 283 deletions
+43 -1
View File
@@ -1,10 +1,36 @@
<script setup lang="ts">
import { ref } from 'vue'
import { ref, watch } from 'vue'
import { useMeshStore } from '@/stores/mesh'
import { rpcClient } from '@/api/rpc-client'
import ToggleSwitch from '@/components/ToggleSwitch.vue'
const mesh = useMeshStore()
// Bitcoin-headers-over-mesh send/receive toggles (issue #28). Initialized from
// mesh.status (which now carries the persisted prefs) and saved via mesh.configure.
const announceHeaders = ref(false)
const receiveHeaders = ref(true)
const headersSaving = ref(false)
watch(
() => mesh.status,
(s) => {
if (!s) return
if (typeof s.announce_block_headers === 'boolean') announceHeaders.value = s.announce_block_headers
if (typeof s.receive_block_headers === 'boolean') receiveHeaders.value = s.receive_block_headers
},
{ immediate: true, deep: true }
)
async function setAnnounceHeaders(v: boolean) {
announceHeaders.value = v
headersSaving.value = true
try { await mesh.configure({ announce_block_headers: v }) } catch { /* surfaced via store error */ } finally { headersSaving.value = false }
}
async function setReceiveHeaders(v: boolean) {
receiveHeaders.value = v
headersSaving.value = true
try { await mesh.configure({ receive_block_headers: v }) } catch { /* surfaced via store error */ } finally { headersSaving.value = false }
}
const txHexInput = ref('')
const bolt11Input = ref('')
const bolt11AmountInput = ref('')
@@ -120,6 +146,22 @@ async function handleRelayLightning() {
<span class="mesh-block-hash">{{ h.hash.slice(0, 12) }}...{{ h.hash.slice(-8) }}</span>
</div>
</div>
<!-- Header send/receive toggles (issue #28) -->
<div class="flex items-center justify-between gap-3 pt-3 mt-2 border-t border-white/10">
<div class="min-w-0">
<span class="mesh-bitcoin-label">Send headers</span>
<small class="mesh-bitcoin-hint">Broadcast new block headers to mesh peers (needs internet)</small>
</div>
<ToggleSwitch :model-value="announceHeaders" :disabled="headersSaving" @update:model-value="setAnnounceHeaders" />
</div>
<div class="flex items-center justify-between gap-3 pt-3">
<div class="min-w-0">
<span class="mesh-bitcoin-label">Receive headers</span>
<small class="mesh-bitcoin-hint">Accept block headers relayed by peers</small>
</div>
<ToggleSwitch :model-value="receiveHeaders" :disabled="headersSaving" @update:model-value="setReceiveHeaders" />
</div>
</div>
<!-- On-Chain / Lightning tabs -->