From 85532155a6bcb501784879014c6c386b37dc5f7b Mon Sep 17 00:00:00 2001 From: martbost Date: Tue, 8 Sep 2026 13:57:35 -0500 Subject: [PATCH] Make wallet disconnect not hang AppKit's modal.disconnect() can stall on the WalletConnect relay (mobile), leaving the Disconnect button spinning forever ("just loads and says disconnect") and never reaching the reload. Race the disconnect against a 1.2s timeout, and fire-and-forget from the button with a guaranteed reload that drops in-memory wallet state so the picker returns. Co-Authored-By: Claude Opus 4.8 --- public/assets/my.js | 11 ++++++----- public/assets/wallet.js | 4 +++- public/my.html | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/public/assets/my.js b/public/assets/my.js index ff8e273..b6e5b4d 100644 --- a/public/assets/my.js +++ b/public/assets/my.js @@ -1429,11 +1429,12 @@ IAP.status('Faucet opened in a new tab. Choose Polygon Amoy, paste your address, and request test POL.', 'ok'); })); if ($('wcDisconnect')) $('wcDisconnect').addEventListener('click', busy($('wcDisconnect'), async () => { - try { await IAPWallet.disconnect(); } catch (e) {} - $('wcDisconnectInfo').textContent = 'Disconnected. Reloading so you can pick a different wallet…'; - IAP.status('Wallet disconnected. Reloading…', 'ok'); - // reload to drop any in-memory WalletConnect state so the picker reappears - setTimeout(() => location.reload(), 700); + // fire-and-forget: don't gate the reload on disconnect resolving (it can + // stall). The reload drops all in-memory wallet state and the picker returns. + IAPWallet.disconnect().catch(() => {}); + $('wcDisconnectInfo').textContent = 'Disconnecting — reloading so you can pick a different wallet…'; + IAP.status('Disconnecting — reloading…', 'ok'); + setTimeout(() => location.reload(), 900); })); $('activateBtn').addEventListener('click', busy($('activateBtn'), async () => { const me = await (await fetch('/api/me')).json(); diff --git a/public/assets/wallet.js b/public/assets/wallet.js index 3575b0a..48ada81 100644 --- a/public/assets/wallet.js +++ b/public/assets/wallet.js @@ -186,7 +186,9 @@ window.IAPWallet = (function () { } async function disconnect() { - try { if (modal && modal.disconnect) await modal.disconnect(); } catch (e) {} + // AppKit's disconnect can hang on the WalletConnect relay (esp. mobile) — + // never block on it, so the UI can't get stuck "disconnecting". + try { if (modal && modal.disconnect) await Promise.race([modal.disconnect(), new Promise(r => setTimeout(r, 1200))]); } catch (e) {} provider = null; try { Object.keys(localStorage).forEach(k => { if (/wc@2|walletconnect|w3m|wcm|reown|wagmi|appkit/i.test(k)) localStorage.removeItem(k); }); } catch (e) {} } diff --git a/public/my.html b/public/my.html index 1a58743..ffd3bc7 100644 --- a/public/my.html +++ b/public/my.html @@ -696,7 +696,7 @@ - +