From d61b2be95db793d3d8d43b2158f5d514207cab09 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Thu, 10 Sep 2026 13:49:52 -0700 Subject: Profile page gets "Sign into another account" beside Log out. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The additive sign-in door lived only at the foot of the Accounts screen; the profile page — where people actually go looking for a way out of the current identity — offered just Log out. Now it carries the same button, via a shared signInAnother action on the feature ctx (clears the profile/chat state so the unlock screen's Back lands on the wallet, and the new identity doesn't open onto the old identity's profile). Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01URmfo8VimCNkw6Y7JndYrv --- src/app.js | 15 ++++++++++++--- src/features/messages.js | 9 +++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/app.js b/src/app.js index 9bedd2c..f555a6c 100644 --- a/src/app.js +++ b/src/app.js @@ -1316,6 +1316,16 @@ async function activateAccount(acc, opts = {}) { } // --- accounts ------------------------------------------------------------- + +// Open the unlock screen in ADDITIVE mode: the sign-in doors (Nostr signer, +// passkey, Google, pasted key/phrase) add the identity alongside the current +// accounts instead of replacing them, and Back returns to the wallet. Shared +// by the Accounts screen and the profile page. +function signInAnother() { + ui.fromWallet = true; ui.unlockError = ''; ui.unlockTab = 'import'; ui.screen = 'unlock'; + ui.profilePk = null; ui.profEdit = null; ui.profEditFilled = false; ui.chatOpen = false; + render(); +} // The working set of wallets you can switch between. Full (seed-bearing) // accounts live only in sessionStorage — ephemeral, wiped when the browser // closes (no seed on disk by default). Watch-only accounts hold just an xpub, @@ -2579,9 +2589,7 @@ function accountsScreen() { // ADDS the account alongside the current ones (fromWallet keeps them + a // Back). Switching between them afterwards is just tapping a row above. h('div', { class: 'col', style: 'gap:4px' }, - h('button', { class: 'btn-ghost btn-block', onClick: () => { - ui.fromWallet = true; ui.unlockError = ''; ui.unlockTab = 'import'; ui.screen = 'unlock'; render(); - } }, t('signInAnother')), + h('button', { class: 'btn-ghost btn-block', onClick: signInAnother }, t('signInAnother')), h('div', { class: 'small faint', style: 'padding:0 2px' }, t('signInAnotherNote'))), hasVault() ? h('button', { class: 'btn-ghost btn-block', onClick: startChangePw }, t('changePassword')) : null, h('button', { class: 'btn-ghost btn-block', onClick: () => { ui.confirmClear = true; render(); } }, t('clearAll')) @@ -4880,6 +4888,7 @@ const ctx = { // Routes through the Delete-all warning — never a single tap. // The popup has already shown the delete-everything warning by the time // this runs — wipe now and land on the front door. + signInAnother, logoutForget: () => { ui.profilePk = null; ui.profEdit = null; ui.profEditFilled = false; ui.chatOpen = false; ui.pubProf = null; diff --git a/src/features/messages.js b/src/features/messages.js index 1eb3e41..e85d5d7 100644 --- a/src/features/messages.js +++ b/src/features/messages.js @@ -2512,6 +2512,15 @@ export function messagesFeature(ctx) { } } }, t('profPostBtn')), h('button', { class: 'btn-ghost', onClick: () => { ui.profCompose = null; render(); } }, t('cancel')))), + // the non-destructive way out: add another identity (Nostr, + // passkey, Google) next to this one and switch between them + // on the Accounts screen — logout stays for actually leaving + ctx.signInAnother ? h('button', { + class: 'btn-block', style: 'display:flex;align-items:center;justify-content:center;gap:8px', + onClick: () => ctx.signInAnother(), + }, + h('span', { style: 'display:flex', html: '' }), + t('signInAnother')) : null, logoutBtn()) : ui.pubProf ? null // no wallet open: messaging and paying both need one -- cgit v1.2.3