You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

177 lines
5.6 KiB

document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.reviews-block').forEach(function(block) {
const blockId = block.getAttribute('data-reviews-id');
initReviewsBlock(blockId);
});
});
function initReviewsBlock(blockId) {
const container = document.getElementById(blockId);
if (!container) return;
const swipers = {};
let lightbox;
function initAllSwipers() {
container.querySelectorAll('.reviews-swiper').forEach(swiperEl => {
const tabId = swiperEl.id.replace('swiper-', '');
swipers[tabId] = new Swiper(`#${blockId} #swiper-${tabId}`, {
slidesPerView: 'auto',
spaceBetween: 24,
grabCursor: true,
watchSlidesProgress: true,
scrollbar: {
el: `#${blockId} #swiper-${tabId} .swiper-scrollbar`,
draggable: true,
},
});
});
}
function initLightbox(tabId) {
const currentSelector = `#${blockId} #tab-${tabId} .glightbox`;
if (lightbox?.settings?.selector !== currentSelector) {
if (lightbox) {
lightbox.destroy();
}
const isVideo = tabId === 'video';
lightbox = GLightbox({
selector: currentSelector,
touchNavigation: true,
loop: true,
autoplayVideos: false,
videosWidth: isVideo ? '90vw' : 'auto',
videosHeight: isVideo ? '80vh' : 'auto',
plyr: isVideo ? {
css: 'https://cdn.plyr.io/3.7.8/plyr.css',
js: 'https://cdn.plyr.io/3.7.8/plyr.js',
config: {
ratio: '16:9',
fullscreen: { enabled: true, fallback: true, iosNative: true },
controls: [
'play-large',
'play',
'progress',
'current-time',
'duration',
'mute',
'volume',
'fullscreen'
]
}
} : undefined,
});
}
}
function toggleRatingSection(show) {
const ratingSection = container.querySelector('.rating-section');
if (ratingSection) {
if (show) {
ratingSection.classList.remove('hidden');
ratingSection.classList.add('flex');
} else {
ratingSection.classList.remove('flex');
ratingSection.classList.add('hidden');
}
}
}
function updateRatingAndStars(rating, stars) {
if (stars) {
const starsElement = container.querySelector('[data-reviews="stars"]');
if (starsElement) {
const starCount = parseInt(stars);
const lastDigit = starCount % 10;
const lastTwoDigits = starCount % 100;
let ending;
if (lastTwoDigits >= 11 && lastTwoDigits <= 19) {
ending = ' оценок';
} else if (lastDigit == 1) {
ending = ' оценка';
} else if (lastDigit >= 2 && lastDigit <= 4) {
ending = ' оценки';
} else {
ending = ' оценок';
}
starsElement.textContent = starCount + ending;
}
}
}
function debounce(func, wait) {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
initAllSwipers();
const activeTab = container.querySelector('.tab-button.active');
if (activeTab) {
const tabId = activeTab.getAttribute('data-tab');
initLightbox(tabId);
}
container.querySelectorAll('.tab-button').forEach(button => {
button.addEventListener('click', debounce(() => {
const tabId = button.getAttribute('data-tab');
const rating = button.getAttribute('data-rating');
const stars = button.getAttribute('data-stars');
const isVideoTab = tabId === 'video';
container.querySelectorAll('.tab-button').forEach(btn => {
btn.classList.remove('active');
});
button.classList.add('active');
toggleRatingSection(!isVideoTab);
if (!isVideoTab) {
updateRatingAndStars(rating, stars);
}
container.querySelectorAll('.tab-content').forEach(content => {
content.classList.remove('block');
content.classList.add('hidden');
});
const targetTab = container.querySelector(`#tab-${tabId}`);
targetTab.classList.remove('hidden');
targetTab.classList.add('block');
initLightbox(tabId);
if (!isVideoTab && swipers[tabId]) {
requestAnimationFrame(() => {
swipers[tabId].update();
});
}
}, 100));
});
window.addEventListener('beforeunload', () => {
Object.values(swipers).forEach(swiper => swiper?.destroy());
if (lightbox) lightbox.destroy();
});
}