Pop up Ultima compra en colección - Bsale-IO/template-docs GitHub Wiki
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 }}
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 -->