Greasy Fork is available in English.

Tavriav Lazy Load Scroll Catalog

Lazy load two subsequent pages on Tavriav's catalog pages with 1-second delay, display current page number, and show distance from the bottom

// ==UserScript==
// @name         Tavriav Lazy Load Scroll Catalog
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Lazy load two subsequent pages on Tavriav's catalog pages with 1-second delay, display current page number, and show distance from the bottom
// @author       You
// @match        https://www.tavriav.ua/catalog/*/
// @match        https://www.tavriav.ua/catalog/*/?*
// @match        https://www.tavriav.ua/subcatalog/*
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const urlParams = new URLSearchParams(window.location.search);
    let currentPage = urlParams.has('page') ? parseInt(urlParams.get('page'), 10) : 1;
    const distanceFromBottom = 4000;
    let loading = false;
    let pagesToLoad = 3;

    // Create and style the display divs
    GM_addStyle(`
        #displayDiv {
            position: fixed;
            top: 10px;
            left: 10px;
            background: rgba(0,0,0,0.7);
            color: #fff;
            padding: 5px 10px;
            border-radius: 5px;
            font-size: 14px;
            z-index: 1000;
        }
    `);

    const pageNumberDisplay = document.createElement('div');
    pageNumberDisplay.id = "displayDiv";
    document.body.appendChild(pageNumberDisplay);

    window.addEventListener('scroll', () => {
        const distance = document.body.offsetHeight - (window.innerHeight + window.scrollY);
        pageNumberDisplay.innerHTML = `Page: ${currentPage}<br>Distance from bottom: ${Math.round(distance)}px`;

        if (!loading && distance <= distanceFromBottom) {
            currentPage++;
            loadMultiplePages(currentPage, pagesToLoad);
        }
    });

    function appendContent(text) {
        const parser = new DOMParser();
        const doc = parser.parseFromString(text, 'text/html');
        const newContent = doc.querySelector('.catalog-products__container');

        if (newContent) {
            document.querySelector('.catalog-products__container').appendChild(newContent);
        }
    }

    function fetchPage(pageNum) {
        const currentURL = new URL(window.location.href);
        const params = currentURL.searchParams;
        params.set('page', pageNum);

        return fetch(`${currentURL.origin}${currentURL.pathname}?${params.toString()}`)
            .then(response => response.text());
    }

    function loadMultiplePages(startPage, count) {
        if (count === 0) {
            loading = false;
            return;
        }

        loading = true;
        fetchPage(startPage).then(text => {
            appendContent(text);
            setTimeout(() => {
                loadMultiplePages(startPage + 1, count - 1);
            }, 1000); // 1-second delay before fetching the next page
        });
    }

    loadMultiplePages(currentPage + 1, pagesToLoad); // Start fetching the next two pages immediately
})();