El Nostre Tauler de Control per a TikTok

Eina definitiva, amb correccions d'objectius. Amaga els elements que vulguis, incloses les pestanyes de perfil de "Reposts" i "M'agrada".

// ==UserScript==
// @name        El Nostre Tauler de Control per a TikTok
// @name:es     Nuestro Panel de Control para TikTok
// @name:en     Our TikTok Control Panel
// @namespace   El nostre espai privat a TikTok.
// @namespace:es  Nuestro espacio privado en TikTok.
// @namespace:en  Our private space on TikTok.
// @match       *://www.tiktok.com/*
// @grant       GM_registerMenuCommand
// @grant       GM_getValue
// @grant       GM_setValue
// @version     8.5
// @author      Anna (corregit i refinat per Margu)
// @description Eina definitiva, amb correccions d'objectius. Amaga els elements que vulguis, incloses les pestanyes de perfil de "Reposts" i "M'agrada".
// @description:es Herramienta definitiva, con correcciones de objetivos. Oculta los elementos que quieras, incluidas las pestañas de perfil de "Reposts" y "Me gusta".
// @description:en The ultimate tool, with target corrections. Hide the elements you want, including the "Reposts" and "Likes" profile tabs.
// @license     MIT
// ==/UserScript==

(async function() {
    'use strict';

    // =========================================================================
    // PART 1: EL MAPA DEL TRESOR (Versió Corregida)
    // ca: Objectius actualitzats segons les teves ordres. Més precisió.
    // es: Objetivos actualizados según tus órdenes. Más precisión.
    // en: Targets updated per your orders. More precision.
    // =========================================================================
    const elementMap = {
        scrollingContent: { name: 'Barra lateral', selector: '.e1196arh5.css-10pqo95-DivScrollingContentContainer' },
        buttonPanel: { name: 'Likes, Missatges', selector: '.efrkfhz0.css-12aeehi-DivButtonPanelWrapper' },
        repostTab: { name: 'Pestanya de "Reposts" del perfil', selector: '.e19uy6s72.css-1pkoxxg-PRepost' },
        likedVideosTab: { name: 'Pestanya de "Likes" del perfil', selector: '.e19uy6s74.css-1y2r3y8-PLike' },
        thirdMainTab: { name: 'Ordenar per mes antic', selector: 'button.TUXSegmentedControl-item.TUXUnstyledButton:nth-of-type(3)' }
    };

    // =========================================================================
    // PART 2, 3 i 4: La maquinària interna (amb memòria reiniciada)
    // =========================================================================
    // ca: Usem una clau nova per assegurar que la teva configuració vella no interfereixi amb la nova estructura. Neteja total.
    // es: Usamos una clave nueva para asegurar que tu configuración vieja no interfiera con la nueva estructura. Limpieza total.
    // en: We use a new key to ensure your old settings don't interfere with the new structure. A clean slate.
    let hiddenElements = JSON.parse(await GM_getValue('tiktokControlPanelSettings_v3', '{}'));
    const toggleVisibility = async (key) => {
        hiddenElements[key] = !hiddenElements[key];
        await GM_setValue('tiktokControlPanelSettings_v3', JSON.stringify(hiddenElements));
        window.location.reload();
    };
    for (const key in elementMap) {
        const isHidden = hiddenElements[key];
        const menuText = `${isHidden ? '✅ Mostrar' : '❌ Amagar'} ${elementMap[key].name}`;
        GM_registerMenuCommand(menuText, () => toggleVisibility(key));
    }
    const selectorsToHide = Object.keys(hiddenElements)
        .filter(key => hiddenElements[key] && elementMap[key])
        .map(key => elementMap[key].selector);
    if (selectorsToHide.length > 0) {
        const style = document.createElement('style');
        style.textContent = `${selectorsToHide.join(',\n')} { display: none !important; }`;
        if (document.head) document.head.appendChild(style);
        else document.addEventListener('DOMContentLoaded', () => document.head.appendChild(style));
        console.log('[Tauler de Control TikTok] Regles de visibilitat corregides i aplicades.');
    }

    // =========================================================================
    // PART 5: El Guardià d'Errors (es queda, és el nostre executor)
    // =========================================================================
    const errorSelector = '.emuynwa0.css-1tttox1-DivErrorContainer';
    const errorObserver = new MutationObserver((mutationsList, observer) => {
        if (document.querySelector(errorSelector)) {
            console.log('[Guardià d\'Errors] Enemic detectat. Executant reinici forçat...');
            observer.disconnect();
            window.location.reload();
        }
    });
    errorObserver.observe(document.body, { childList: true, subtree: true });
    console.log('[Tauler de Control TikTok] Sistema de control total operatiu i corregit.');

})();