Ozon Auto Sorter

Автоматически сортирует по "Новинкам" через URL и добавляет плавающую кнопку для включения/выключения.

// ==UserScript==
// @name         Ozon Auto Sorter
// @namespace    http://tampermonkey.net/
// @version      9.0
// @description  Автоматически сортирует по "Новинкам" через URL и добавляет плавающую кнопку для включения/выключения.
// @author       You
// @match        https://www.ozon.ru/*
// @grant        GM_addStyle
// @run-at       document-idle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- Управление состоянием (ВКЛ/ВЫКЛ) ---
    const STORAGE_KEY = 'ozonSorterIsEnabled';
    let isEnabled = localStorage.getItem(STORAGE_KEY) !== 'false'; // По умолчанию включено

    // --- Создание плавающей кнопки ---
    let toggleButton = document.createElement('button');
    toggleButton.id = 'ozon-sorter-toggle';
    document.body.appendChild(toggleButton);

    function updateButtonState() {
        if (isEnabled) {
            toggleButton.textContent = 'Автосортировка: ВКЛ';
            toggleButton.style.backgroundColor = '#4CAF50'; // Зеленый
            toggleButton.style.color = 'white';
        } else {
            toggleButton.textContent = 'Автосортировка: ВЫКЛ';
            toggleButton.style.backgroundColor = '#f44336'; // Красный
            toggleButton.style.color = 'white';
        }
    }

    // При клике на кнопку меняем состояние и сохраняем его
    toggleButton.addEventListener('click', () => {
        isEnabled = !isEnabled;
        localStorage.setItem(STORAGE_KEY, isEnabled);
        updateButtonState();
        console.log(`Ozon Sorter: Автосортировка теперь ${isEnabled ? 'ВКЛЮЧЕНА' : 'ВЫКЛЮЧЕНА'}.`);
    });

    // Стили для кнопки (можно менять по вкусу)
    GM_addStyle(`
        #ozon-sorter-toggle {
            position: fixed;
            bottom: 20px;
            right: 20px;
            z-index: 9999;
            border: none;
            outline: none;
            padding: 10px 15px;
            border-radius: 8px;
            cursor: pointer;
            font-size: 14px;
            font-family: sans-serif;
            box-shadow: 0 4px 8px rgba(0,0,0,0.2);
            transition: background-color 0.3s;
        }
    `);

    // --- Основная логика сортировки ---
    let lastCheckedUrl = '';

    const sortPageByUrl = () => {
        // Главный переключатель: если функция выключена, ничего не делаем
        if (!isEnabled) {
            return;
        }

        const currentUrl = window.location.href;
        if (currentUrl === lastCheckedUrl) return;
        lastCheckedUrl = currentUrl;

        try {
            const urlObject = new URL(currentUrl);
            const path = urlObject.pathname;
            const params = urlObject.searchParams;

            const isSortablePage = path.includes('/category/') || path.includes('/search/') || path.includes('/seller/');
            const isAlreadySorted = params.get('sorting') === 'new';

            if (isSortablePage && !isAlreadySorted) {
                console.log("Ozon Sorter: Сортировка включена и требуется. Перезагружаю страницу с параметром `sorting=new`.");
                params.set('sorting', 'new');
                window.location.search = params.toString();
            }

        } catch (e) {
            // Игнорируем ошибки для невалидных URL (например, 'about:blank')
        }
    };

    // --- Запуск и отслеживание ---

    // Устанавливаем начальное состояние кнопки
    updateButtonState();

    // Наблюдатель для отслеживания переходов внутри сайта
    const observer = new MutationObserver(() => sortPageByUrl());
    observer.observe(document.body, { childList: true, subtree: true });

    // Первоначальный запуск
    sortPageByUrl();
})();