Full document, spreadsheet, slideshow, and diagram tooling
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'fix: stop repeated passphrase modals on doc editor pages' (#20) from fix/pds-sync-race into main

scott 384ea102 0dd2f362

+34 -13
+8 -4
src/lib/pds-setup.ts
··· 14 14 import { showPassphraseModal } from './key-passphrase.js'; 15 15 16 16 let _initialized = false; 17 + let _dismissed = false; 17 18 let _initPromise: Promise<boolean> | null = null; 18 19 19 20 /** 20 21 * Run the PDS identity check after sign-in. 21 22 * Returns true if identity is ready for PDS operations, false if sync is disabled 22 - * or user cancelled setup. Cached — safe to call multiple times. 23 + * or user cancelled/failed setup. Once dismissed, won't prompt again on this page. 23 24 */ 24 25 export function ensurePdsIdentity(): Promise<boolean> { 25 26 if (_initialized) return Promise.resolve(true); 27 + if (_dismissed) return Promise.resolve(false); 26 28 if (_initPromise) return _initPromise; 27 29 _initPromise = _doEnsurePdsIdentity(); 28 30 return _initPromise; ··· 54 56 return await promptSetup(session); 55 57 } 56 58 } finally { 57 - if (!_initialized) _initPromise = null; 59 + _initPromise = null; 58 60 } 59 61 } 60 62 61 63 async function promptSetup(session: AtmosSession): Promise<boolean> { 62 64 const passphrase = await showPassphraseModal('setup'); 63 - if (!passphrase) return false; 65 + if (!passphrase) { _dismissed = true; return false; } 64 66 65 67 try { 66 68 await setupIdentity(session.agent, session.did, passphrase); ··· 70 72 } catch (err) { 71 73 console.error('Identity setup failed:', err); 72 74 notify('PDS sync setup failed. Check console for details.', true); 75 + _dismissed = true; 73 76 return false; 74 77 } 75 78 } 76 79 77 80 async function promptRecovery(session: AtmosSession): Promise<boolean> { 78 81 const passphrase = await showPassphraseModal('unlock'); 79 - if (!passphrase) return false; 82 + if (!passphrase) { _dismissed = true; return false; } 80 83 81 84 try { 82 85 await recoverIdentity(session.agent, session.did, passphrase); ··· 86 89 } catch (err) { 87 90 console.error('Key recovery failed:', err); 88 91 notify('Key recovery failed — wrong passphrase?', true); 92 + _dismissed = true; 89 93 return false; 90 94 } 91 95 }
+26 -9
src/lib/provider.ts
··· 12 12 import { encrypt, decrypt } from './crypto.js'; 13 13 import { getDocument, updateDocument } from './local-store.js'; 14 14 import { isPdsReady, ensurePdsIdentity } from './pds-setup.js'; 15 - import { getSession } from './auth.js'; 15 + import { getSession, initAuth } from './auth.js'; 16 16 import { saveDocumentToPds } from './pds-documents.js'; 17 17 18 18 const SAVE_DEBOUNCE = 500; ··· 234 234 235 235 private _syncToPds(): void { 236 236 if (!isPdsReady()) { 237 - ensurePdsIdentity().then(ready => { 238 - if (!ready) return; 239 - const session = getSession(); 240 - if (!session) return; 241 - saveDocumentToPds(session.agent, session.did, this.roomId).catch(err => { 242 - console.warn('PDS sync failed (will retry on next save):', err); 243 - }); 244 - }); 237 + this._trySilentPdsInit(); 245 238 return; 246 239 } 247 240 const session = getSession(); ··· 249 242 250 243 saveDocumentToPds(session.agent, session.did, this.roomId).catch(err => { 251 244 console.warn('PDS sync failed (will retry on next save):', err); 245 + }); 246 + } 247 + 248 + private _pdsInitAttempted = false; 249 + 250 + private _trySilentPdsInit(): void { 251 + if (this._pdsInitAttempted) return; 252 + this._pdsInitAttempted = true; 253 + 254 + initAuth().then(session => { 255 + if (!session) return; 256 + import('./identity-keys.js').then(({ getIdentityKeyPair }) => { 257 + getIdentityKeyPair().then(keyPair => { 258 + if (!keyPair) return; 259 + import('./pds-setup.js').then(({ ensurePdsIdentity }) => { 260 + ensurePdsIdentity().then(ready => { 261 + if (!ready) return; 262 + saveDocumentToPds(session.agent, session.did, this.roomId).catch(err => { 263 + console.warn('PDS sync failed (will retry on next save):', err); 264 + }); 265 + }); 266 + }); 267 + }); 268 + }); 252 269 }); 253 270 } 254 271