fix(chat): stop blanking a conversation (and wiping its cache) on a failed thread fetch
THE disappearing-messages root cause. openConvo did: let msgs=[]; try{ msgs=fetch()
}catch{}; THREAD = Array.isArray(msgs)?msgs:[]. On a flaky desktop network a failed
fetch left msgs=[] (still an array) → THREAD=[] AND THREAD_CACHE.set(ckey,[]) — so
reopening a chat blanked it AND overwrote the cache, making messages vanish and stay
gone even though they persist server-side (confirmed: 982 DMs, zero dangling ids).
Now msgs stays null on a failed/non-OK fetch; we only replace THREAD/cache on a real
array response, and otherwise keep the cached render instead of blanking.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+13
-3
@@ -788,7 +788,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<script src="/icons.js?v=4"></script>
|
<script src="/icons.js?v=4"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/@twemoji/api@15.1.0/dist/twemoji.min.js" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/@twemoji/api@15.1.0/dist/twemoji.min.js" crossorigin="anonymous"></script>
|
||||||
<script>window.__BUILD='2026-07-07-batch44';console.log('%cBiz Connect','color:#1F3B73;font-weight:bold','build '+window.__BUILD);
|
<script>window.__BUILD='2026-07-07-batch45';console.log('%cBiz Connect','color:#1F3B73;font-weight:bold','build '+window.__BUILD);
|
||||||
// Render modern (Twemoji) emojis in place of the OS's flat ones. No-op if the CDN didn't load
|
// Render modern (Twemoji) emojis in place of the OS's flat ones. No-op if the CDN didn't load
|
||||||
// (emojis stay as plain Unicode). (#5)
|
// (emojis stay as plain Unicode). (#5)
|
||||||
function twemojify(el){ try{ if(el && window.twemoji) window.twemoji.parse(el, { folder:'svg', ext:'.svg' }); }catch(_){} }</script>
|
function twemojify(el){ try{ if(el && window.twemoji) window.twemoji.parse(el, { folder:'svg', ext:'.svg' }); }catch(_){} }</script>
|
||||||
@@ -1795,9 +1795,19 @@ async function openConvo(kind,id){
|
|||||||
if(!selected||selected.kind!==kind||selected.id!==id) return;
|
if(!selected||selected.kind!==kind||selected.id!==id) return;
|
||||||
wireMentions();
|
wireMentions();
|
||||||
const url=kind==='group'?('/api/messages/thread?group='+encodeURIComponent(id)):('/api/messages/thread?with='+encodeURIComponent(id));
|
const url=kind==='group'?('/api/messages/thread?group='+encodeURIComponent(id)):('/api/messages/thread?with='+encodeURIComponent(id));
|
||||||
let msgs=[]; try{ msgs=await fetch(url).then(r=>r.json()); }catch(_){}
|
// msgs stays null on a failed/non-OK fetch (distinct from a genuinely empty [] thread), so a flaky
|
||||||
|
// desktop network can't be mistaken for "no messages".
|
||||||
|
let msgs=null; try{ const r=await fetch(url); if(r.ok) msgs=await r.json(); }catch(_){}
|
||||||
if(!selected||selected.kind!==kind||selected.id!==id) return; // switched away while loading
|
if(!selected||selected.kind!==kind||selected.id!==id) return; // switched away while loading
|
||||||
THREAD=Array.isArray(msgs)?msgs:[];
|
if(!Array.isArray(msgs)){
|
||||||
|
// Fetch failed / errored — DO NOT blank the chat or overwrite the cache (that wiped messages that
|
||||||
|
// are still safely on the server → the "messages disappear after reopen" bug). Keep the cached
|
||||||
|
// render; only show empty if we truly have nothing cached to fall back to.
|
||||||
|
if(!THREAD_CACHE.has(ckey)){ THREAD=[]; renderThread(); }
|
||||||
|
const inp0=document.getElementById('msgInput'); if(inp0) inp0.focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
THREAD=msgs;
|
||||||
THREAD_CACHE.set(ckey, THREAD.slice());
|
THREAD_CACHE.set(ckey, THREAD.slice());
|
||||||
renderThread();
|
renderThread();
|
||||||
// #3: if there were unread messages, drop a "New messages" divider, scroll to the first unread,
|
// #3: if there were unread messages, drop a "New messages" divider, scroll to the first unread,
|
||||||
|
|||||||
Reference in New Issue
Block a user