mydealz Sortierung merken

Speichert und wendet automatisch die letzte Sortierungsoption bei mydealz.de an

// ==UserScript==
// @name         mydealz Sortierung merken
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Speichert und wendet automatisch die letzte Sortierungsoption bei mydealz.de an
// @author       You
// @match        https://www.mydealz.de/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Debug-Modus für bessere Fehlersuche
    const DEBUG = true;

    function log(message) {
        if (DEBUG) {
            console.log('[Mydealz Sort] ' + message);
        }
    }

    // Funktion, um URL-Parameter zu bekommen
    function getURLParameter(url, name) {
        const params = new URLSearchParams(new URL(url).search);
        return params.get(name);
    }

    // Funktion, um die aktuelle Seite zu prüfen
    function isSearchPage() {
        return window.location.pathname.includes('/search');
    }

    // Funktion, die nach dem Suchformular sucht und es modifiziert
    function setupSearchFormInterception() {
        log('Suche nach Suchformularen...');

        // Bereits verarbeitete Formulare
        const processedForms = new Set();

        // Prüfen, ob ein Formular bereits verarbeitet wurde
        function isProcessed(form) {
            return form.dataset.sortingModified === 'true';
        }

        // Funktion zur Verarbeitung der Formulare
        function processForms() {
            // Gezielter Selektor für das Suchformular
            const searchForms = document.querySelectorAll('form[action*="/search"]');

            if (searchForms.length > 0) {
                let foundNewForm = false;

                searchForms.forEach((form, index) => {
                    // Prüfen, ob dieses Formular bereits verarbeitet wurde
                    if (isProcessed(form)) return;

                    // Markieren, dass wir dieses Formular verarbeitet haben
                    form.dataset.sortingModified = 'true';
                    foundNewForm = true;

                    log(`Verarbeite Suchformular #${index + 1}`);

                    // Event-Listener für das Formular hinzufügen
                    form.addEventListener('submit', function(e) {
                        // Die gespeicherte Sortierung abrufen
                        const savedSort = localStorage.getItem('mydealz_preferred_sort');

                        if (savedSort) {
                            log(`Füge Sortierung "${savedSort}" zur Suchanfrage hinzu`);

                            // Prüfen, ob bereits ein sortBy-Feld vorhanden ist
                            let sortByInput = form.querySelector('input[name="sortBy"]');

                            // Wenn kein sortBy-Feld existiert, eines erstellen
                            if (!sortByInput) {
                                sortByInput = document.createElement('input');
                                sortByInput.type = 'hidden';
                                sortByInput.name = 'sortBy';
                                form.appendChild(sortByInput);
                            }

                            // Den Wert setzen
                            sortByInput.value = savedSort;
                        }
                    });

                    log(`Suchformular #${index + 1} wurde konfiguriert`);
                });

                // Nur wenn keine neuen Formulare gefunden wurden und der Observer noch existiert
                if (!foundNewForm && observer) {
                    // Verzögerung, um weitere Änderungen abzuwarten
                    clearTimeout(observerTimeoutId);
                    observerTimeoutId = setTimeout(() => {
                        if (observer) {
                            observer.disconnect();
                            observer = null; // Wichtig: Observer auf null setzen
                            log('Observer beendet, alle Formulare gefunden');
                        }
                    }, 2000);
                }
            }
        }

        // Variablen für Observer-Verwaltung
        let observer = null;
        let observerTimeoutId = null;
        let finalTimeoutId = null;

        // Initial nach Formularen suchen
        processForms();

        // Beobachter für dynamisch geladene Elemente
        observer = new MutationObserver(() => {
            processForms();
        });

        // Beobachten des gesamten Dokuments
        observer.observe(document.documentElement, {
            childList: true,
            subtree: true
        });

        // Sicherheitsabschaltung nach 10 Sekunden
        finalTimeoutId = setTimeout(() => {
            if (observer) {
                observer.disconnect();
                observer = null;
                log('Observer nach 10 Sekunden Timeout beendet');
            }

            // Auch etwaige offene Timeouts aufräumen
            if (observerTimeoutId) {
                clearTimeout(observerTimeoutId);
                observerTimeoutId = null;
            }
        }, 10000);
    }

    // Hauptfunktion zum Behandeln der aktuellen Seite
    function handlePage() {
        if (isSearchPage()) {
            // Hole die aktuelle Sortierung aus der URL
            const currentSort = getURLParameter(window.location.href, 'sortBy');

            // Wenn eine Sortierung vorhanden ist, speichere sie
            if (currentSort) {
                localStorage.setItem('mydealz_preferred_sort', currentSort);
                log('Sortierung gespeichert: ' + currentSort);
            } else {
                // Wenn keine Sortierung gesetzt ist, aber eine gespeicherte existiert
                const savedSort = localStorage.getItem('mydealz_preferred_sort');

                if (savedSort && !window.location.href.includes('sortBy=')) {
                    // Baue die neue URL mit der gespeicherten Sortierung
                    let newUrl = window.location.href;
                    const separator = newUrl.includes('?') ? '&' : '?';
                    newUrl += separator + 'sortBy=' + savedSort;

                    // Umleitung zur neuen URL
                    log('Wende Sortierung an, leite um zu: ' + newUrl);
                    // Kleine Verzögerung hinzufügen
                    setTimeout(() => {
                        window.location.href = newUrl;
                    }, 100);
                }
            }
        }
    }

    // Script starten
    log('Script gestartet');

    // Beim Laden der Seite
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', () => {
            setupSearchFormInterception();
            handlePage();
        });
    } else {
        setupSearchFormInterception();
        handlePage();
    }

    // Überwache URL-Änderungen (für SPA)
    let lastUrl = location.href;
    new MutationObserver(() => {
        const url = location.href;
        if (url !== lastUrl) {
            lastUrl = url;
            log('URL hat sich geändert zu: ' + url);
            handlePage();
        }
    }).observe(document, {subtree: true, childList: true});
})();