diff --git a/src/index.html b/src/index.html index a1db5a7..ca677a8 100644 --- a/src/index.html +++ b/src/index.html @@ -18517,8 +18517,14 @@ const myPubkey = normalizePubkey(state.community.myPubkey); if (!myPubkey) return 'unknown'; if (normalized === myPubkey) return 'self'; - if (state.community.myFollows.includes(normalized)) return 'trusted'; - if (state.community.myExtendedFollows?.has(normalized)) return 'extended'; + const follows = Array.isArray(state.community.myFollows) ? state.community.myFollows : []; + if (follows.includes(normalized)) return 'trusted'; + // myExtendedFollows is a Set in memory but autosave serialises it as + // `{}`. Guard against the post-restore shape — otherwise this would + // throw inside the feed-row builder on every event and silently kill + // the whole rerender. + const ext = state.community.myExtendedFollows; + if (ext instanceof Set && ext.has(normalized)) return 'extended'; return 'unknown'; } @@ -20784,6 +20790,16 @@ wall.innerHTML = '
Loading…
'; const rerender = () => { + try { return rerenderInner(); } + catch (err) { + // Without this guard, a single throw inside the row builder / + // dedup / sort / diff path silently kills the whole feed — + // leaving the user staring at an empty wall with no clue + // anything went wrong. + console.warn('[feed] rerender threw — leaving wall as-is:', err); + } + }; + const rerenderInner = () => { const wallEl = $(`feedWall${tab}`); if (!wallEl) return; const typeFilter = _feedState[`filter${tab}`] || 'any'; @@ -24905,6 +24921,16 @@ }); normalizeDiscState(); normalizeJewelState(); + // JSON can't represent a Set — autosave round-trips Sets as `{}`. + // Re-init the community Sets so feed code (trustTierForPubkey, + // _blockedAuthors etc) gets the right shape after restore. + // fetchHop2Follows refills myExtendedFollows on next login. + if (!(state.community.myExtendedFollows instanceof Set)) { + state.community.myExtendedFollows = new Set(); + } + if (!Array.isArray(state.community.myFollows)) { + state.community.myFollows = []; + } if ((parsed.appMode || parsed.ui?.appMode) === 'designer') { loadCurrentDiscDesignLayers(); }