Files
2025-05-09 18:53:07 +08:00

78 lines
2.9 KiB
JavaScript

function createOrUpdateBadge(hiddenCount) {
let badge = document.getElementById("cgpt-hide-badge");
if (!badge) {
badge = document.createElement("div");
badge.id = "cgpt-hide-badge";
badge.style.position = "fixed";
badge.style.bottom = "20px";
badge.style.right = "20px";
badge.style.zIndex = "99999";
badge.style.background = "rgba(0,0,0,0.8)";
badge.style.color = "#fff";
badge.style.padding = "8px 16px";
badge.style.borderRadius = "20px";
badge.style.fontSize = "14px";
badge.style.boxShadow = "0 2px 8px rgba(0,0,0,0.2)";
badge.style.userSelect = "none";
badge.style.pointerEvents = "none";
document.body.appendChild(badge);
}
badge.textContent = `Hidden: ${hiddenCount}`;
}
(function hideAllButRecentConversationTurns() {
const SHOW_LAST_N = 30; // Number of most recent turns to show
function hideOldTurns() {
const articles = Array.from(
document.querySelectorAll(
'article[data-testid^="conversation-turn-"]'
)
);
// Extract numeric IDs and sort
const sorted = articles
.map((article) => ({
el: article,
id: parseInt(
article
.getAttribute("data-testid")
.replace("conversation-turn-", ""),
10
),
}))
.filter((item) => !isNaN(item.id))
.sort((a, b) => a.id - b.id);
// Hide all except the last N
const toHide = sorted.slice(0, -SHOW_LAST_N);
toHide.forEach((item) => {
item.el.style.display = "none";
});
// Show the most recent N
const toShow = sorted.slice(-SHOW_LAST_N);
toShow.forEach((item) => {
item.el.style.display = "";
});
createOrUpdateBadge(toHide.length);
}
// Wait for all articles to load first
function waitForArticlesAndHide() {
const observer = new MutationObserver((mutations, obs) => {
const articles = document.querySelectorAll(
'article[data-testid^="conversation-turn-"]'
);
// If articles exist and no new articles are being added for a short period, proceed
if (articles.length > 0) {
// Wait 1 second after the last mutation to ensure loading is done
clearTimeout(window.__hideTurnsTimeout);
window.__hideTurnsTimeout = setTimeout(() => {
hideOldTurns();
obs.disconnect();
// Re-observe for future loads (e.g., when user scrolls up)
waitForArticlesAndHide();
}, 1000);
}
});
observer.observe(document.body, { childList: true, subtree: true });
}
waitForArticlesAndHide();
})();