Bluesky Repost Hider

"Hide Reposts" button for Bluesky

// ==UserScript==
// @name         Bluesky Repost Hider
// @description  "Hide Reposts" button for Bluesky
// @version      1.0
// @namespace    https://github.com/tmaster-terrarian/Userscripts/tree/main/Bluesky%20Repost%20Hider
// @match        https://bsky.app/profile/*
// @author       bscit
// @license      MIT
// @icon         https://www.google.com/s2/favicons?sz=64&domain=bsky.app
// @grant        GM_addStyle
// ==/UserScript==

GM_addStyle(`

.__toggle-button-holder {
    background-color: #000000;
}

.__toggle-button-holder .__toggle-button {
    flex-direction: row;
    align-items: center;
    justify-content: center;
    background-color: rgb(20, 27, 35);
    padding: 9px 12px;
    border-radius: 999px;
    gap: 6px;

    width: fit-content;
    margin: 0.875em 0.875em 6px;
}

.__toggle-button-holder .__toggle-button:hover {
    background-color: rgb(28, 39, 50);
}

.__toggle-button-holder .__toggle-button div {
    font-size: 0.765625em;
    letter-spacing: 0px;
    color: rgb(169, 183, 197);
    font-weight: 600;
    text-align: center;
    line-height: 14px;
    font-family: InterVariable, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
    font-variant: no-contextual;
}

.__repost {
    overflow: hidden;
    transition-property: opacity, max-height;
    transition-duration: 0.25s;
}

.__repost.__hide-repost {
    opacity: 0 !important;
    max-height: 0 !important;
}

html.theme--dim .__toggle-button-holder {
    background-color: #ffffff !important;
}
html.theme--light .__toggle-button-holder .__toggle-button {
    background-color: rgb(241, 243, 245) !important;
}
html.theme--light .__toggle-button-holder .__toggle-button:hover {
    background-color: rgb(226, 231, 236) !important;
}
html.theme--light .__toggle-button-holder .__toggle-button div {
    color: rgb(66, 87, 108) !important;
}

html.theme--dim .__toggle-button-holder {
    background-color: #161e27 !important;
}
html.theme--dim .__toggle-button-holder .__toggle-button {
    background-color: rgb(30, 41, 54) !important;
}
html.theme--dim .__toggle-button-holder .__toggle-button:hover {
    background-color: rgb(38, 53, 68) !important;
}
html.theme--dim .__toggle-button-holder .__toggle-button div {
    color: rgb(174, 187, 201) !important;
}

`);

(function() {
    'use strict';

    // Your code here...

    let hidden = null;

    let feedItems = [];
    let lastFeedLength = 0;

    let profileHandle = window.location.href.replace("https://bsky.app/profile/", "");
    const _extraPathIndex = profileHandle.indexOf("/");
    if(_extraPathIndex !== -1)
    {
        profileHandle = profileHandle.substring(0, _extraPathIndex);
    }

    const toggleButtonContent = document.createElement("div");
    toggleButtonContent.innerText = hidden ? "Show Reposts" : "Hide Reposts";

    const Apply = (changed = false) => {
        const arr = Array.from(feedItems);
        let scroll = 0;
        arr.forEach((element, i) => {
            if(i == 0 || i == arr.length - 1 || i == arr.length - 2) return;

            if(!element.firstElementChild) return;

            const childElement = element.firstElementChild.firstElementChild;
            if(!childElement) return;

            const attribute = childElement.getAttribute("data-testid");
            if(attribute === null) return;

            if(attribute.replace("feedItem-by-", "") == profileHandle) return;

            childElement.classList.add("__repost");

            const isAbove = (childElement.getBoundingClientRect().bottom < (window.innerHeight / 2));

            if(hidden) {
                childElement.classList.add("__hide-repost");
                childElement.style.maxHeight = "0";

                if(changed && isAbove) scroll -= childElement.scrollHeight;
            }
            else {
                childElement.classList.remove("__hide-repost");
                childElement.style.maxHeight = childElement.scrollHeight + "px";

                if(changed && isAbove) scroll += childElement.scrollHeight;
            }

            toggleButtonContent.innerText = hidden ? "Show Reposts" : "Hide Reposts";
        });

        // if(changed)
        // {
        //     window.scrollBy({
        //         left: 0,
        //         top: scroll,
        //         behavior: "instant"
        //     });
        // }
    };

    setInterval(() => {
        if(lastFeedLength != feedItems.length)
        {
            Apply();
        }
        lastFeedLength = feedItems.length;
    }, 250);

    let smallWindow = false;
    window.addEventListener("resize", (event) => {
        if(!smallWindow && window.innerWidth < 800)
        {
            smallWindow = true;
            Apply();
        }
        else if(smallWindow && window.innerWidth >= 800)
        {
            smallWindow = false;
            Apply();
        }
    });

    const toggleElement = document.createElement("div");
    toggleElement.classList.add("css-175oi2r");
    toggleElement.classList.add("r-18u37iz");
    toggleElement.classList.add("__toggle-button-holder");

    const toggleButton = document.createElement("button");
    toggleButton.classList.add("css-175oi2r");
    toggleButton.classList.add("r-1loqt21");
    toggleButton.classList.add("r-1otgn73");
    toggleButton.classList.add("__toggle-button");
    toggleButton.setAttribute("type", "button");
    toggleButton.setAttribute("role", "button");
    toggleButton.addEventListener("click", (event) => {
        if(hidden == null) return;

        hidden = !hidden;
        Apply(true);
    });

    toggleButtonContent.classList.add("css-146c3p1");
    toggleButton.appendChild(toggleButtonContent);

    toggleElement.appendChild(toggleButton);

    let attempts = 0;
    const TrySetup = () => {
        if(attempts >= 5) return false;
        setTimeout(() => {
            attempts++;
            try
            {
                feedItems = document.querySelector(".css-175oi2r.r-sa2ff0").children;
            }
            catch(err)
            {
                console.error(err);
                if(!TrySetup()) console.error("Too many failed attempts to initialize Bluesky Repost Hider; aborting");
                return;
            }
            lastFeedLength = feedItems.length;
            hidden = false;

            const header = document.querySelector(".css-175oi2r.r-gtdqiz.r-ipm5af.r-184en5c").firstElementChild.parentNode;
            header.insertBefore(toggleElement, header.firstElementChild);

            Apply();
        }, 1000);
        return true;
    };
    TrySetup();
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址