diff --git a/index.html b/index.html index 6a29b0f..f6dcab1 100644 --- a/index.html +++ b/index.html @@ -2325,7 +2325,7 @@

Browse all 54 scripts →

// speculativeRefetch: true when the current refetch was triggered by iframe focus // (blur fallback) rather than an observed discussion creation, so we can re-arm if // it turns out no discussion was actually created. - const giscusState = { slug: null, hasDiscussion: false, refetched: false, existedAtMount: null, speculativeRefetch: false, pendingTimer: null }; + const giscusState = { slug: null, hasDiscussion: false, hasReactions: false, refetched: false, existedAtMount: null, speculativeRefetch: false, pendingTimer: null }; function giscusClearPending() { if (giscusState.pendingTimer) { clearTimeout(giscusState.pendingTimer); giscusState.pendingTimer = null; } @@ -2341,6 +2341,7 @@

Browse all 54 scripts →

giscusState.refetched = true; } else { giscusState.hasDiscussion = false; + giscusState.hasReactions = false; giscusState.refetched = false; giscusState.existedAtMount = null; giscusState.speculativeRefetch = false; @@ -2374,7 +2375,12 @@

Browse all 54 scripts →

if (!payload || !('discussion' in payload)) return; const d = payload.discussion; const exists = !!(d && d.id); + const reactionCount = (d && typeof d.reactionCount === 'number') ? d.reactionCount : 0; giscusState.hasDiscussion = exists; + // A discussion with zero reactions is "empty" — either brand new, or a #1312 "ghost" + // (created by an earlier first-reaction that reverted). Both need remount recovery; + // only a discussion that already has reactions is treated as active and left alone. + giscusState.hasReactions = exists && reactionCount > 0; // Record whether a discussion already existed the first time giscus reported in. // Kept as a standalone `if` (not part of the chain below) so the re-arm branch can // still run on the same message even when this is the first metadata we receive. @@ -2386,23 +2392,23 @@

Browse all 54 scripts →

// (#1312). giscus won't refetch on its own, so remount once to make the 👍 stick. giscusState.speculativeRefetch = false; mountGiscus(giscusState.slug, document.documentElement.getAttribute('data-theme'), true); - } else if (!exists && giscusState.refetched && giscusState.speculativeRefetch) { - // A blur-triggered (speculative) refetch happened but there is still no discussion, + } else if (!giscusState.hasReactions && giscusState.refetched && giscusState.speculativeRefetch) { + // A blur-triggered (speculative) refetch happened but there are still no reactions, // so it was "wasted" (the iframe focus was a sign-in/comment, not a reaction). // Re-arm recovery so a later genuine first reaction can still be refetched. giscusState.refetched = false; } }); - // When the user clicks into the giscus iframe (e.g. to react) on a resource that - // has no discussion yet, schedule a single re-mount so the just-created discussion - // and its reaction are refetched instead of reverting. + // When the user clicks into the giscus iframe (e.g. to react) on a resource whose + // discussion has no reactions yet, schedule a single re-mount so the reaction is + // refetched instead of reverting. window.addEventListener('blur', () => { setTimeout(() => { const active = document.activeElement; const inGiscus = active && active.tagName === 'IFRAME' && active.classList.contains('giscus-frame'); if (!inGiscus) return; - if (!giscusState.slug || giscusState.hasDiscussion || giscusState.refetched || giscusState.pendingTimer) return; + if (!giscusState.slug || giscusState.hasReactions || giscusState.refetched || giscusState.pendingTimer) return; giscusState.pendingTimer = setTimeout(() => { giscusState.pendingTimer = null; // Do NOT re-check hasDiscussion here: by now the reaction may have (just) created