fix(ui): reliable federation-join feedback (90s timeout + re-check + success)
Joining a Fedimint federation is heavy and routinely outlasts the default 15s client timeout while still succeeding server-side, so the UI wrongly showed failure. Bump the join timeout to 90s, and on any error re-check the list: if a new federation appeared the join worked — show 'Federation joined.' instead of a misleading error. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
63611a4453
commit
af816c61a5
@ -120,6 +120,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="fedError" class="mb-3 alert-error">{{ fedError }}</div>
|
<div v-if="fedError" class="mb-3 alert-error">{{ fedError }}</div>
|
||||||
|
<div v-if="fedJoinedOk" class="mb-3 text-xs text-green-400">Federation joined.</div>
|
||||||
|
|
||||||
<div class="flex gap-3 mt-4">
|
<div class="flex gap-3 mt-4">
|
||||||
<button @click="close" class="flex-1 glass-button px-4 py-2 rounded-lg text-sm">{{ t('common.close') }}</button>
|
<button @click="close" class="flex-1 glass-button px-4 py-2 rounded-lg text-sm">{{ t('common.close') }}</button>
|
||||||
@ -178,6 +179,7 @@ const federations = ref<Federation[]>([])
|
|||||||
const inviteCode = ref('')
|
const inviteCode = ref('')
|
||||||
const joiningFed = ref(false)
|
const joiningFed = ref(false)
|
||||||
const fedError = ref('')
|
const fedError = ref('')
|
||||||
|
const fedJoinedOk = ref(false)
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => props.show,
|
() => props.show,
|
||||||
@ -259,18 +261,36 @@ async function loadFederations() {
|
|||||||
|
|
||||||
async function joinFederation() {
|
async function joinFederation() {
|
||||||
if (!fedimintBackendReady || !inviteCode.value.trim()) return
|
if (!fedimintBackendReady || !inviteCode.value.trim()) return
|
||||||
|
const before = federations.value.length
|
||||||
joiningFed.value = true
|
joiningFed.value = true
|
||||||
fedError.value = ''
|
fedError.value = ''
|
||||||
|
fedJoinedOk.value = false
|
||||||
try {
|
try {
|
||||||
await rpcClient.call<{ federation_id: string }>({
|
await rpcClient.call<{ federation_id: string }>({
|
||||||
method: 'wallet.fedimint-join',
|
method: 'wallet.fedimint-join',
|
||||||
params: { invite_code: inviteCode.value.trim() },
|
params: { invite_code: inviteCode.value.trim() },
|
||||||
|
// Joining a federation is heavy (downloads the federation config + joins
|
||||||
|
// the consensus); it routinely takes longer than the default 15s. Give it
|
||||||
|
// headroom past the backend's own 60s clientd timeout.
|
||||||
|
timeout: 90000,
|
||||||
})
|
})
|
||||||
inviteCode.value = ''
|
inviteCode.value = ''
|
||||||
await loadFederations()
|
await loadFederations()
|
||||||
|
fedJoinedOk.value = true
|
||||||
emit('changed')
|
emit('changed')
|
||||||
} catch (err: unknown) {
|
} catch (err: unknown) {
|
||||||
fedError.value = err instanceof Error ? err.message : 'Failed to join federation'
|
// A slow join often still completes server-side after the client gives up,
|
||||||
|
// so don't cry failure blindly — re-check the list. If a new federation
|
||||||
|
// appeared, the join actually worked; surface success instead of a scary
|
||||||
|
// (and wrong) timeout error.
|
||||||
|
await loadFederations()
|
||||||
|
if (federations.value.length > before) {
|
||||||
|
inviteCode.value = ''
|
||||||
|
fedJoinedOk.value = true
|
||||||
|
emit('changed')
|
||||||
|
} else {
|
||||||
|
fedError.value = err instanceof Error ? err.message : 'Failed to join federation'
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
joiningFed.value = false
|
joiningFed.value = false
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user