Pop up Ultima compra en colección - Bsale-IO/template-docs GitHub Wiki

Componente por defecto en los templates

Código Componente Pop up Ultima compra
{% assign popup_delay = 3 %} <!-- Tiempo antes de mostrar el popup (segundos) -->
{% assign popup_interval = 13 %} <!-- Intervalo entre popups (segundos) -->
{% assign popup_duration = 7 %} <!-- Tiempo de visualización del popup (segundos) -->

<!-- Popup de última compra -->
<div id="popup">
    <a id="popup-link" href="#" style="text-decoration: none; color: inherit;">
        <div id="popup-product-image" class="default-image">
            <div id="popup-icon" style="display: none; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" width="100%" height="100%">
                    <rect x="4" y="4" width="16" height="16" rx="2" ry="2" fill="#ccc" />
                    <path d="M8 16l2-2 2 2 4-4 4 4" stroke="#999" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none" />
                </svg>
            </div>
            <img id="popup-img" src="" alt="Imagen del producto">
        </div>
        <div>
            <strong class="popup-recently-purchased">Se ha comprado recientemente</strong>
            <div id="popup-product-name-wrapper">
                <p id="popup-product-name"></p>
                <p class="popup-time">hace <span id="popup-time"></span></p>
            </div>
            <p id="popup-price"></p>
        </div>
        <div id="popup-arrow">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                <path 
                    d="M9 18l6-6-6-6" 
                    fill="none" 
                    stroke="white" 
                    stroke-width="2" 
                    stroke-linecap="round" 
                    stroke-linejoin="round"
                />
            </svg>
        </div>
    </a>
</div>
Código Javascript
// Convierte los valores de segundos a milisegundos para su uso en los tiempos del popup.
const popupDelay = {{ popup_delay }} * 1000; // Tiempo antes de mostrar el popup
const popupInterval = {{ popup_interval }} * 1000; // Intervalo entre popups
const popupDuration = {{ popup_duration }} * 1000; // Tiempo que el popup permanece visible

// Lista de productos obtenidos de la colección, generados dinámicamente
const products = [
    {% for product in collection %}
        {
            name: "{{ product.title | escape }}", // Nombre del producto
            image: "{{ product.default_image | image_url: 'S' }}", // Imagen del producto
            url: "{{ product.link }}", // Enlace al producto
            price: "{{ product.finalPrice | money_filter }}" // Precio formateado del producto
        }{% unless forloop.last %},{% endunless %}
    {% endfor %}
];

// Variables para controlar el tiempo y visibilidad
let popupTimer = null;
let popupIntervalTimer = null;
let lastPopupTime = 0;
let popupIsVisible = false;
let pageVisible = true;

// Detector de visibilidad de la página
document.addEventListener('visibilitychange', function() {
    if (document.hidden) {
        // La página no está visible
        pageVisible = false;
        clearTimeout(popupTimer);
        clearInterval(popupIntervalTimer);
    } else {
        // La página es visible de nuevo
        pageVisible = true;
        
        // Si han pasado más de popupInterval ms desde el último popup, muestra uno nuevo
        const timeElapsed = Date.now() - lastPopupTime;
        if (timeElapsed >= popupInterval) {
            showPopup();
        } else {
            // Programa el próximo popup basado en el tiempo transcurrido
            popupTimer = setTimeout(showPopup, popupInterval - timeElapsed);
        }
    }
});

// Función para obtener un tiempo aleatorio de compra reciente
function getRandomTime() {
    const times = [
        "4 minuto", "5 minutos", "7 minutos", "8 minutos", "9 minutos",
        "10 minutos", "12 minutos", "15 minutos", "20 minutos", "25 minutos",
        "30 minutos", "35 minutos", "40 minutos", "45 minutos", "50 minutos",
        "55 minutos", "1 hora", "1 hora 10 minutos", "1 hora 20 minutos", 
        "1 hora 30 minutos", "2 horas", "2 horas 30 minutos", "3 horas"
    ];
    return times[Math.floor(Math.random() * times.length)]; // Selecciona uno al azar
}

// Función para mostrar el popup de compra reciente
function showPopup() {
    // Si no hay productos en la lista, no hace nada
    if (products.length === 0) return;
    
    // Registra el tiempo de este popup
    lastPopupTime = Date.now();
    popupIsVisible = true;

    // Referencias a los elementos del popup
    const popup = document.getElementById("popup");
    const popupLink = document.getElementById("popup-link");
    const popupImage = document.getElementById("popup-img");
    const popupIcon = document.getElementById("popup-icon");

    // Un producto y un tiempo de compra aleatorio
    const randomProduct = products[Math.floor(Math.random() * products.length)];
    const randomTime = getRandomTime();

    // Actualiza los textos del popup con la información seleccionada
    document.getElementById("popup-product-name").textContent = randomProduct.name;
    document.getElementById("popup-time").textContent = randomTime;
    document.getElementById("popup-price").textContent = "Precio: " + randomProduct.price;

    // Asigna el enlace al producto
    popupLink.href = randomProduct.url;

    // Muestra la imagen si existe, de lo contrario, muestra el icono por defecto en svg
    if (randomProduct.image) {
        popupImage.src = randomProduct.image;
        popupImage.style.display = "block";
        popupIcon.style.display = "none";
    } else {
        popupImage.style.display = "none";
        popupIcon.style.display = "block";
    }

    // Muestra el popup con animación de entrada
    popup.style.display = "block";
    popup.style.animation = "fadeIn 1s ease-in-out";
    popup.style.opacity = "1";

    // Oculta el popup después de popupDuration milisegundos
    clearTimeout(popupTimer);
    popupTimer = setTimeout(() => {
        popup.style.animation = "fadeOut 0.5s ease-in-out"; // Aplica animación de salida
        popup.addEventListener("animationend", function handleFadeOut() {
            popup.style.display = "none"; // Oculta el popup
            popup.style.animation = ""; // Resetea la animación
            popup.removeEventListener("animationend", handleFadeOut); // Elimina el listener
            popupIsVisible = false;
        });
        
        // Programa el próximo popup solo si la página está visible
        if (pageVisible) {
            clearTimeout(popupIntervalTimer);
            popupIntervalTimer = setTimeout(showPopup, popupInterval);
        }
    }, popupDuration);
}

    // Inicialización - Muestra el primer popup después del tiempo de espera inicial
    popupTimer = setTimeout(() => {
    showPopup();
    
    // Después del primer popup, establece el intervalo regular
    popupIntervalTimer = setInterval(() => {
        if (pageVisible && !popupIsVisible) {
            showPopup();
        }
    }, popupInterval);
}, popupDelay);
Código CSS Modal Inicio suscripción
#popup {
    position: fixed;
    bottom: 40px; 
    left: 20px;
    background-color: var(--popup-bg-color);
    color: white;
    padding: 12px;
    border-radius: 8px;
    display: none;
    z-index: 1000;
    width: auto;
    max-width: 340px;
    animation: fadeIn 1s ease-in-out;
    font-size: var(--popup-message-size);
}

#popup:hover {
    background-color: rgba(0, 0, 0, 0.85);
    transform: scale(1.05);
    transition: all 0.3s ease-in-out;
}

#popup-link {
    display: flex;
    align-items: center;
    position: relative;
    padding-right: 40px;
}

#popup-product-image {
    background-color: white;
    width: 60px; /* Imagen más grande en escritorio */
    height: 60px; 
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 5px;
    margin-right: 12px;
    color: #333;
    flex-shrink: 0;
}

.popup-recently-purchased {
    color: var(--popup-text-color);
    font-size: var(--popup-message-size);
}

#popup-icon {
    font-size: calc(var(--popup-message-size) + 10px);
}

#popup-img {
    display: none;
    width: 100%;
    height: 100%;
    object-fit: cover;
    border-radius: 5px;
}

#popup-arrow {
    position: absolute;
    right: 10px;
    top: 50%;
    transform: translateY(-50%);
    width: 24px;
    height: 24px;
    opacity: 0.7;
}

#popup:hover #popup-arrow {
    opacity: 1;
}

@keyframes fadeIn {
    0% { opacity: 0; }
    100% { opacity: 1; }
}

@keyframes fadeOut {
    0% { opacity: 1; }
    100% { opacity: 0; }
}

#popup-product-name-wrapper {
    max-width: 200px;
}

#popup-product-name {
    color: var(--popup-text-color);
    font-size: var(--popup-product-name-size);
    white-space: nowrap; 
    overflow: hidden;
    text-overflow: ellipsis;
    margin: 0;
}

.popup-time {
    color: var(--popup-text-color);
    margin: 0;
    font-size: var(--popup-time-size);
}

#popup-price {
    color: var(--popup-text-price-color);
    font-size: var(--popup-price-size);
}

/* Estilos para versión móvil */
@media (max-width: 600px) {
    :root {
        --popup-message-size: 12px;
        --popup-product-name-size: 12px;
        --popup-time-size: 10px;
        --popup-price-size: 12px;
    }

    #popup {
        left: 10px;
        right: 10px;
        max-width: 260px;
        padding: 8px;
        bottom: 50px; /* Mantiene un margen en móviles */
        font-size: var(--popup-message-size);
    }

    #popup-product-image {
        width: 40px; /* Imagen más pequeña en móvil */
        height: 40px;
        min-width: 40px;
    }

    #popup-icon {
        font-size: calc(var(--popup-message-size) + 8px);
    }

    #popup-arrow {
        width: 20px;
        height: 20px;
        right: 8px;
    }
    
    #popup-link {
        padding-right: 35px;
    }

    .popup-recently-purchased {
        font-size: var(--popup-message-size);
    }
}
Código CSS en hoja de variables
       /********************************************************************
    Pop Up Ultima Compra
    *********************************************************************/ 
  --popup-bg-color: rgba(0, 0, 0, 0.7);
    --popup-text-color: white;
    --popup-text-price-color: white;
    --popup-font-family: var(--font-body-family);
    --popup-message-size: 14px;
    --popup-product-name-size: 14px;
    --popup-time-size: 12px;
    --popup-price-size: 14px;

Note

1.- el {{'Pop up ultima compra' | get_component }} se llama el final del componente Colección

{{'Pop up ultima compra' | get_component }}

Instrucciones de su configuración

EL principio del componente tiene sus variables de configuración la cual son las siguientes:

{% assign popup_delay = 3 %} <!-- Tiempo antes de mostrar el popup (segundos) -->
{% assign popup_interval = 13 %} <!-- Intervalo entre popups (segundos) -->
{% assign popup_duration = 7 %} <!-- Tiempo de visualización del popup (segundos) -->

Important

1.- La configuración del pop up se activa en la variable de configuración del componente Colección

{% assign popup_ultima_compra = false %} <!-- activa o desactiva el popup en la colección -->
⚠️ **GitHub.com Fallback** ⚠️