Greasy Fork

Cambiar Orden por defecto de los bundles de Fanatical

Fanatical lo pone por defecto como "Más vendidos". No, no, quiero ver lo más reciente, que si no no me entero de qué hay nuevo

目前为 2025-03-01 提交的版本。查看 最新版本

// ==UserScript==
// @name         Cambiar Orden por defecto de los bundles de Fanatical
// @name:en      Change default sorting on bundles page
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  Fanatical lo pone por defecto como "Más vendidos". No, no, quiero ver lo más reciente, que si no no me entero de qué hay nuevo
// @description:en By default Fanatical sorts by Popular. I'd like to see what's new so this does it. No more missing bundles.
// @author       LinxESP
// @match        *://www.fanatical.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Valores predeterminados
    const defaultConfig = {
        sortValue: "latest_deals",
        delayTime: 100
    };

    // Obtener la configuración guardada o usar valores predeterminados
    function getConfig() {
        return {
            sortValue: GM_getValue('sortValue', defaultConfig.sortValue),
            delayTime: GM_getValue('delayTime', defaultConfig.delayTime)
        };
    }

    // Guardar configuración
    function setConfig(config) {
        GM_setValue('sortValue', config.sortValue);
        GM_setValue('delayTime', config.delayTime);
    }

    // Configuración actual
    const config = getConfig();

    // Registrar comandos de menú para cambiar la configuración
    GM_registerMenuCommand('⚙️ Configurar valor de ordenamiento', function() {
        const options = [
            {value: "", label: "Top Sellers"},
            {value: "price_asc", label: "Price: Low to High"},
            {value: "price_desc", label: "Price: High to Low"},
            {value: "name", label: "Alphabetical"},
            {value: "discount", label: "Top Discount"},
            {value: "latest_deals", label: "Latest Deals"},
            {value: "ending_soon", label: "Ending Soon"},
            {value: "most_wanted", label: "Most Wanted"},
            {value: "release_date_desc", label: "Release: Newest"}
        ];
        
        let optionsText = "Selecciona el orden por defecto:\n";
        options.forEach((opt, index) => {
            optionsText += `${index}. ${opt.label}\n`;
        });
        
        const selection = prompt(optionsText, config.sortValue);
        if (selection !== null) {
            // Comprobar si es un número (índice) o un valor directo
            if (!isNaN(selection) && selection >= 0 && selection < options.length) {
                config.sortValue = options[parseInt(selection)].value;
            } else {
                // Verificar si el valor ingresado es válido
                const validOption = options.find(opt => opt.value === selection);
                if (validOption) {
                    config.sortValue = selection;
                } else {
                    alert('Valor no válido. Por favor selecciona una opción válida.');
                    return;
                }
            }
            setConfig(config);
            alert(`Valor de ordenamiento cambiado a: ${config.sortValue}`);
        }
    });

    GM_registerMenuCommand('⏱️ Configurar tiempo de retraso (ms)', function() {
        const newDelay = prompt('Ingresa el tiempo de retraso en milisegundos:', config.delayTime);
        if (newDelay !== null) {
            const delay = parseInt(newDelay);
            if (!isNaN(delay) && delay >= 0) {
                config.delayTime = delay;
                setConfig(config);
                alert(`Tiempo de retraso cambiado a: ${delay}ms`);
            } else {
                alert('Por favor ingresa un número válido mayor o igual a 0.');
            }
        }
    });

    // Función para cambiar el valor del menú desplegable
    function changeDropdownValue() {
        const selectElement = document.querySelector('.dropdown-container.sort-by select');
        
        if (selectElement) {
            // Usar el valor de configuración
            selectElement.value = config.sortValue;
            
            // Disparar evento de cambio para asegurar que el sitio detecte el cambio
            selectElement.dispatchEvent(new Event('change', { bubbles: true }));
            
            console.log(`La opción de ordenamiento ha sido cambiada a: ${config.sortValue}`);
            return true;
        }
        return false;
    }

    // Esperar a que el DOM esté completamente cargado
    window.addEventListener('load', function() {
        // Intento inicial
        if (!changeDropdownValue()) {
            console.log('No se encontró el elemento del menú desplegable, reintentando...');
            
            // Intentar después del retraso configurado
            setTimeout(function() {
                if (!changeDropdownValue()) {
                    console.log('No se pudo encontrar el elemento después del retraso configurado');
                }
            }, config.delayTime);
        }
    });
})();